From 2b85b956c904b8a911e1a3e49f4d5533163e896c Mon Sep 17 00:00:00 2001 From: Ivan Femia Date: Tue, 14 Sep 2010 08:05:50 +0000 Subject: [PATCH] git-svn-id: https://subversion.assembla.com/svn/abap2xlsx/trunk@3 b7d68dce-7c3c-4a99-8ce0-9ea847f5d049 --- ZA2X/CLAS/ZCL_EXCEL.slnk | 219 + ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk | 185 + ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk | 56 + ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk | 91 + ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk | 146 + ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk | 109 + ZA2X/CLAS/ZCL_EXCEL_PROPERTIES.slnk | 73 + ZA2X/CLAS/ZCL_EXCEL_RANGE.slnk | 86 + ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk | 101 + ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 421 + ZA2X/CLAS/ZCL_EXCEL_SECURITY.slnk | 56 + ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk | 176 + ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk | 71 + ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk | 129 + ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk | 102 + ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk | 87 + ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk | 65 + ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDERS.slnk | 97 + ZA2X/CLAS/ZCL_EXCEL_STYLE_COLOR.slnk | 78 + ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk | 167 + ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk | 96 + ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk | 92 + ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk | 111 + ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk | 44 + ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk | 244 + ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 873 + ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk | 121 + ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk | 240 + ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_ROWDIMENSI.slnk | 179 + ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 3147 ++++ ZA2X/CLAS/ZCX_EXCEL.slnk | 59 + ZA2X/DOMA/ZEXCEL_FORMAT.slnk | 5 + ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk | 4 + ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk | 4 + ZA2X/DTEL/ZEXCEL_APPLICATION.slnk | 4 + ZA2X/DTEL/ZEXCEL_APPVERSION.slnk | 4 + ZA2X/DTEL/ZEXCEL_BORDER.slnk | 4 + ZA2X/DTEL/ZEXCEL_BREAK.slnk | 4 + ZA2X/DTEL/ZEXCEL_CATEGORY.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk | 4 + ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk | 4 + ZA2X/DTEL/ZEXCEL_COLOR.slnk | 4 + ZA2X/DTEL/ZEXCEL_COMPANY.slnk | 4 + ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk | 4 + ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk | 4 + ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk | 4 + ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk | 4 + ZA2X/DTEL/ZEXCEL_CREATOR.slnk | 4 + ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk | 4 + ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk | 4 + ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk | 4 + ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk | 4 + ZA2X/DTEL/ZEXCEL_FILL.slnk | 4 + ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk | 4 + ZA2X/DTEL/ZEXCEL_FONT.slnk | 4 + ZA2X/DTEL/ZEXCEL_FORMAT.slnk | 4 + ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk | 4 + ZA2X/DTEL/ZEXCEL_INDENT.slnk | 4 + ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk | 4 + ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk | 4 + ZA2X/DTEL/ZEXCEL_PROTECTION.slnk | 4 + ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk | 4 + ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk | 4 + ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk | 4 + ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk | 4 + ZA2X/DTEL/ZEXCEL_ROTATION.slnk | 4 + ZA2X/DTEL/ZEXCEL_SCALECROP.slnk | 4 + ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk | 4 + ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk | 4 + ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk | 4 + ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk | 4 + ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk | 4 + ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk | 4 + ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk | 4 + ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk | 4 + ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk | 4 + ZA2X/DTEL/ZEXCEL_SUBJECT.slnk | 4 + ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk | 4 + ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk | 4 + ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk | 4 + ZA2X/DTEL/ZEXCEL_TITLE.slnk | 4 + ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk | 4 + ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk | 4 + ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk | 4 + ZA2X/INTF/ZIF_EXCEL_READER.slnk | 17 + ZA2X/INTF/ZIF_EXCEL_WRITER.slnk | 7 + ZA2X/PROG/ZAKE_SVN_A2X.slnk | 132 + ZA2X/PROG/ZDEMO_EXCEL.slnk | 34 + ZA2X/PROG/ZDEMO_EXCEL1.slnk | 56 + ZA2X/PROG/ZDEMO_EXCEL10.slnk | 102 + ZA2X/PROG/ZDEMO_EXCEL11.slnk | 458 + ZA2X/PROG/ZDEMO_EXCEL12.slnk | 95 + ZA2X/PROG/ZDEMO_EXCEL13.slnk | 77 + ZA2X/PROG/ZDEMO_EXCEL14.slnk | 168 + ZA2X/PROG/ZDEMO_EXCEL15.slnk | 50 + ZA2X/PROG/ZDEMO_EXCEL2.slnk | 117 + ZA2X/PROG/ZDEMO_EXCEL3.slnk | 64 + ZA2X/PROG/ZDEMO_EXCEL4.slnk | 58 + ZA2X/PROG/ZDEMO_EXCEL5.slnk | 66 + ZA2X/PROG/ZDEMO_EXCEL6.slnk | 56 + ZA2X/PROG/ZDEMO_EXCEL7.slnk | 321 + ZA2X/PROG/ZDEMO_EXCEL8.slnk | 66 + ZA2X/PROG/ZDEMO_EXCEL9.slnk | 73 + ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk | 15 + ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk | 11 + ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk | 13 + ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk | 186 + ZA2X/TABL/ZEXCEL_S_SHARED_STRING.slnk | 6 + ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk | 6 + ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk | 10 + ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk | 14 + ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk | 8 + ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk.old | 8 + ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk | 14 + ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk | 5 + ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk | 9 + ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk | 6 + ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk | 6 + ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk | 14 + ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk | 5 + ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk | 9 + ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk | 13 + ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk | 7 + ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk | 13 + ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk | 4 + ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk | 2 + ZA2X/licence.txt | 20 + ZA2X/readme.txt | 1 + bin/svn-script.cmd | 5 + bin/tortoise-svn-script.cmd | 5 + build/ABAP2XLSX_V_2_0.zip | Bin 0 -> 572480 bytes build/ABAP2XLSX_daily.nugg.zip | Bin 0 -> 576206 bytes build/NUGG_ABAP2XLSX_V_1_0.nugg | 15306 ++++++++++++++++ build/NUGG_ABAP2XLSX_V_1_1.nugg | 8789 +++++++++ build/NUGG_ABAP2XLSX_V_1_1.nugg.zip | Bin 0 -> 54908 bytes nuggs/ABAP2XLSX_V_2_0.zip | Bin 0 -> 570430 bytes nuggs/NUGG_ABAP2XLSX_V_1_0.nugg | 875 + nuggs/NUGG_ABAP2XLSX_V_1_0.nugg.zip | Bin 0 -> 8393 bytes nuggs/NUGG_ABAP2XLSX_V_1_1.nugg | 8789 +++++++++ nuggs/NUGG_ABAP2XLSX_V_1_1.nugg.zip | Bin 0 -> 53352 bytes nuggs/NUGG_ABAP2XLSX_V_2_1.nugg | 4964 +++++ nuggs/NUGG_ABAP2XLSX_V_2_1.nugg.zip | Bin 0 -> 30742 bytes nuggs/NUGG_ABAP2XLSX_V_3_0.nugg | 3559 ++++ nuggs/NUGG_ABAP2XLSX_V_3_0.nugg.zip | Bin 0 -> 25444 bytes .../Binaries/OpenXMLValidator.exe | Bin 0 -> 10240 bytes .../Binaries/OpenXMLValidator.exe.config | 3 + .../Binaries/OpenXMLValidator.pdb | Bin 0 -> 17920 bytes test/OpenXMLValidator/src/CommandLineArgs.cs | 77 + .../src/OpenXMLValidator.csproj | 74 + test/OpenXMLValidator/src/Program.cs | 101 + .../src/Properties/AssemblyInfo.cs | 36 + .../src/Resources.Designer.cs | 89 + test/OpenXMLValidator/src/Resources.resx | 124 + test/OpenXMLValidator/src/Resources/usage.txt | 18 + test/OpenXMLValidator/src/app.config | 3 + test/OpenXMLValidator/src/readme.txt | 2 + 167 files changed, 53209 insertions(+) create mode 100644 ZA2X/CLAS/ZCL_EXCEL.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_PROPERTIES.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_RANGE.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_SECURITY.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDERS.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_COLOR.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_ROWDIMENSI.slnk create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk create mode 100644 ZA2X/CLAS/ZCX_EXCEL.slnk create mode 100644 ZA2X/DOMA/ZEXCEL_FORMAT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_APPLICATION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_APPVERSION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_BORDER.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_BREAK.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CATEGORY.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_COLOR.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_COMPANY.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_CREATOR.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_FILL.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_FONT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_FORMAT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_INDENT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_PROTECTION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_ROTATION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_SCALECROP.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_SUBJECT.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_TITLE.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk create mode 100644 ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk create mode 100644 ZA2X/INTF/ZIF_EXCEL_READER.slnk create mode 100644 ZA2X/INTF/ZIF_EXCEL_WRITER.slnk create mode 100644 ZA2X/PROG/ZAKE_SVN_A2X.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL1.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL10.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL11.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL12.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL13.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL14.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL15.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL2.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL3.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL4.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL5.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL6.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL7.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL8.slnk create mode 100644 ZA2X/PROG/ZDEMO_EXCEL9.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_SHARED_STRING.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk.old create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk create mode 100644 ZA2X/licence.txt create mode 100644 ZA2X/readme.txt create mode 100644 bin/svn-script.cmd create mode 100644 bin/tortoise-svn-script.cmd create mode 100644 build/ABAP2XLSX_V_2_0.zip create mode 100644 build/ABAP2XLSX_daily.nugg.zip create mode 100644 build/NUGG_ABAP2XLSX_V_1_0.nugg create mode 100644 build/NUGG_ABAP2XLSX_V_1_1.nugg create mode 100644 build/NUGG_ABAP2XLSX_V_1_1.nugg.zip create mode 100644 nuggs/ABAP2XLSX_V_2_0.zip create mode 100644 nuggs/NUGG_ABAP2XLSX_V_1_0.nugg create mode 100644 nuggs/NUGG_ABAP2XLSX_V_1_0.nugg.zip create mode 100644 nuggs/NUGG_ABAP2XLSX_V_1_1.nugg create mode 100644 nuggs/NUGG_ABAP2XLSX_V_1_1.nugg.zip create mode 100644 nuggs/NUGG_ABAP2XLSX_V_2_1.nugg create mode 100644 nuggs/NUGG_ABAP2XLSX_V_2_1.nugg.zip create mode 100644 nuggs/NUGG_ABAP2XLSX_V_3_0.nugg create mode 100644 nuggs/NUGG_ABAP2XLSX_V_3_0.nugg.zip create mode 100644 test/OpenXMLValidator/Binaries/OpenXMLValidator.exe create mode 100644 test/OpenXMLValidator/Binaries/OpenXMLValidator.exe.config create mode 100644 test/OpenXMLValidator/Binaries/OpenXMLValidator.pdb create mode 100644 test/OpenXMLValidator/src/CommandLineArgs.cs create mode 100644 test/OpenXMLValidator/src/OpenXMLValidator.csproj create mode 100644 test/OpenXMLValidator/src/Program.cs create mode 100644 test/OpenXMLValidator/src/Properties/AssemblyInfo.cs create mode 100644 test/OpenXMLValidator/src/Resources.Designer.cs create mode 100644 test/OpenXMLValidator/src/Resources.resx create mode 100644 test/OpenXMLValidator/src/Resources/usage.txt create mode 100644 test/OpenXMLValidator/src/app.config create mode 100644 test/OpenXMLValidator/src/readme.txt diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk new file mode 100644 index 0000000..65e8c31 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -0,0 +1,219 @@ + + + class ZCL_EXCEL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL +*"* do not include other source files here!!! +public section. + + data PROPERTIES type ref to ZCL_EXCEL_PROPERTIES . + data SECURITY type ref to ZCL_EXCEL_SECURITY . + + methods ADD_NEW_DRAWING + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods ADD_NEW_RANGE + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods ADD_NEW_STYLE + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods ADD_NEW_WORKSHEET + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods CONSTRUCTOR . + methods GET_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_RANGES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_NAME + returning + value(EP_NAME) type ZEXCEL_WORKSHEETS_NAME . + methods GET_WORKSHEETS_SIZE + returning + value(EP_SIZE) type I . + methods GET_NEXT_TABLE_ID + returning + value(EP_ID) type I . + *"* protected components of class ZCL_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . + data RANGES type ref to ZCL_EXCEL_RANGES . + data STYLES type ref to ZCL_EXCEL_STYLES . + data WORKSHEETS type ref to ZCL_EXCEL_WORKSHEETS . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + method ADD_NEW_DRAWING. + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_title = ip_title. + drawings->add( eo_drawing ). +endmethod. + + + + method ADD_NEW_RANGE. +* Create default blank range + CREATE OBJECT eo_range. + ranges->add( eo_range ). +endmethod. + + + + method ADD_NEW_STYLE. +* Create default style + CREATE OBJECT eo_style. + styles->add( eo_style ). + +endmethod. + + + + + method ADD_NEW_WORKSHEET. + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_excel = me + ip_title = ip_title. + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). +endmethod. + + + method CONSTRUCTOR. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT properties. + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings. + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. +endmethod. + + + + method GET_ACTIVE_WORKSHEET. + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + +endmethod. + + + + method GET_DRAWINGS_ITERATOR. + + eo_iterator = me->drawings->get_iterator( ). + +endmethod. + + + + method GET_NEXT_TABLE_ID. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_tables_count TYPE i. + + lo_iterator = me->get_worksheets_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->get_next( ). + + lv_tables_count = lo_worksheet->get_tables_size( ). + ADD lv_tables_count TO ep_id. + + ENDWHILE. + + ADD 1 TO ep_id. + +endmethod. + + + + method GET_RANGES_ITERATOR. + + eo_iterator = me->ranges->get_iterator( ). + +endmethod. + + + + method GET_STYLES_ITERATOR. + + eo_iterator = me->styles->get_iterator( ). + +endmethod. + + + + method GET_WORKSHEETS_ITERATOR. + + eo_iterator = me->worksheets->get_iterator( ). + +endmethod. + + + + method GET_WORKSHEETS_NAME. + + ep_name = me->worksheets->name. + +endmethod. + + + + method GET_WORKSHEETS_SIZE. + + ep_size = me->worksheets->size( ). + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk new file mode 100644 index 0000000..cd598a1 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk @@ -0,0 +1,185 @@ + + + class ZCL_EXCEL_COMMON definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +public section. + + class-data C_EXCEL_NUMFMT_OFFSET type INT1 value 164. "#EC NOTEXT . + + class-methods GET_FIELDCATALOG + importing + !IP_TABLE type STANDARD TABLE + returning + value(EP_FIELDCATALOG) type ZEXCEL_T_FIELDCATALOG . + class-methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + class-methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + class-methods NUMBER_TO_EXCEL_STRING + importing + value(IP_VALUE) type NUMERIC + returning + value(EP_VALUE) type ZEXCEL_CELL_VALUE . + class-methods DATE_TO_EXCEL_STRING + importing + !IP_VALUE type D + returning + value(EP_VALUE) type ZEXCEL_CELL_VALUE . + class-methods TIME_TO_EXCEL_STRING + importing + !IP_VALUE type T + returning + value(EP_VALUE) type ZEXCEL_CELL_VALUE . + *"* protected components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +private section. + + class-data C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method CONVERT_COLUMN2ALPHA. + + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +endmethod. + + + + + method CONVERT_COLUMN2INT. + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( zcl_excel_common=>c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( zcl_excel_common=>c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - zcl_excel_common=>c_excel_col_module. + ENDIF. + +endmethod. + + + + + method GET_FIELDCATALOG. + + DATA: lr_data TYPE REF TO data, + lo_tabdescr TYPE REF TO cl_abap_structdescr, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + ls_dfies TYPE dfies, + ls_fieldcatalog TYPE zexcel_s_fieldcatalog. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + + LOOP AT lt_dfies INTO ls_dfies. + MOVE-CORRESPONDING ls_dfies TO ls_fieldcatalog. + APPEND ls_fieldcatalog TO ep_fieldcatalog. + ENDLOOP. + +endmethod. + + + + + METHOD date_to_excel_string. + DATA: lv_date_diff TYPE i, + lc_date_baseline TYPE d VALUE '19000101'. + + lv_date_diff = ip_value - lc_date_baseline + 2. + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_date_diff ). +ENDMETHOD. + + + + + METHOD number_to_excel_string. + DATA: lv_value_c TYPE c LENGTH 100. + + WRITE ip_value TO lv_value_c EXPONENT 0 NO-GROUPING NO-SIGN. + REPLACE ALL OCCURRENCES OF ',' IN lv_value_c WITH '.'. + + ep_value = lv_value_c. + CONDENSE ep_value. + + IF ip_value < 0. + CONCATENATE '-' ep_value INTO ep_value. + ENDIF. +ENDMETHOD. + + + + + METHOD time_to_excel_string. + DATA: lv_seconds_in_day TYPE i, + lv_day_fraction TYPE f, + lc_time_baseline TYPE t VALUE '000000', + lc_seconds_in_day TYPE i VALUE 86400. + + lv_seconds_in_day = ip_value - lc_time_baseline. + lv_day_fraction = lv_seconds_in_day / lc_seconds_in_day. + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_day_fraction ). +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk new file mode 100644 index 0000000..637733a --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk @@ -0,0 +1,56 @@ + + + class ZCL_EXCEL_DATA_VALIDATION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data ALLOWBLANK type FLAG value 'X'. "#EC NOTEXT . + data CELL_ROW type ZEXCEL_CELL_ROW . + class-data C_TYPE_LIST type ZEXCEL_DATA_VAL_TYPE value 'list'. "#EC NOTEXT . + data SHOWERRORMESSAGE type FLAG value 'X'. "#EC NOTEXT . + data SHOWINPUTMESSAGE type FLAG value 'X'. "#EC NOTEXT . + data TYPE type ZEXCEL_DATA_VAL_TYPE . + data VALUE type ZEXCEL_VALIDATION_FORMULA1 . + data CELL_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + + methods CONSTRUCTOR . + *"* protected components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + method CONSTRUCTOR. + + type = me->c_type_list. +* inizialize dimension range + cell_row = 1. + cell_column = 'A'. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk new file mode 100644 index 0000000..8d2d302 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk @@ -0,0 +1,91 @@ + + + class ZCL_EXCEL_DATA_VALIDATIONS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + methods ADD + importing + !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . + methods CLEAR . + methods CONSTRUCTOR . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +private section. + + data DATA_VALIDATIONS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + method ADD. + data_validations->add( ip_data_validation ). +endmethod. + + + method CLEAR. + data_validations->clear( ). +endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT data_validations. + +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= data_validations->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = data_validations->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + data_validations->remove( ip_data_validation ). +endmethod. + + + + method SIZE. + ep_size = data_validations->if_object_collection~size( ). +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk new file mode 100644 index 0000000..d79f133 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk @@ -0,0 +1,146 @@ + + + class ZCL_EXCEL_DRAWING definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + data X_REFERENCES type CHAR1 . + data Y_REFERENCES type CHAR1 . + data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + *"* protected components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +private section. + + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + + methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + method CONSTRUCTOR. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +endmethod. + + + + + method CONVERT_COLUMN2ALPHA. + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +endmethod. + + + + + method CONVERT_COLUMN2INT. + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( me->c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( me->c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - me->c_excel_col_module. + ENDIF. + +endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk new file mode 100644 index 0000000..ad3adfb --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk @@ -0,0 +1,109 @@ + + + class ZCL_EXCEL_DRAWINGS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + + drawings->add( ip_drawing ). +endmethod. + + + method CLEAR. + + drawings->clear( ). +endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT drawings. + +endmethod. + + + + + method GET. + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_drawing ?= drawings->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. + + eo_iterator ?= drawings->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + + is_empty = drawings->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + + drawings->remove( ip_drawing ). +endmethod. + + + + method SIZE. + + ep_size = drawings->if_object_collection~size( ). +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_PROPERTIES.slnk b/ZA2X/CLAS/ZCL_EXCEL_PROPERTIES.slnk new file mode 100644 index 0000000..906064e --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_PROPERTIES.slnk @@ -0,0 +1,73 @@ + + + class ZCL_EXCEL_PROPERTIES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +public section. + + data CREATOR type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data LASTMODIFIEDBY type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data CREATED type TIMESTAMPL . + data MODIFIED type TIMESTAMPL . + data TITLE type ZEXCEL_TITLE value 'Untitled Spreadsheet'. "#EC NOTEXT . + data SUBJECT type ZEXCEL_SUBJECT . + data DESCRIPTION type ZEXCEL_DESCRIPTION . + data KEYWORDS type ZEXCEL_KEYWORDS . + data CATEGORY type ZEXCEL_CATEGORY . + data COMPANY type ZEXCEL_COMPANY value 'Microsoft Corporation'. "#EC NOTEXT . + data APPLICATION type ZEXCEL_APPLICATION value 'Microsoft Excel'. "#EC NOTEXT . + data DOCSECURITY type ZEXCEL_DOCSECURITY value '0'. "#EC NOTEXT . + data SCALECROP type ZEXCEL_SCALECROP value ''. "#EC NOTEXT . + data LINKSUPTODATE type FLAG . + data SHAREDDOC type FLAG . + data HYPERLINKSCHANGED type FLAG . + data APPVERSION type ZEXCEL_APPVERSION value '12.0000'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_PROPERTIES +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + + DATA: lv_timestamp TYPE timestampl. + + GET TIME STAMP FIELD lv_timestamp. + created = lv_timestamp. + modified = lv_timestamp. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_RANGE.slnk b/ZA2X/CLAS/ZCL_EXCEL_RANGE.slnk new file mode 100644 index 0000000..81aa6ee --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_RANGE.slnk @@ -0,0 +1,86 @@ + + + class ZCL_EXCEL_RANGE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +public section. + + data NAME type ZEXCEL_RANGE_NAME . + data GUID type ZEXCEL_RANGE_GUID . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_RANGE_GUID . + methods SET_VALUE + importing + !IP_SHEET_NAME type ZEXCEL_SHEET_TITLE + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + methods GET_VALUE + returning + value(EP_VALUE) type ZEXCEL_RANGE_VALUE . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +private section. + + data VALUE type ZEXCEL_RANGE_VALUE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method CONSTRUCTOR. +endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + method GET_VALUE. + + ep_value = me->value. + +endmethod. + + + + + + + + method SET_VALUE. + DATA: lv_start_row_c TYPE char7, + lv_stop_row_c TYPE char7. + lv_stop_row_c = ip_stop_row. + SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. + SHIFT lv_stop_row_c LEFT DELETING LEADING space. + lv_start_row_c = ip_start_row. + SHIFT lv_start_row_c RIGHT DELETING TRAILING space. + SHIFT lv_start_row_c LEFT DELETING LEADING space. + CONCATENATE ip_sheet_name '!$' ip_start_column '$' lv_start_row_c ':$' ip_stop_column '$' lv_stop_row_c INTO me->value. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk b/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk new file mode 100644 index 0000000..22707b7 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk @@ -0,0 +1,101 @@ + + + class ZCL_EXCEL_RANGES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_RANGES +*"* do not include other source files here!!! +private section. + + data RANGES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + ranges->add( ip_range ). +endmethod. + + + method CLEAR. + ranges->clear( ). +endmethod. + + + method CONSTRUCTOR. + + + CREATE OBJECT ranges. + +endmethod. + + + + + method GET. + eo_range ?= ranges->if_object_collection~get( ip_index ). +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= ranges->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = ranges->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + ranges->remove( ip_range ). +endmethod. + + + + method SIZE. + ep_size = ranges->if_object_collection~size( ). +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk new file mode 100644 index 0000000..8de21d6 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -0,0 +1,421 @@ + + + + class ZCL_EXCEL_READER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_READER_2007 +*"* do not include other source files here!!! +public section. + + interfaces ZIF_EXCEL_READER . + *"* protected components of class ZCL_EXCEL_READER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_READER_2007 +*"* do not include other source files here!!! +private section. + + data EXCEL2007 type XSTRING . + data ZIP type ref to CL_ABAP_ZIP . + + methods GET_FROM_ZIP_ARCHIVE + importing + !I_FILENAME type STRING + returning + value(R_CONTENT) type XSTRING + raising + ZCX_EXCEL . + methods GET_IXML_FROM_ZIP_ARCHIVE + importing + !I_FILENAME type STRING + returning + value(R_IXML) type ref to IF_IXML_DOCUMENT + raising + ZCX_EXCEL . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + + TYPES: + BEGIN OF t_splice_entry, + name TYPE string, + offset TYPE i, + length TYPE i, + compressed TYPE i, + END OF t_splice_entry. + TYPES: + t_splice_entries TYPE STANDARD TABLE OF t_splice_entry WITH DEFAULT KEY. + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + METHOD zif_excel_reader~load. + TYPES: + BEGIN OF t_worksheet, + id TYPE string, + target TYPE string, + END OF t_worksheet. + TYPES: t_worksheets TYPE TABLE OF t_worksheet. + + CONSTANTS: + lc_core_properties TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_office_document TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_shared_strings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + lc_worksheet TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_relationships TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. + + TYPE-POOLS: ixml. + + DATA: rels TYPE REF TO if_ixml_document, + rels_coll TYPE REF TO if_ixml_node_collection, + rels_coll_index TYPE i, + workbook_path TYPE string, + rels_workbook_path TYPE string, + rels_workbook TYPE REF TO if_ixml_document, + rels_wb_coll TYPE REF TO if_ixml_node_collection, + rels_wb_coll_index TYPE i, + shared_strings_path TYPE string, + shared_strings TYPE REF TO if_ixml_document, + shared_strings_coll TYPE REF TO if_ixml_node_collection, + shared_strings_coll_index TYPE i, + worksheets TYPE t_worksheets, + workbook TYPE REF TO if_ixml_document, + workbook_coll TYPE REF TO if_ixml_node_collection, + workbook_index TYPE i, + worksheet_path TYPE string, + worksheet TYPE REF TO if_ixml_document, + worksheet_coll TYPE REF TO if_ixml_node_collection, + worksheet_index TYPE i. + + FIELD-SYMBOLS: <worksheet> TYPE t_worksheet. + + DATA: node TYPE REF TO if_ixml_node, + value_node TYPE REF TO if_ixml_node, + si TYPE REF TO if_ixml_node_list, + row TYPE REF TO if_ixml_node_list, + row_iterator TYPE REF TO if_ixml_node_iterator, + col TYPE REF TO if_ixml_node, + attributes TYPE REF TO if_ixml_named_node_map, + attribute TYPE REF TO if_ixml_node, + col_attributes TYPE REF TO if_ixml_named_node_map, + attr_type TYPE string, + attr_target TYPE string, + attr_id TYPE string, + tag_name TYPE string, + r TYPE string, + r_width TYPE i, + cell_data_type TYPE string, + cell_column TYPE zexcel_cell_column_alpha, + cell_row TYPE zexcel_cell_row, + value TYPE string, + values TYPE stringtab, + value_index TYPE i, + cell_value TYPE zexcel_cell_value, + stripped_name TYPE chkfile, + dirname TYPE string. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + worksheet_title TYPE zexcel_sheet_title, + worksheet_id TYPE string. + + me->excel2007 = i_excel2007. + rels = me->get_ixml_from_zip_archive( '_rels/.rels' ). + + CREATE OBJECT r_excel. + + rels_coll = rels->get_elements_by_tag_name( name = 'Relationship' ). + rels_coll_index = 0. + WHILE rels_coll_index < rels_coll->get_length( ). + node = rels_coll->get_item( rels_coll_index ). + rels_coll_index = rels_coll_index + 1. + attributes ?= node->get_attributes( ). + attribute ?= attributes->get_named_item_ns( 'Type' ). + attr_type = attribute->get_value( ). + CASE attr_type. + WHEN lc_core_properties. + " TODO Map Document Properties to ZCL_EXCEL + WHEN lc_office_document. + attribute ?= attributes->get_named_item_ns( 'Target' ). + workbook_path = attribute->get_value( ). + + CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' + EXPORTING + full_name = workbook_path + IMPORTING + stripped_name = stripped_name + file_path = dirname. + " Read Workbook Relationships + CONCATENATE dirname '_rels/' stripped_name '.rels' + INTO rels_workbook_path. + rels_workbook = me->get_ixml_from_zip_archive( rels_workbook_path ). + rels_wb_coll = + rels_workbook->get_elements_by_tag_name( name = 'Relationship' ). + rels_wb_coll_index = 0. + WHILE rels_wb_coll_index < rels_wb_coll->get_length( ). + node = rels_wb_coll->get_item( rels_wb_coll_index ). + rels_wb_coll_index = rels_wb_coll_index + 1. + attributes ?= node->get_attributes( ). + attribute ?= attributes->get_named_item_ns( 'Type' ). + attr_type = attribute->get_value( ). + CASE attr_type. + WHEN lc_shared_strings. + " Read Shared Strings + attribute ?= attributes->get_named_item_ns( 'Target' ). + attr_target = attribute->get_value( ). + CONCATENATE dirname attr_target INTO shared_strings_path. + shared_strings = me->get_ixml_from_zip_archive( shared_strings_path ). + shared_strings_coll = + shared_strings->get_elements_by_tag_name( name = 'si' ). + shared_strings_coll_index = 0. + WHILE shared_strings_coll_index < shared_strings_coll->get_length( ). + node = shared_strings_coll->get_item( shared_strings_coll_index ). + shared_strings_coll_index = shared_strings_coll_index + 1. + si = node->get_children( ). + node = si->get_item( 0 ). + tag_name = node->get_name( ). + IF tag_name = 't'. + value = node->get_value( ). + APPEND value TO values. + ELSEIF tag_name = 'r'. + " TODO pharse Ritch text + ENDIF. + ENDWHILE. + WHEN lc_worksheet. + " Read worksheets + APPEND INITIAL LINE TO worksheets ASSIGNING <worksheet>. + attribute ?= attributes->get_named_item_ns( 'Id' ). + <worksheet>-id = attribute->get_value( ). + attribute ?= attributes->get_named_item_ns( 'Target' ). + <worksheet>-target = attribute->get_value( ). + " WRITE: / <worksheet>-id, ':', <worksheet>-target. + WHEN OTHERS. + ENDCASE. + ENDWHILE. + " Read Workbook + workbook = me->get_ixml_from_zip_archive( workbook_path ). + workbook_coll = workbook->get_elements_by_tag_name( name = 'sheet' ). + workbook_index = 0. + WHILE workbook_index < workbook_coll->get_length( ). + node = workbook_coll->get_item( workbook_index ). + workbook_index = workbook_index + 1. + attributes ?= node->get_attributes( ). + attribute ?= attributes->get_named_item_ns( 'name' ). + worksheet_title = attribute->get_value( ). + IF workbook_index > 1. + lo_worksheet = r_excel->add_new_worksheet( worksheet_title ). + ELSE. + lo_worksheet = r_excel->get_active_worksheet( ). + lo_worksheet->title = worksheet_title. + ENDIF. + attribute ?= attributes->get_named_item_ns( + name = 'id' + uri = lc_relationships + ). + worksheet_id = attribute->get_value( ). + READ TABLE worksheets ASSIGNING <worksheet> + WITH KEY id = worksheet_id. + " WRITE: / worksheet_id, worksheet_title, <worksheet>-target. + CONCATENATE dirname <worksheet>-target INTO worksheet_path. + worksheet = me->get_ixml_from_zip_archive( worksheet_path ). + worksheet_coll = worksheet->get_elements_by_tag_name( name = 'row' ). + worksheet_index = 0. + WHILE worksheet_index < worksheet_coll->get_length( ). + node = worksheet_coll->get_item( worksheet_index ). + worksheet_index = worksheet_index + 1. + row = node->get_children( ). + row_iterator = row->create_iterator( ). + col = row_iterator->get_next( ). + WHILE NOT col IS INITIAL. + col_attributes = col->get_attributes( ). + attribute ?= col_attributes->get_named_item_ns( 'r' ). + r = attribute->get_value( ). + CLEAR: cell_data_type, cell_value. + attribute ?= col_attributes->get_named_item_ns( 't' ). + IF attribute IS BOUND. + cell_data_type = attribute->get_value( ). + ENDIF. + " WRITE: / r, cell_data_type. + value_node = col->get_first_child( ). + CASE cell_data_type. + WHEN 's'. " String + value_index = value_node->get_value( ) + 1. + READ TABLE values INTO cell_value INDEX value_index. + WHEN 'b'. " Boolean + " TODO + WHEN 'inlineStr'. " inlineStr + " TODO + WHEN 'e'. " Error + " TODO + WHEN OTHERS. + IF value_node IS BOUND. + cell_value = value_node->get_value( ). + ENDIF. + ENDCASE. + IF NOT value IS INITIAL. + " WRITE: value. + " TODO: wite a robust method which splits r into + " cell_column and cell_row + cell_column = r(1). + r_width = STRLEN( r ). + r_width = r_width - 1. + cell_row = r+1(r_width). + " WRITE: cell_column, cell_row, cell_value. + lo_worksheet->set_cell( + EXPORTING + ip_column = cell_column " Cell Column + ip_row = cell_row " Cell Row + ip_value = cell_value " Cell Value + ). + ENDIF. + col = row_iterator->get_next( ). + ENDWHILE. + ENDWHILE. + ENDWHILE. + WHEN OTHERS. + ENDCASE. + ENDWHILE. + +ENDMETHOD. + + + method ZIF_EXCEL_READER~LOAD_FILE. + DATA: excel_data TYPE xstring. + DATA filelength TYPE i. + DATA bin_tab TYPE TABLE OF x255. + " Background processing + DATA bin_data LIKE LINE OF bin_tab. + DATA len TYPE i. + DATA alen TYPE i. + + IF sy-batch = abap_true. + DESCRIBE FIELD bin_data LENGTH len IN BYTE MODE. + OPEN DATASET i_filename FOR INPUT IN BINARY MODE. + WHILE sy-subrc = 0. + READ DATASET i_filename INTO bin_data MAXIMUM LENGTH len ACTUAL LENGTH alen. + APPEND bin_data TO bin_tab. + filelength = filelength + alen. + ENDWHILE. + CLOSE DATASET i_filename. + ELSE. + cl_gui_frontend_services=>gui_upload( + EXPORTING + filename = i_filename " Name of file + filetype = 'BIN' " File Type (ASCII, Binary) + IMPORTING + filelength = filelength + CHANGING + data_tab = bin_tab + EXCEPTIONS + file_open_error = 1 + file_read_error = 2 + no_batch = 3 + gui_refuse_filetransfer = 4 + invalid_type = 5 + no_authority = 6 + unknown_error = 7 + bad_data_format = 8 + header_not_allowed = 9 + separator_not_allowed = 10 + header_too_long = 11 + unknown_dp_error = 12 + access_denied = 13 + dp_out_of_memory = 14 + disk_full = 15 + dp_timeout = 16 + not_supported_by_gui = 17 + error_no_gui = 18 + OTHERS = 19 + ). + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'A problem occured when reading the file'. + ENDIF. + ENDIF. + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = filelength + IMPORTING + buffer = excel_data + TABLES + binary_tab = bin_tab. + r_excel = me->zif_excel_reader~load( excel_data ). +endmethod. + + + + + + method GET_FROM_ZIP_ARCHIVE. + + IF me->zip IS NOT BOUND. + CREATE OBJECT me->zip. + zip->load( + EXPORTING + zip = me->excel2007 + EXCEPTIONS + zip_parse_error = 1 + OTHERS = 2 + ). + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'ZIP parse error'. + ENDIF. + ENDIF. + + zip->get( + EXPORTING + name = i_filename + IMPORTING + content = r_content " Contents + EXCEPTIONS + zip_index_error = 1 + zip_decompression_error = 2 + OTHERS = 3 + ). + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'ZIP index or decompression error'. + ENDIF. + +endmethod. + + + + + + method GET_IXML_FROM_ZIP_ARCHIVE. + TYPE-POOLS: ixml. + + DATA: content TYPE xstring. + + DATA: ixml TYPE REF TO if_ixml, + streamfactory TYPE REF TO if_ixml_stream_factory, + istream TYPE REF TO if_ixml_istream, + parser TYPE REF TO if_ixml_parser. + + content = me->get_from_zip_archive( i_filename ). + ixml = cl_ixml=>create( ). + streamfactory = ixml->create_stream_factory( ). + istream = streamfactory->create_istream_xstring( content ). + r_ixml = ixml->create_document( ). + parser = ixml->create_parser( stream_factory = streamfactory + istream = istream + document = r_ixml ). + parser->set_normalizing( ). + parser->set_validating( mode = if_ixml_parser=>co_no_validation ). + parser->parse( ). + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_SECURITY.slnk b/ZA2X/CLAS/ZCL_EXCEL_SECURITY.slnk new file mode 100644 index 0000000..b02e187 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_SECURITY.slnk @@ -0,0 +1,56 @@ + + + class ZCL_EXCEL_SECURITY definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SECURITY +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data LOCKREVISION type FLAG . + data LOCKSTRUCTURE type FLAG . + data LOCKWINDOWS type FLAG . + data REVISIONSPASSWORD type ZEXCEL_REVISIONSPASSWORD . + data WORKBOOKPASSWORD type ZEXCEL_WORKBOOKPASSWORD . + + methods CONSTRUCTOR . + methods IS_SECURITY_ENABLED + returning + value(EP_SECURITY_ENABLED) type FLAG . + *"* protected components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + method CONSTRUCTOR. +endmethod. + + + + method IS_SECURITY_ENABLED. + IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. + ep_security_enabled = abap_true. + ENDIF. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk b/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk new file mode 100644 index 0000000..6be6f5c --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk @@ -0,0 +1,176 @@ + + + class ZCL_EXCEL_SHEET_SETUP definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants C_PAPERSIZE_LETTER type ZEXCEL_SHEET_PAPER_SIZE value 1. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 2. "#EC NOTEXT + constants C_PAPERSIZE_TABLOID type ZEXCEL_SHEET_PAPER_SIZE value 3. "#EC NOTEXT + constants C_PAPERSIZE_LEDGER type ZEXCEL_SHEET_PAPER_SIZE value 4. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL type ZEXCEL_SHEET_PAPER_SIZE value 5. "#EC NOTEXT + constants C_PAPERSIZE_STATEMENT type ZEXCEL_SHEET_PAPER_SIZE value 6. "#EC NOTEXT + constants C_PAPERSIZE_EXECUTIVE type ZEXCEL_SHEET_PAPER_SIZE value 7. "#EC NOTEXT + constants C_PAPERSIZE_A3 type ZEXCEL_SHEET_PAPER_SIZE value 8. "#EC NOTEXT + constants C_PAPERSIZE_A4 type ZEXCEL_SHEET_PAPER_SIZE value 9. "#EC NOTEXT + constants C_PAPERSIZE_A4_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 10. "#EC NOTEXT + constants C_PAPERSIZE_A5 type ZEXCEL_SHEET_PAPER_SIZE value 11. "#EC NOTEXT + constants C_PAPERSIZE_B4 type ZEXCEL_SHEET_PAPER_SIZE value 12. "#EC NOTEXT + constants C_PAPERSIZE_B5 type ZEXCEL_SHEET_PAPER_SIZE value 13. "#EC NOTEXT + constants C_PAPERSIZE_FOLIO type ZEXCEL_SHEET_PAPER_SIZE value 14. "#EC NOTEXT + constants C_PAPERSIZE_QUARTO type ZEXCEL_SHEET_PAPER_SIZE value 15. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_1 type ZEXCEL_SHEET_PAPER_SIZE value 16. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_2 type ZEXCEL_SHEET_PAPER_SIZE value 17. "#EC NOTEXT + constants C_PAPERSIZE_NOTE type ZEXCEL_SHEET_PAPER_SIZE value 18. "#EC NOTEXT + constants C_PAPERSIZE_NO9_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 19. "#EC NOTEXT + constants C_PAPERSIZE_NO10_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 20. "#EC NOTEXT + constants C_PAPERSIZE_NO11_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 21. "#EC NOTEXT + constants C_PAPERSIZE_NO12_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 22. "#EC NOTEXT + constants C_PAPERSIZE_NO14_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 23. "#EC NOTEXT + constants C_PAPERSIZE_C type ZEXCEL_SHEET_PAPER_SIZE value 24. "#EC NOTEXT + constants C_PAPERSIZE_D type ZEXCEL_SHEET_PAPER_SIZE value 25. "#EC NOTEXT + constants C_PAPERSIZE_E type ZEXCEL_SHEET_PAPER_SIZE value 26. "#EC NOTEXT + constants C_PAPERSIZE_DL_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 27. "#EC NOTEXT + constants C_PAPERSIZE_C5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 28. "#EC NOTEXT + constants C_PAPERSIZE_C3_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 29. "#EC NOTEXT + constants C_PAPERSIZE_C4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 30. "#EC NOTEXT + constants C_PAPERSIZE_C6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 31. "#EC NOTEXT + constants C_PAPERSIZE_C65_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 32. "#EC NOTEXT + constants C_PAPERSIZE_B4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 33. "#EC NOTEXT + constants C_PAPERSIZE_B5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 34. "#EC NOTEXT + constants C_PAPERSIZE_B6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 35. "#EC NOTEXT + constants C_PAPERSIZE_ITALY_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 36. "#EC NOTEXT + constants C_PAPERSIZE_MONARCH_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 37. "#EC NOTEXT + constants C_PAPERSIZE_6_3_4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 38. "#EC NOTEXT + constants C_PAPERSIZE_US_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 39. "#EC NOTEXT + constants C_PAPERSIZE_DE_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 40. "#EC NOTEXT + constants C_PAPERSIZE_DE_LEG_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 41. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B4 type ZEXCEL_SHEET_PAPER_SIZE value 42. "#EC NOTEXT + constants C_PAPERSIZE_JPN_DBL_POSTCARD type ZEXCEL_SHEET_PAPER_SIZE value 43. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_1 type ZEXCEL_SHEET_PAPER_SIZE value 44. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_2 type ZEXCEL_SHEET_PAPER_SIZE value 45. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_3 type ZEXCEL_SHEET_PAPER_SIZE value 46. "#EC NOTEXT + constants C_PAPERSIZE_INVITE_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 47. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 48. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 49. "#EC NOTEXT + constants C_PAPERSIZE_TABL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 50. "#EC NOTEXT + constants C_PAPERSIZE_A4_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 51. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 52. "#EC NOTEXT + constants C_PAPERSIZE_A4_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 53. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 54. "#EC NOTEXT + constants C_PAPERSIZE_SUPERA_A4_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 55. "#EC NOTEXT + constants C_PAPERSIZE_SUPERB_A3_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 56. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 57. "#EC NOTEXT + constants C_PAPERSIZE_A4_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 58. "#EC NOTEXT + constants C_PAPERSIZE_A5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 59. "#EC NOTEXT + constants C_PAPERSIZE_JIS_B5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 60. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 61. "#EC NOTEXT + constants C_PAPERSIZE_A5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 62. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 63. "#EC NOTEXT + constants C_PAPERSIZE_A2_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 64. "#EC NOTEXT + constants C_PAPERSIZE_A3_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 65. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 66. "#EC NOTEXT + constants C_ORIENTATION_DEFAULT type ZEXCEL_SHEET_ORIENATATION value 'default'. "#EC NOTEXT + constants C_ORIENTATION_LANDSCAPE type ZEXCEL_SHEET_ORIENATATION value 'landscape'. "#EC NOTEXT + constants C_ORIENTATION_PORTRAIT type ZEXCEL_SHEET_ORIENATATION value 'portrait'. "#EC NOTEXT + data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + orientation = me->c_orientation_default. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk new file mode 100644 index 0000000..f853fe3 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk @@ -0,0 +1,71 @@ + + + class ZCL_EXCEL_STYLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +public section. + + data FONT type ref to ZCL_EXCEL_STYLE_FONT . + data FILL type ref to ZCL_EXCEL_STYLE_FILL . + data BORDERS type ref to ZCL_EXCEL_STYLE_BORDERS . + data ALIGNMENT type ref to ZCL_EXCEL_STYLE_ALIGNMENT . + data NUMBER_FORMAT type ref to ZCL_EXCEL_STYLE_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_CELL_STYLE . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +private section. + + data PROTECTION type ref to ZCL_EXCEL_STYLE_PROTECTION . + data GUID type ZEXCEL_CELL_STYLE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + method CONSTRUCTOR. + + + CREATE OBJECT font. + CREATE OBJECT fill. + CREATE OBJECT borders. + CREATE OBJECT alignment. + CREATE OBJECT number_format. + CREATE OBJECT protection. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + +endmethod. + + + + method GET_GUID. + + + ep_guid = me->guid. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk new file mode 100644 index 0000000..93a7155 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk @@ -0,0 +1,129 @@ + + + class ZCL_EXCEL_STYLES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods SIZE + returning + value(EP_SIZE) type I . + methods REGISTER_NEW_STYLE + importing + !IO_STYLE type ref to ZCL_EXCEL_STYLE + returning + value(EP_STYLE_CODE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +private section. + + data STYLES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + + + styles->add( ip_style ). +endmethod. + + + method CLEAR. + + + styles->clear( ). +endmethod. + + + method CONSTRUCTOR. + + + CREATE OBJECT styles. +endmethod. + + + + + method GET. + + + eo_style ?= styles->if_object_collection~get( ip_index ). +endmethod. + + + + method GET_ITERATOR. + + + eo_iterator ?= styles->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + + + is_empty = styles->if_object_collection~is_empty( ). +endmethod. + + + + + method REGISTER_NEW_STYLE. + + + me->add( io_style ). + ep_style_code = me->size( ) - 1. "style count starts from 0 +endmethod. + + + + method REMOVE. + + + styles->remove( ip_style ). +endmethod. + + + + method SIZE. + + + ep_size = styles->if_object_collection~size( ). +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk new file mode 100644 index 0000000..438cde9 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk @@ -0,0 +1,102 @@ + + + class ZCL_EXCEL_STYLES_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_STYLE_CONDITIONAL) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data STYLES_CONDITIONAL type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + styles_conditional->add( ip_style_conditional ). +endmethod. + + + method CLEAR. + styles_conditional->clear( ). +endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT styles_conditional. + +endmethod. + + + + + method GET. + DATA lv_index TYPE i. + lv_index = ip_index. + eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = styles_conditional->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + styles_conditional->remove( ip_style_conditional ). +endmethod. + + + + method SIZE. + ep_size = styles_conditional->if_object_collection~size( ). +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk new file mode 100644 index 0000000..e639db5 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk @@ -0,0 +1,87 @@ + + + class ZCL_EXCEL_STYLE_ALIGNMENT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants C_HORIZONTAL_GENERAL type ZEXCEL_ALIGNMENT value 'general'. "#EC NOTEXT + constants C_HORIZONTAL_LEFT type ZEXCEL_ALIGNMENT value 'left'. "#EC NOTEXT + constants C_HORIZONTAL_RIGHT type ZEXCEL_ALIGNMENT value 'right'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER_CONTINUOUS type ZEXCEL_ALIGNMENT value 'centerContinuous'. "#EC NOTEXT + constants C_HORIZONTAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + constants C_VERTICAL_BOTTOM type ZEXCEL_ALIGNMENT value 'bottom'. "#EC NOTEXT + constants C_VERTICAL_TOP type ZEXCEL_ALIGNMENT value 'top'. "#EC NOTEXT + constants C_VERTICAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_VERTICAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + data HORIZONTAL type ZEXCEL_ALIGNMENT . + data VERTICAL type ZEXCEL_ALIGNMENT . + data TEXTROTATION type ZEXCEL_TEXT_ROTATION value 0. "#EC NOTEXT . + data WRAPTEXT type FLAG . + data SHRINKTOFIT type FLAG . + data INDENT type ZEXCEL_INDENT value 0. "#EC NOTEXT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_ALIGNMENT) type ZEXCEL_S_STYLE_ALIGNMENT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + horizontal = me->c_horizontal_general. + vertical = me->c_vertical_bottom. + wrapText = abap_false. + shrinkToFit = abap_false. +endmethod. + + + + METHOD get_structure. + + es_alignment-horizontal = me->horizontal. + es_alignment-vertical = me->vertical. + es_alignment-textrotation = me->textrotation. + es_alignment-wraptext = me->wraptext. + es_alignment-shrinktofit = me->shrinktofit. + es_alignment-indent = me->indent. + +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk new file mode 100644 index 0000000..ce7231e --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk @@ -0,0 +1,65 @@ + + + class ZCL_EXCEL_STYLE_BORDER definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +public section. + + data BORDER_STYLE type ZEXCEL_BORDER . + data BORDER_COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_BORDER_NONE type ZEXCEL_BORDER value 'none'. "#EC NOTEXT . + class-data C_BORDER_DASHDOT type ZEXCEL_BORDER value 'dashDot'. "#EC NOTEXT . + class-data C_BORDER_DASHDOTDOT type ZEXCEL_BORDER value 'dashDotDot'. "#EC NOTEXT . + class-data C_BORDER_DASHED type ZEXCEL_BORDER value 'dashed'. "#EC NOTEXT . + class-data C_BORDER_DOTTED type ZEXCEL_BORDER value 'dotted'. "#EC NOTEXT . + class-data C_BORDER_DOUBLE type ZEXCEL_BORDER value 'double'. "#EC NOTEXT . + class-data C_BORDER_HAIR type ZEXCEL_BORDER value 'hair'. "#EC NOTEXT . + class-data C_BORDER_MEDIUM type ZEXCEL_BORDER value 'medium'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOT type ZEXCEL_BORDER value 'mediumDashDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOTDOT type ZEXCEL_BORDER value 'mediumDashDotDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHED type ZEXCEL_BORDER value 'mediumDashed'. "#EC NOTEXT . + class-data C_BORDER_SLANTDASHDOT type ZEXCEL_BORDER value 'slantDashDot'. "#EC NOTEXT . + class-data C_BORDER_THICK type ZEXCEL_BORDER value 'thick'. "#EC NOTEXT . + class-data C_BORDER_THIN type ZEXCEL_BORDER value 'thin'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + border_style = zcl_excel_style_border=>c_border_none. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDERS.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDERS.slnk new file mode 100644 index 0000000..bab81e1 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDERS.slnk @@ -0,0 +1,97 @@ + + + class ZCL_EXCEL_STYLE_BORDERS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +public section. + + data LEFT type ref to ZCL_EXCEL_STYLE_BORDER . + data RIGHT type ref to ZCL_EXCEL_STYLE_BORDER . + data TOP type ref to ZCL_EXCEL_STYLE_BORDER . + data DOWN type ref to ZCL_EXCEL_STYLE_BORDER . + data DIAGONAL type ref to ZCL_EXCEL_STYLE_BORDER . + data ALLBORDERS type ref to ZCL_EXCEL_STYLE_BORDER . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_BORDER . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +private section. + + constants C_DIAGONAL_NONE type ZEXCEL_DIAGONAL value 0. "#EC NOTEXT + constants C_DIAGONAL_UP type ZEXCEL_DIAGONAL value 1. "#EC NOTEXT + constants C_DIAGONAL_DOWN type ZEXCEL_DIAGONAL value 2. "#EC NOTEXT + constants C_DIAGONAL_BOTH type ZEXCEL_DIAGONAL value 3. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method CONSTRUCTOR. +endmethod. + + + + method GET_STRUCTURE. + +* Check if all borders is set otherwise check single border + IF me->allborders IS BOUND. + es_fill-left_color = me->allborders->border_color. + es_fill-left_style = me->allborders->border_style. + es_fill-right_color = me->allborders->border_color. + es_fill-right_style = me->allborders->border_style. + es_fill-top_color = me->allborders->border_color. + es_fill-top_style = me->allborders->border_style. + es_fill-bottom_color = me->allborders->border_color. + es_fill-bottom_style = me->allborders->border_style. + ELSE. + IF me->left IS BOUND. + es_fill-left_color = me->left->border_color. + es_fill-left_style = me->left->border_style. + ENDIF. + IF me->right IS BOUND. + es_fill-right_color = me->right->border_color. + es_fill-right_style = me->right->border_style. + ENDIF. + IF me->top IS BOUND. + es_fill-top_color = me->top->border_color. + es_fill-top_style = me->top->border_style. + ENDIF. + IF me->down IS BOUND. + es_fill-bottom_color = me->down->border_color. + es_fill-bottom_style = me->down->border_style. + ENDIF. + ENDIF. + +* Check if diagonal is set + IF me->diagonal IS BOUND. + es_fill-diagonal_color = me->diagonal->border_color. + es_fill-diagonal_style = me->diagonal->border_style. + ENDIF. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_COLOR.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_COLOR.slnk new file mode 100644 index 0000000..3b2ef61 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_COLOR.slnk @@ -0,0 +1,78 @@ + + + class ZCL_EXCEL_STYLE_COLOR definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +public section. + + class-data C_BLACK type ZEXCEL_STYLE_COLOR_ARGB value 'FF000000'. "#EC NOTEXT . + class-data C_BLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF0000FF'. "#EC NOTEXT . + class-data C_DARKBLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF000080'. "#EC NOTEXT . + class-data C_DARKGREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF008000'. "#EC NOTEXT . + class-data C_DARKRED type ZEXCEL_STYLE_COLOR_ARGB value 'FF800000'. "#EC NOTEXT . + class-data C_DARKYELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FF808000'. "#EC NOTEXT . + class-data C_GRAY type ZEXCEL_STYLE_COLOR_ARGB value 'FFCCCCCC'. "#EC NOTEXT . + class-data C_GREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF00FF00'. "#EC NOTEXT . + class-data C_RED type ZEXCEL_STYLE_COLOR_ARGB value 'FFFF0000'. "#EC NOTEXT . + class-data C_WHITE type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFFFF'. "#EC NOTEXT . + class-data C_YELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFF00'. "#EC NOTEXT . + + methods CONSTRUCTOR . + class-methods CREATE_NEW_ARGB + importing + !IP_RED type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_GREEN type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_BLU type ZEXCEL_STYLE_COLOR_COMPONENT + returning + value(EP_COLOR_ARGB) type ZEXCEL_STYLE_COLOR_ARGB . + *"* protected components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +private section. + + class-data C_ALPHA type CHAR2 value 'FF'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + method CONSTRUCTOR. + + +endmethod. + + + + + + + method CREATE_NEW_ARGB. + + + CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk new file mode 100644 index 0000000..b11d274 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk @@ -0,0 +1,167 @@ + + + class ZCL_EXCEL_STYLE_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +public section. + + class-data C_ICONSET_3ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '3Arrows'. "#EC NOTEXT . + class-data C_ICONSET_3ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '3ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_3FLAGS type ZEXCEL_CONDITION_RULE_ICONSET value '3Flags'. "#EC NOTEXT . + class-data C_ICONSET_3SIGNS type ZEXCEL_CONDITION_RULE_ICONSET value '3Signs'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols2'. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value ''. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3TrafficLights2'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '4Arrows'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '4ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_4RATING type ZEXCEL_CONDITION_RULE_ICONSET value '4Rating'. "#EC NOTEXT . + class-data C_ICONSET_4REDTOBLACK type ZEXCEL_CONDITION_RULE_ICONSET value '4RedToBlack'. "#EC NOTEXT . + class-data C_ICONSET_4TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value '4TrafficLights'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '5Arrows'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '5ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_5QUARTERS type ZEXCEL_CONDITION_RULE_ICONSET value '5Quarters'. "#EC NOTEXT . + class-data C_ICONSET_5RATING type ZEXCEL_CONDITION_RULE_ICONSET value '5Rating'. "#EC NOTEXT . + class-data C_OPERATOR_BEGINSWITH type ZEXCEL_CONDITION_OPERATOR value 'beginsWith'. "#EC NOTEXT . + class-data C_OPERATOR_BETWEEN type ZEXCEL_CONDITION_OPERATOR value 'between'. "#EC NOTEXT . + class-data C_OPERATOR_CONTAINSTEXT type ZEXCEL_CONDITION_OPERATOR value 'containsText'. "#EC NOTEXT . + class-data C_OPERATOR_ENDSWITH type ZEXCEL_CONDITION_OPERATOR value 'endsWith'. "#EC NOTEXT . + class-data C_OPERATOR_EQUAL type ZEXCEL_CONDITION_OPERATOR value 'equal'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHAN type ZEXCEL_CONDITION_OPERATOR value 'greaterThan'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'greaterThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHAN type ZEXCEL_CONDITION_OPERATOR value 'lessThan'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'lessThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_NONE type ZEXCEL_CONDITION_OPERATOR value ''. "#EC NOTEXT . + class-data C_OPERATOR_NOTCONTAINS type ZEXCEL_CONDITION_OPERATOR value 'notContains'. "#EC NOTEXT . + class-data C_OPERATOR_NOTEQUAL type ZEXCEL_CONDITION_OPERATOR value 'notEqual'. "#EC NOTEXT . + class-data C_RULE_CELLIS type ZEXCEL_CONDITION_RULE value 'cellIs'. "#EC NOTEXT . + class-data C_RULE_CONTAINSTEXT type ZEXCEL_CONDITION_RULE value 'containsText'. "#EC NOTEXT . + class-data C_RULE_EXPRESSION type ZEXCEL_CONDITION_RULE value 'expression'. "#EC NOTEXT . + class-data C_RULE_ICONSET type ZEXCEL_CONDITION_RULE value 'iconSet'. "#EC NOTEXT . + class-data C_RULE_NONE type ZEXCEL_CONDITION_RULE value 'none'. "#EC NOTEXT . + data FORMULA type ZEXCEL_STYLE_FORMULA . + data ICONSET type ZEXCEL_CONDITION_RULE_ICONSET . + data OPERATOR type ZEXCEL_CONDITION_OPERATOR . + data PRIORITY type ZEXCEL_STYLE_PRIORITY value 1. "#EC NOTEXT . + data RULE type ZEXCEL_CONDITION_RULE . + + methods CONSTRUCTOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods SET_RANGE + importing + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data START_CELL type ZEXCEL_S_CELL_DATA . + data STOP_CELL type ZEXCEL_S_CELL_DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + rule = me->c_rule_none. + operator = me->c_operator_none. +* inizialize dimension range + stop_cell-cell_row = 1. + stop_cell-cell_column = 1. + start_cell-cell_row = 1. + start_cell-cell_column = 1. +endmethod. + + + + method GET_DIMENSION_RANGE. + IF stop_cell EQ start_cell. "only one cell + ep_dimension_range = start_cell-cell_coords. + ELSE. + CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. + ENDIF. +endmethod. + + + + + + + method SET_RANGE. + DATA: lv_column TYPE zexcel_cell_column, + lv_row_alpha TYPE string. + + lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). + stop_cell-cell_row = 1. + stop_cell-cell_column = lv_column. + lv_row_alpha = ip_stop_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. + + lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). + start_cell-cell_row = 1. + start_cell-cell_column = lv_column. + lv_row_alpha = ip_start_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk new file mode 100644 index 0000000..a15cb44 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk @@ -0,0 +1,96 @@ + + + class ZCL_EXCEL_STYLE_FILL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +public section. + + class-data C_FILL_NONE type ZEXCEL_FILL_TYPE value 'none'. "#EC NOTEXT . + class-data C_FILL_SOLID type ZEXCEL_FILL_TYPE value 'solid'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_LINEAR type ZEXCEL_FILL_TYPE value 'linear'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_PATH type ZEXCEL_FILL_TYPE value 'path'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKDOWN type ZEXCEL_FILL_TYPE value 'darkDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRAY type ZEXCEL_FILL_TYPE value 'darkGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRID type ZEXCEL_FILL_TYPE value 'darkGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKHORIZONTAL type ZEXCEL_FILL_TYPE value 'darkHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKTRELLIS type ZEXCEL_FILL_TYPE value 'darkTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKUP type ZEXCEL_FILL_TYPE value 'darkUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKVERTICAL type ZEXCEL_FILL_TYPE value 'darkVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY0625 type ZEXCEL_FILL_TYPE value 'gray0625'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY125 type ZEXCEL_FILL_TYPE value 'gray125'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTDOWN type ZEXCEL_FILL_TYPE value 'lightDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRAY type ZEXCEL_FILL_TYPE value 'lightGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRID type ZEXCEL_FILL_TYPE value 'lightGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTHORIZONTAL type ZEXCEL_FILL_TYPE value 'lightHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTTRELLIS type ZEXCEL_FILL_TYPE value 'lightTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTUP type ZEXCEL_FILL_TYPE value 'lightUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTVERTICAL type ZEXCEL_FILL_TYPE value 'lightVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_MEDIUMGRAY type ZEXCEL_FILL_TYPE value 'mediumGray'. "#EC NOTEXT . + data FILLTYPE type ZEXCEL_FILL_TYPE . + data ROTATION type ZEXCEL_ROTATION . + data FGCOLOR type ZEXCEL_STYLE_COLOR_ARGB . + data BGCOLOR type ZEXCEL_STYLE_COLOR_ARGB value '64'. "#EC NOTEXT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_FILL . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + filltype = zcl_excel_style_fill=>c_fill_none. + rotation = 0. +endmethod. + + + + method GET_STRUCTURE. + es_fill-rotation = me->rotation. + es_fill-filltype = me->filltype. + es_fill-fgColor = me->fgColor. + es_fill-bgColor = me->bgColor. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk new file mode 100644 index 0000000..c65d0e3 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk @@ -0,0 +1,92 @@ + + + class ZCL_EXCEL_STYLE_FONT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data BOLD type FLAG . + data COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_SCHEME_MAJOR type ZEXCEL_STYLE_FONT_SCHEME value 'major'. "#EC NOTEXT . + class-data C_SCHEME_MINOR type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLE type CHAR20 value 'double'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLEACCOUNTING type CHAR20 value 'doubleAccounting'. "#EC NOTEXT . + class-data C_UNDERLINE_NONE type CHAR20 value 'none'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLE type CHAR20 value 'single'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLEACCOUNTING type CHAR20 value 'singleAccounting'. "#EC NOTEXT . + data FAMILY type INT1 value 2. "#EC NOTEXT . + data ITALIC type FLAG . + data NAME type CHAR255 value 'Calibri'. "#EC NOTEXT . + data SCHEME type ZEXCEL_STYLE_FONT_SCHEME . + data SIZE type INT1 value 11. "#EC NOTEXT . + data STRIKETHROUGH type FLAG . + data UNDERLINE type FLAG . + data UNDERLINE_MODE type CHAR20 . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FONT) type ZEXCEL_S_STYLE_FONT . + *"* protected components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + me->color = zcl_excel_style_color=>c_black. + me->scheme = zcl_excel_style_font=>c_scheme_minor. + me->underline_mode = zcl_excel_style_font=>c_underline_single. +endmethod. + + + + method GET_STRUCTURE. + + es_font-bold = me->bold. + es_font-italic = me->italic. + es_font-underline = me->underline. + es_font-underline_mode = me->underline_mode. + es_font-strikethrough = me->strikethrough. + es_font-size = me->size. + es_font-color = me->color. + es_font-name = me->name. + es_font-family = me->family. + es_font-scheme = me->scheme. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk new file mode 100644 index 0000000..3719a6c --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk @@ -0,0 +1,111 @@ + + + class ZCL_EXCEL_STYLE_NUMBER_FORMAT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +public section. + + class-data C_FORMAT_NUMBER type ZEXCEL_NUMBER_FORMAT value '0'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_00 type ZEXCEL_NUMBER_FORMAT value '0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP1 type ZEXCEL_NUMBER_FORMAT value '#,##0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP2 type ZEXCEL_NUMBER_FORMAT value '#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE type ZEXCEL_NUMBER_FORMAT value '0%'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE_00 type ZEXCEL_NUMBER_FORMAT value '0.00%'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD2 type ZEXCEL_NUMBER_FORMAT value 'yyyy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD type ZEXCEL_NUMBER_FORMAT value 'yy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DDMMYYYY type ZEXCEL_NUMBER_FORMAT value 'dd/mm/yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYSLASH type ZEXCEL_NUMBER_FORMAT value 'd/m/y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m'. "#EC NOTEXT . + class-data C_FORMAT_DATE_MYMINUS type ZEXCEL_NUMBER_FORMAT value 'm-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX14 type ZEXCEL_NUMBER_FORMAT value 'mm-dd-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX15 type ZEXCEL_NUMBER_FORMAT value 'd-mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX16 type ZEXCEL_NUMBER_FORMAT value 'd-mmm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX17 type ZEXCEL_NUMBER_FORMAT value 'mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX22 type ZEXCEL_NUMBER_FORMAT value 'm/d/yy h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DATETIME type ZEXCEL_NUMBER_FORMAT value 'd/m/y h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME1 type ZEXCEL_NUMBER_FORMAT value 'h:mm AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME2 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME3 type ZEXCEL_NUMBER_FORMAT value 'h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME4 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME5 type ZEXCEL_NUMBER_FORMAT value 'mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME6 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME7 type ZEXCEL_NUMBER_FORMAT value 'i:s.S'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME8 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss@'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yy/mm/dd@'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD_SIMPLE type ZEXCEL_NUMBER_FORMAT value '"$"#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD type ZEXCEL_NUMBER_FORMAT value '$#,##0_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_EUR_SIMPLE type ZEXCEL_NUMBER_FORMAT value '[$EUR ]#,##0.00_-'. "#EC NOTEXT . + data FORMAT_CODE type ZEXCEL_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(EP_NUMBER_FORMAT) type ZEXCEL_S_STYLE_NUMFMT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +private section. + + class-data C_FORMAT_GENERAL type ZEXCEL_NUMBER_FORMAT value ''. "#EC NOTEXT . + class-data C_FORMAT_TEXT type ZEXCEL_NUMBER_FORMAT value '@'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + format_code = me->c_format_general. +endmethod. + + + + method GET_STRUCTURE. + ep_number_format-numfmt = me->format_code. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk new file mode 100644 index 0000000..ff898d1 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk @@ -0,0 +1,44 @@ + + + class ZCL_EXCEL_STYLE_PROTECTION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +public section. + + constants C_PROTECTION_INHERIT type ZEXCEL_PROTECTION value 'inherit'. "#EC NOTEXT + constants C_PROTECTION_PROTECTED type ZEXCEL_PROTECTION value 'protected'. "#EC NOTEXT + constants C_PROTECTION_UNPROTECTED type ZEXCEL_PROTECTION value 'unprotected'. "#EC NOTEXT + data LOCKED type ZEXCEL_PROTECTION . + data HIDDEN type ZEXCEL_PROTECTION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + method CONSTRUCTOR. + locked = me->c_protection_inherit. + hidden = me->c_protection_inherit. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk b/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk new file mode 100644 index 0000000..e8583d9 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk @@ -0,0 +1,244 @@ + + + class ZCL_EXCEL_TABLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_TABLE +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants BUILTINSTYLE_DARK1 type ZEXCEL_TABLE_STYLE value 'TableStyleDark1'. "#EC NOTEXT + constants BUILTINSTYLE_DARK2 type ZEXCEL_TABLE_STYLE value 'TableStyleDark2'. "#EC NOTEXT + constants BUILTINSTYLE_DARK3 type ZEXCEL_TABLE_STYLE value 'TableStyleDark3'. "#EC NOTEXT + constants BUILTINSTYLE_DARK4 type ZEXCEL_TABLE_STYLE value 'TableStyleDark4'. "#EC NOTEXT + constants BUILTINSTYLE_DARK5 type ZEXCEL_TABLE_STYLE value 'TableStyleDark5'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT1 type ZEXCEL_TABLE_STYLE value 'TableStyleLight1'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT2 type ZEXCEL_TABLE_STYLE value 'TableStyleLight2'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT3 type ZEXCEL_TABLE_STYLE value 'TableStyleLight3'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT4 type ZEXCEL_TABLE_STYLE value 'TableStyleLight4'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT5 type ZEXCEL_TABLE_STYLE value 'TableStyleLight5'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM1 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium1'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM2 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium2'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM3 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium3'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM4 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium4'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM5 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium5'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM9 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium9'. "#EC NOTEXT + constants BUILTINSTYLE_PIVOT_LIGHT16 type ZEXCEL_TABLE_STYLE value 'PivotStyleLight16'. "#EC NOTEXT + data FIELDCAT type ZEXCEL_T_FIELDCATALOG . + data SETTINGS type ZEXCEL_S_TABLE_SETTINGS . + constants TOTALS_FUNCTION_AVERAGE type ZEXCEL_TABLE_TOTALS_FUNCTION value 'average'. "#EC NOTEXT + constants TOTALS_FUNCTION_COUNT type ZEXCEL_TABLE_TOTALS_FUNCTION value 'count'. "#EC NOTEXT + constants TOTALS_FUNCTION_MAX type ZEXCEL_TABLE_TOTALS_FUNCTION value 'max'. "#EC NOTEXT + constants TOTALS_FUNCTION_MIN type ZEXCEL_TABLE_TOTALS_FUNCTION value 'min'. "#EC NOTEXT + constants TOTALS_FUNCTION_SUM type ZEXCEL_TABLE_TOTALS_FUNCTION value 'sum'. "#EC NOTEXT + + methods GET_TOTALS_FORMULA + importing + !IP_COLUMN type CLIKE + !IP_FUNCTION type ZEXCEL_TABLE_TOTALS_FUNCTION + returning + value(EP_FORMULA) type STRING . + methods HAS_TOTALS + returning + value(EP_RESULT) type ABAP_BOOL . + methods SET_DATA + importing + !IR_DATA type STANDARD TABLE . + methods GET_ID + returning + value(OV_ID) type I . + methods SET_ID + importing + !IV_ID type I . + methods CONSTRUCTOR . + methods GET_NAME + returning + value(OV_NAME) type STRING . + methods GET_REFERENCE + importing + !IP_INCLUDE_TOTALS_ROW type ABAP_BOOL default ABAP_TRUE + returning + value(OV_REFERENCE) type STRING . + *"* protected components of class ZCL_EXCEL_TABLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_TABLE +*"* do not include other source files here!!! +private section. + + data ID type I . + data NAME type STRING . + data TABLE_DATA type ref to DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + +endmethod. + + + + method GET_ID. + ov_id = id. +endmethod. + + + + method GET_NAME. + + IF me->name IS INITIAL. + me->name = zcl_excel_common=>number_to_excel_string( ip_value = me->id ). + CONCATENATE 'table' me->name INTO me->name. + ENDIF. + + ov_name = me->name. +endmethod. + + + + + method GET_REFERENCE. + DATA: lv_column TYPE zexcel_cell_column, + lv_table_lines TYPE i, + lv_right_column TYPE zexcel_cell_column_alpha, + ls_field_catalog TYPE zexcel_s_fieldcatalog, + lv_bottom_row TYPE zexcel_cell_row, + lv_top_row_string(10) TYPE c, + lv_bottom_row_string(10) TYPE c. + + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. + +*column + lv_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). + lv_table_lines = 0. + LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. + ADD 1 TO lv_table_lines. + ENDLOOP. + lv_column = lv_column + lv_table_lines - 1. + lv_right_column = zcl_excel_common=>convert_column2alpha( lv_column ). + +*row + ASSIGN table_data->* TO <fs_table>. + DESCRIBE TABLE <fs_table> LINES lv_table_lines. + lv_bottom_row = settings-top_left_row + lv_table_lines . + + IF me->has_totals( ) = abap_true AND ip_include_totals_row = abap_true. + add 1 to lv_bottom_row. + ENDIF. + + WRITE settings-top_left_row TO lv_top_row_string. + CONDENSE lv_top_row_string. + WRITE lv_bottom_row TO lv_bottom_row_string. + CONDENSE lv_bottom_row_string. + + CONCATENATE settings-top_left_column lv_top_row_string + ':' + lv_right_column lv_bottom_row_string INTO ov_reference. + +endmethod. + + + + + + method GET_TOTALS_FORMULA. + CONSTANTS: lc_function_id_sum TYPE string VALUE '109', + lc_function_id_min TYPE string VALUE '105', + lc_function_id_max TYPE string VALUE '104', + lc_function_id_count TYPE string VALUE '103', + lc_function_id_average TYPE string VALUE '101'. + + DATA: lv_function_id TYPE string. + + CASE ip_function. + WHEN zcl_excel_table=>totals_function_sum. + lv_function_id = lc_function_id_sum. + + WHEN zcl_excel_table=>totals_function_min. + lv_function_id = lc_function_id_min. + + WHEN zcl_excel_table=>totals_function_max. + lv_function_id = lc_function_id_max. + + WHEN zcl_excel_table=>totals_function_count. + lv_function_id = lc_function_id_count. + + WHEN zcl_excel_table=>totals_function_average. + lv_function_id = lc_function_id_average. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid totals formula. See ZCL_ for possible values'. + ENDCASE. + + CONCATENATE 'SUBTOTAL(' lv_function_id ',[' ip_column '])' INTO ep_formula. +endmethod. + + + + method HAS_TOTALS. + DATA: ls_field_catalog TYPE zexcel_s_fieldcatalog. + + ep_result = abap_false. + + LOOP AT fieldcat INTO ls_field_catalog. + IF ls_field_catalog-totals_function IS NOT INITIAL. + ep_result = abap_true. + EXIT. + ENDIF. + ENDLOOP. + +endmethod. + + + + method SET_DATA. + GET REFERENCE OF ir_data INTO me->table_data. +endmethod. + + + + method SET_ID. + id = iv_id. +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk new file mode 100644 index 0000000..709fcc8 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -0,0 +1,873 @@ + + + class ZCL_EXCEL_WORKSHEET definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + class-data C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT . + class-data C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT . + class-data C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT . + class-data C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT . + data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . + data SHEET_CONTENT_MERGE type ZEXCEL_T_CELL_DATA . + data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . + data SHEET_STATE type ZEXCEL_SHEET_STATE . + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + + methods ADD_NEW_CONDITIONAL_STYLE + returning + value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods ADD_NEW_DATA_VALIDATION + returning + value(EO_DATA_VALIDATION) type ref to ZCL_EXCEL_DATA_VALIDATION . + methods BIND_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IT_FIELD_CATALOG type ZEXCEL_T_FIELDCATALOG optional + !IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional . + methods CONSTRUCTOR + importing + !IP_EXCEL type ref to ZCL_EXCEL + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods DELETE_MERGE . + methods GET_ACTIVE_CELL + returning + value(EP_ACTIVE_CELL) type STRING . + methods GET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + exporting + !EP_VALUE type ZEXCEL_CELL_VALUE + !EP_RC type SYSUBRC . + methods GET_COLUMN_DIMENSION + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(R_COLUMN_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods GET_COLUMN_DIMENSIONS + returning + value(R_COLUMN_DIMENSION) type ZEXCEL_T_WORKSHEET_COLUMNDIME . + methods GET_COND_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DATA_VALIDATIONS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DATA_VALIDATIONS_SIZE + returning + value(EP_SIZE) type I . + methods GET_DEFAULT_COLUMN_DIMENSION + returning + value(R_COLUMN_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods GET_DEFAULT_ROW_DIMENSION + returning + value(R_ROW_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods GET_GUID + returning + value(EP_GUID) type OLTPGUID16 . + methods GET_HIGHEST_COLUMN + returning + value(R_HIGHEST_COLUMN) type ZEXCEL_CELL_COLUMN . + methods GET_HIGHEST_ROW + returning + value(R_HIGHEST_ROW) type INT4 . + methods GET_MERGE + returning + value(MERGE_RANGE) type STRING_TABLE . + methods GET_ROW_DIMENSION + importing + !IP_ROW type INT4 + returning + value(R_ROW_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . + methods GET_ROW_DIMENSIONS + returning + value(R_ROW_DIMENSION) type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . + methods SET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_VALUE type SIMPLE optional + !IP_FORMULA type ZEXCEL_CELL_FORMULA optional + !IP_STYLE type ZEXCEL_CELL_STYLE optional . + methods SET_CELL_STYLE + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_STYLE type ZEXCEL_CELL_STYLE + raising + ZCX_EXCEL . + methods SET_MERGE + importing + !IP_COLUMN_START type ZEXCEL_CELL_COLUMN_ALPHA optional + !IP_COLUMN_END type ZEXCEL_CELL_COLUMN_ALPHA optional + !IP_ROW type ZEXCEL_CELL_ROW optional . + methods SET_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional + !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional + !IP_TABLE_TITLE type STRING + !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' + !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . + methods GET_TABLES_SIZE + returning + value(EP_SIZE) type I . + methods GET_TABLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + *"* protected components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + + data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . + data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . + data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS . + data GUID type OLTPGUID16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + data COLUMN_DIMENSIONS type ZEXCEL_T_WORKSHEET_COLUMNDIME . + data ROW_DIMENSIONS type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . + data DEFAULT_COLUMN_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + data DEFAULT_ROW_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . + data EXCEL type ref to ZCL_EXCEL . + data TABLES type ref to CL_OBJECT_COLLECTION . + + methods UPDATE_DIMENSION_RANGE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + method ADD_NEW_CONDITIONAL_STYLE. + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). +endmethod. + + + + method ADD_NEW_DATA_VALIDATION. + + CREATE OBJECT eo_data_validation. + data_validations->add( eo_data_validation ). +endmethod. + + + + + + METHOD bind_table. + + DATA: + lv_row_int TYPE zexcel_cell_row, + lv_first_row TYPE zexcel_cell_row, + lv_last_row TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + lv_id TYPE i, + lv_rows TYPE i, + lv_formula TYPE string, + ls_settings TYPE zexcel_s_table_settings, + lo_table TYPE REF TO zcl_excel_table, + lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line, + lv_value TYPE string, + lv_syindex TYPE char3. + + CONSTANTS: + lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'B', + lc_top_left_row TYPE zexcel_cell_row VALUE '3'. + + FIELD-SYMBOLS: <ls_field_catalog> TYPE zexcel_s_fieldcatalog, + <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY. + + ls_settings = is_table_settings. + + IF ls_settings-top_left_column IS INITIAL. + ls_settings-top_left_column = lc_top_left_column. + ENDIF. + + IF ls_settings-table_style IS INITIAL. + ls_settings-table_style = zcl_excel_table=>builtinstyle_medium2. + ENDIF. + + IF ls_settings-top_left_row IS INITIAL. + ls_settings-top_left_row = lc_top_left_row. + ENDIF. + + IF it_field_catalog IS NOT SUPPLIED. + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table ). + ELSE. + lt_field_catalog = it_field_catalog. + ENDIF. + + CREATE OBJECT lo_table. + lo_table->settings = ls_settings. + lo_table->set_data( ir_data = ip_table ). + lv_id = me->excel->get_next_table_id( ). + lo_table->set_id( iv_id = lv_id ). +* lo_table->fieldcat = lt_field_catalog[]. + + me->tables->add( lo_table ). + + lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). + lv_row_int = ls_settings-top_left_row. + + " get the row number + DESCRIBE TABLE ip_table LINES lv_rows. + +* It is better to loop column by column (only visible column) + LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true. + + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + + " Due restrinction of new table object we cannot have two column with the same name + " Check if a column with the same name exists, if exists add a counter + lv_value = <ls_field_catalog>-scrtext_m. + WHILE 1 = 1. + READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value BINARY SEARCH. + IF sy-subrc <> 0. + <ls_field_catalog>-scrtext_m = lv_value. + INSERT lv_value INTO TABLE lt_column_name_buffer. + EXIT. + ELSE. + lv_syindex = sy-index. + CONCATENATE <ls_field_catalog>-scrtext_m lv_syindex INTO lv_value. + ENDIF. + ENDWHILE. + " First of all write column header + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_value ). + + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <ls_field_catalog>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> + ). + ADD 1 TO lv_row_int. + ENDLOOP. + + " totals + IF <ls_field_catalog>-totals_function IS NOT INITIAL. + lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-scrtext_m ip_function = <ls_field_catalog>-totals_function ). + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = lv_formula ). + ENDIF. + + lv_row_int = ls_settings-top_left_row. + ADD 1 TO lv_column_int. + + " conditional formatting + IF <ls_field_catalog>-cond_style IS NOT INITIAL. + lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header + lv_last_row = ls_settings-top_left_row + lv_rows. + <ls_field_catalog>-cond_style->set_range( ip_start_column = lv_column_alpha + ip_start_row = lv_first_row + ip_stop_column = lv_column_alpha + ip_stop_row = lv_last_row ). + ENDIF. + ENDLOOP. + + " Set field catalog + lo_table->fieldcat = lt_field_catalog[]. + +ENDMETHOD. + + + + + method CONSTRUCTOR. + + me->excel = ip_excel. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + sheet_state = me->c_sheet_state_visible. + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + CREATE OBJECT data_validations. + CREATE OBJECT tables. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +endmethod. + + + method DELETE_MERGE. + + DELETE sheet_content_merge INDEX 1. + DELETE sheet_content_merge INDEX 1. + +endmethod. + + + + method GET_ACTIVE_CELL. + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + +endmethod. + + + + + + + method GET_CELL. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. +endmethod. + + + + + method GET_COLUMN_DIMENSION. + FIELD-SYMBOLS: <fs_column_dimension> LIKE LINE OF column_dimensions. + + READ TABLE me->column_dimensions ASSIGNING <fs_column_dimension> + WITH KEY column = ip_column. + + IF NOT <fs_column_dimension> IS ASSIGNED. + CREATE OBJECT r_column_dimension + EXPORTING + ip_index = ip_column. + APPEND INITIAL LINE TO me->column_dimensions ASSIGNING <fs_column_dimension>. + <fs_column_dimension>-column = ip_column. + <fs_column_dimension>-column_dimension = r_column_dimension. + ELSE. + r_column_dimension = <fs_column_dimension>-column_dimension. + ENDIF. + +endmethod. + + + + method GET_COLUMN_DIMENSIONS. + r_column_dimension[] = me->column_dimensions[]. +endmethod. + + + + method GET_COND_STYLES_ITERATOR. + + eo_iterator = me->conditional_styles->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_ITERATOR. + + eo_iterator = me->data_validations->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_SIZE. + ep_size = me->data_validations->size( ). +endmethod. + + + + method GET_DEFAULT_COLUMN_DIMENSION. + r_column_dimension = me->default_column_dimension. +endmethod. + + + + method GET_DEFAULT_ROW_DIMENSION. + r_row_dimension = me->default_row_dimension. +endmethod. + + + + method GET_DIMENSION_RANGE. + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + ep_dimension_range = upper_cell-cell_coords. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + +endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + method GET_HIGHEST_COLUMN. + me->update_dimension_range( ). + r_highest_column = me->lower_cell-cell_column. +endmethod. + + + + method GET_HIGHEST_ROW. + me->update_dimension_range( ). + r_highest_row = me->lower_cell-cell_row. +endmethod. + + + + method GET_MERGE. + + DATA: lv_column_start TYPE string, + lv_column_end TYPE string, + lv_row TYPE string, + lv_index TYPE sy-tabix, + ls_sheet_content TYPE zexcel_s_cell_data, + range_from TYPE string, + range_to TYPE string, + lv_merge_range TYPE string, + lv_count TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + DESCRIBE TABLE sheet_content_merge LINES lv_count. + + WHILE lv_count GT lv_index. +* LOOP AT sheet_content_merge ASSIGNING <fs_sheet_content>. + lv_index = lv_index + 1. + READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. + lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). + lv_row = <fs_sheet_content>-cell_row. + SHIFT lv_column_start RIGHT DELETING TRAILING space. + SHIFT lv_column_start LEFT DELETING LEADING space. + SHIFT lv_row RIGHT DELETING TRAILING space. + SHIFT lv_row LEFT DELETING LEADING space. + CONCATENATE lv_column_start lv_row + INTO range_from. + + lv_index = lv_index + 1. + READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. + lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). + SHIFT lv_column_end RIGHT DELETING TRAILING space. + SHIFT lv_column_end LEFT DELETING LEADING space. + CONCATENATE lv_column_end lv_row + INTO range_to. + + CONCATENATE range_from range_to INTO lv_merge_range + SEPARATED BY ':'. + APPEND lv_merge_range TO merge_range. + ENDWHILE. +* ENDLOOP. + +* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 1. +* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. +* lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). +* lv_row = <fs_sheet_content>-cell_row. +* SHIFT lv_column_start RIGHT DELETING TRAILING space. +* SHIFT lv_column_start LEFT DELETING LEADING space. +* SHIFT lv_row RIGHT DELETING TRAILING space. +* SHIFT lv_row LEFT DELETING LEADING space. +* CONCATENATE lv_column_start lv_row +* INTO range_from. +* ENDIF. +* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 2. +* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. +* lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). +* SHIFT lv_column_end RIGHT DELETING TRAILING space. +* SHIFT lv_column_end LEFT DELETING LEADING space. +* CONCATENATE lv_column_end lv_row +* INTO range_to. +* ENDIF. + +* IF range_from NE space AND range_to NE space. +* CONCATENATE range_from range_to INTO ep_merge_range +* SEPARATED BY ':'. +* ENDIF. + +endmethod. + + + + + method GET_ROW_DIMENSION. + FIELD-SYMBOLS: <fs_row_dimension> LIKE LINE OF row_dimensions. + + READ TABLE me->row_dimensions ASSIGNING <fs_row_dimension> + WITH KEY row = ip_row. + + IF NOT <fs_row_dimension> IS ASSIGNED. + CREATE OBJECT r_row_dimension + EXPORTING + ip_index = ip_row. + APPEND INITIAL LINE TO me->row_dimensions ASSIGNING <fs_row_dimension>. + <fs_row_dimension>-row = ip_row. + <fs_row_dimension>-row_dimension = r_row_dimension. + ELSE. + r_row_dimension = <fs_row_dimension>-row_dimension. + ENDIF. + +endmethod. + + + + method GET_ROW_DIMENSIONS. + r_row_dimension[] = me->row_dimensions[]. +endmethod. + + + + method GET_TABLES_ITERATOR. + eo_iterator = tables->get_iterator( ). +endmethod. + + + + method GET_TABLES_SIZE. + ep_size = tables->size( ). +endmethod. + + + + + + + + method SET_CELL. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string, + lv_value TYPE zexcel_cell_value, + lv_data_type TYPE zexcel_cell_data_type, + lv_value_type TYPE abap_typekind, + lo_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Pleas provide the vaue or formula'. + ENDIF. + + lv_style_guid = ip_style. + + IF ip_value IS SUPPLIED. + DESCRIBE FIELD ip_value TYPE lv_value_type. + CASE lv_value_type. + WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2 OR + cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = ip_value ). + + WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string OR cl_abap_typedescr=>typekind_num. + lv_value = ip_value. + lv_data_type = 's'. + + WHEN cl_abap_typedescr=>typekind_date. + lv_value = zcl_excel_common=>date_to_excel_string( ip_value = ip_value ). + + IF ip_style IS NOT SUPPLIED. "get default date format for user in case parameter is initial + lo_style = excel->add_new_style( ). + cl_abap_datfm=>get_date_format_des( IMPORTING ex_dateformat = lo_style->number_format->format_code ). + lv_style_guid = lo_style->get_guid( ). + ENDIF. + + WHEN cl_abap_typedescr=>typekind_time. + lv_value = zcl_excel_common=>time_to_excel_string( ip_value = ip_value ). + + IF ip_style IS NOT SUPPLIED. "get default time format for user in case parameter is initial + lo_style = excel->add_new_style( ). + lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_date_time6. + lv_style_guid = lo_style->get_guid( ). + ENDIF. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid data type of input value'. + ENDCASE. + ENDIF. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_value = lv_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = lv_style_guid. + <fs_sheet_content>-data_type = lv_data_type. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = lv_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = lv_style_guid. + ls_sheet_content-data_type = lv_data_type. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content. + SORT sheet_content BY cell_row cell_column. + " me->update_dimension_range( ). + + ENDIF. + +endmethod. + + + + + + + method SET_CELL_STYLE. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string, + lo_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_style_guid = ip_style. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_style = lv_style_guid. + ELSE. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'No Data in this cell'. + ENDIF. + +endmethod. + + + + + + method SET_MERGE. + + DATA: lv_column_start TYPE zexcel_cell_column, + lv_column_end TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). + lv_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). + + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column_start. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column_start lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content_merge. + + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column_end. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column_end lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content_merge. + +endmethod. + + + + + + + + + method SET_TABLE. + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE '2', + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_body_style ). + ADD 1 TO lv_row_int. + ENDLOOP. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDLOOP. + +endmethod. + + + method UPDATE_DIMENSION_RANGE. + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk new file mode 100644 index 0000000..77ee784 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk @@ -0,0 +1,121 @@ + + + class ZCL_EXCEL_WORKSHEETS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +public section. + + data ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET value 1. "#EC NOTEXT . + data NAME type ZEXCEL_WORKSHEETS_NAME value 'Worksheets'. "#EC NOTEXT . + + methods ADD + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +private section. + + data WORKSHEETS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method ADD. + + worksheets->add( ip_worksheet ). + +endmethod. + + + method CLEAR. + + worksheets->clear( ). + +endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT worksheets. + +endmethod. + + + + + method GET. + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). + +endmethod. + + + + method GET_ITERATOR. + + eo_iterator ?= worksheets->if_object_collection~get_iterator( ). + +endmethod. + + + + method IS_EMPTY. + + is_empty = worksheets->if_object_collection~is_empty( ). + +endmethod. + + + + method REMOVE. + + worksheets->remove( ip_worksheet ). + +endmethod. + + + + method SIZE. + + ep_size = worksheets->if_object_collection~size( ). + +endmethod. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk new file mode 100644 index 0000000..9fd066d --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk @@ -0,0 +1,240 @@ + + + class ZCL_EXCEL_WORKSHEET_COLUMNDIME definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET_COLUMNDIME +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + methods CONSTRUCTOR + importing + !IP_INDEX type ZEXCEL_CELL_COLUMN_ALPHA . + methods GET_COLUMN_INDEX + returning + value(R_COLUMN_INDEX) type INT4 . + methods GET_OUTLINE_LEVEL + returning + value(R_OUTLINE_LEVEL) type INT4 . + methods GET_WIDTH + returning + value(R_WIDTH) type FLOAT . + methods GET_XF_INDEX + returning + value(R_XF_INDEX) type INT4 . + methods SET_COLUMN_INDEX + importing + !IP_INDEX type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods SET_OUTLINE_LEVEL + importing + !IP_OUTLINE_LEVEL type INT4 . + methods SET_WIDTH + importing + !IP_WIDTH type FLOAT + returning + value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods SET_XF_INDEX + importing + !IP_XF_INDEX type INT4 + returning + value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods GET_AUTO_SIZE + returning + value(R_AUTO_SIZE) type ABAP_BOOL . + methods GET_COLLAPSED + returning + value(R_COLLAPSED) type ABAP_BOOL . + methods GET_VISIBLE + returning + value(R_VISIBLE) type ABAP_BOOL . + methods SET_AUTO_SIZE + importing + !IP_AUTO_SIZE type ABAP_BOOL + returning + value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods SET_COLLAPSED + importing + !IP_COLLAPSED type ABAP_BOOL + returning + value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods SET_VISIBLE + importing + !IP_VISIBLE type ABAP_BOOL + returning + value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + *"* protected components of class ZCL_EXCEL_WORKSHEET_COLUMNDIME +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET_COLUMNDIME +*"* do not include other source files here!!! +private section. + + data COLUMN_INDEX type INT4 . + data WIDTH type FLOAT . + type-pools ABAP . + data AUTO_SIZE type ABAP_BOOL . + data VISIBLE type ABAP_BOOL . + data OUTLINE_LEVEL type INT4 . + data COLLAPSED type ABAP_BOOL . + data XF_INDEX type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + ABAP + + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 Gregor Wolf +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Gregor Wolf +* @homepage http://www.computerservice-wolf.com/ +* @copyright Copyright (c) 2010 Gregor Wolf +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.5, 2010-08-11 +********************************************************************** + me->column_index = zcl_excel_common=>convert_column2int( ip_index ). + me->width = -1. + me->auto_size = abap_false. + me->visible = abap_true. + me->outline_level = 0. + me->collapsed = abap_false. + + " set default index to cellXf + me->xf_index = 0. +ENDMETHOD. + + + + METHOD get_auto_size. + r_auto_size = me->auto_size. +ENDMETHOD. + + + + METHOD GET_COLLAPSED. + r_Collapsed = me->Collapsed. +ENDMETHOD. + + + + METHOD get_column_index. + r_column_index = me->column_index. +ENDMETHOD. + + + + METHOD get_outline_level. + r_outline_level = me->outline_level. +ENDMETHOD. + + + + METHOD GET_VISIBLE. + r_Visible = me->Visible. +ENDMETHOD. + + + + METHOD GET_WIDTH. + r_WIDTH = me->WIDTH. +ENDMETHOD. + + + + METHOD get_xf_index. + r_xf_index = me->xf_index. +ENDMETHOD. + + + + + METHOD set_auto_size. + me->auto_size = ip_auto_size. + r_worksheet_columndime = me. +ENDMETHOD. + + + + + METHOD SET_COLLAPSED. + me->Collapsed = ip_Collapsed. + r_worksheet_columndime = me. +ENDMETHOD. + + + + + METHOD set_column_index. + me->column_index = zcl_excel_common=>convert_column2int( ip_index ). + r_worksheet_columndime = me. +ENDMETHOD. + + + + METHOD set_outline_level. + me->outline_level = ip_outline_level. +ENDMETHOD. + + + + + METHOD SET_VISIBLE. + me->Visible = ip_Visible. + r_worksheet_columndime = me. +ENDMETHOD. + + + + + METHOD set_width. + me->width = ip_width. + r_worksheet_columndime = me. +ENDMETHOD. + + + + + METHOD SET_XF_INDEX. + me->XF_INDEX = ip_XF_INDEX. + r_worksheet_columndime = me. +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_ROWDIMENSI.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_ROWDIMENSI.slnk new file mode 100644 index 0000000..b53547c --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_ROWDIMENSI.slnk @@ -0,0 +1,179 @@ + + + class ZCL_EXCEL_WORKSHEET_ROWDIMENSI definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET_ROWDIMENSI +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + methods CONSTRUCTOR + importing + !IP_INDEX type INT4 default 0 . + methods GET_OUTLINE_LEVEL + returning + value(R_OUTLINE_LEVEL) type INT4 . + methods GET_ROW_INDEX + returning + value(R_ROW_INDEX) type INT4 . + methods GET_XF_INDEX + returning + value(R_XF_INDEX) type INT4 . + methods SET_OUTLINE_LEVEL + importing + !IP_OUTLINE_LEVEL type INT4 + raising + ZCX_EXCEL . + methods SET_ROW_INDEX + importing + !IP_INDEX type INT4 . + methods SET_XF_INDEX + importing + !IP_XF_INDEX type INT4 . + methods GET_ROW_HEIGHT + returning + value(R_ROW_HEIGHT) type FLOAT . + methods SET_ROW_HEIGHT + importing + !IP_ROW_HEIGHT type FLOAT . + methods GET_COLLAPSED + returning + value(R_COLLAPSED) type BOOLEAN . + methods GET_VISIBLE + returning + value(R_VISIBLE) type BOOLEAN . + methods SET_COLLAPSED + importing + !IP_COLLAPSED type BOOLEAN . + methods SET_VISIBLE + importing + !IP_VISIBLE type BOOLEAN . + *"* protected components of class ZCL_EXCEL_WORKSHEET_ROWDIMENSI +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET_ROWDIMENSI +*"* do not include other source files here!!! +private section. + + data ROW_INDEX type INT4 . + data ROW_HEIGHT type FLOAT . + data VISIBLE type BOOLEAN . + data OUTLINE_LEVEL type INT4 value 0. "#EC NOTEXT . + data COLLAPSED type BOOLEAN . + data XF_INDEX type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + ABAP + + + + + + + + + METHOD constructor. + " Initialise values + me->row_index = ip_index. + me->row_height = -1. + me->visible = abap_true. + me->outline_level = 0. + me->collapsed = abap_false. + + " set row dimension as unformatted by default + me->xf_index = 0. +ENDMETHOD. + + + + METHOD get_collapsed. + r_collapsed = me->collapsed. +ENDMETHOD. + + + + METHOD get_outline_level. + r_outline_level = me->outline_level. +ENDMETHOD. + + + + METHOD get_row_height. + r_row_height = me->row_height. +ENDMETHOD. + + + + METHOD get_row_index. + r_row_index = me->row_index. +ENDMETHOD. + + + + METHOD get_visible. + r_visible = me->visible. +ENDMETHOD. + + + + METHOD get_xf_index. + r_xf_index = me->xf_index. +ENDMETHOD. + + + + METHOD set_collapsed. + me->collapsed = ip_collapsed. +ENDMETHOD. + + + + + METHOD set_outline_level. + IF ip_outline_level < 0 + OR ip_outline_level > 7. + + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Outline level must range between 0 and 7.'. + + ENDIF. + me->outline_level = ip_outline_level. +ENDMETHOD. + + + + METHOD set_row_height. + me->row_height = ip_row_height. +ENDMETHOD. + + + + METHOD set_row_index. + me->row_index = ip_index. +ENDMETHOD. + + + + METHOD set_visible. + me->visible = ip_visible. +ENDMETHOD. + + + + METHOD SET_XF_INDEX. + me->XF_INDEX = ip_XF_INDEX. +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk new file mode 100644 index 0000000..291dc83 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -0,0 +1,3147 @@ + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + interfaces ZIF_EXCEL_WRITER . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_TABLE + importing + !IO_TABLE type ref to ZCL_EXCEL_TABLE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + METHOD zif_excel_writer~write_file. + me->excel = io_excel. + ep_file = me->create( ). +ENDMETHOD. + + + + method CREATE. + + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string, + lv_value TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( lo_worksheet ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + lv_content = me->create_xl_table( lo_table ). + + lv_value = lo_table->get_name( ). + CONCATENATE 'xl/tables/' lv_value '.xml' into lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +endmethod. + + + + method CREATE_CONTENT_TYPES. + + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml', + lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i, + lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_worksheet_ct ). + lo_element_root->append_child( lo_element ). + ENDDO. + + lo_iterator = me->excel->get_worksheets_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->get_next( ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->get_next( ). + + lv_value = lo_table->get_name( ). + CONCATENATE '/xl/tables/' lv_value '.xml' INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_table_ct ). + lo_element_root->append_child( lo_element ). + ENDWHILE. + ENDWHILE. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_APP. + + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_CORE. + + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_SHAREDSTRINGS. + + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + + method CREATE_XL_SHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software. you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation. either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY. without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_sheetpr TYPE string VALUE 'sheetPr', + lc_xml_node_outlinepr TYPE string VALUE 'outlinePr', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_cols TYPE string VALUE 'cols', + lc_xml_node_col TYPE string VALUE 'col', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', + lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', + lc_xml_node_formula1 TYPE string VALUE 'formula1', + lc_xml_node_mergecell TYPE string VALUE 'mergeCell', + lc_xml_node_mergecells TYPE string VALUE 'mergeCells', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow', + lc_xml_attr_summaryright TYPE string VALUE 'summaryRight', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_showgridlines TYPE string VALUE 'showGridLines', + lc_xml_attr_showrowcolheaders TYPE string VALUE 'showRowColHeaders', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_min TYPE string VALUE 'min', + lc_xml_attr_max TYPE string VALUE 'max', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_width TYPE string VALUE 'width', + lc_xml_attr_defaultwidth TYPE string VALUE '9.10', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_true TYPE string VALUE 'true', + lc_xml_attr_bestfit TYPE string VALUE 'bestFit', + lc_xml_attr_customheight TYPE string VALUE 'customHeight', + lc_xml_attr_customwidth TYPE string VALUE 'customWidth', + lc_xml_attr_collapsed TYPE string VALUE 'collapsed', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_defaultcolwidth TYPE string VALUE 'defaultColWidth', + lc_xml_attr_outlinelevelrow TYPE string VALUE 'x14ac:outlineLevelRow', + lc_xml_attr_outlinelevelcol TYPE string VALUE 'x14ac:outlineLevelCol', + lc_xml_attr_outlinelevel TYPE string VALUE 'outlineLevel', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', + lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', + lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', + lc_xml_attr_count TYPE string VALUE 'count', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', + lc_xml_node_comp_pref TYPE string VALUE 'x14ac', + lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_value TYPE string, + t_range_merge TYPE string_table, + lv_merge TYPE string, + lv_column_p TYPE zexcel_cell_column_alpha, + lv_column TYPE zexcel_cell_column, + lv_flag TYPE c, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + DATA: default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, + default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data, + <fs_range_merge> LIKE LINE OF t_range_merge. + DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. + FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. + DATA: row_dimensions TYPE zexcel_t_worksheet_rowdimensio. + FIELD-SYMBOLS: <row_dimension> LIKE LINE OF row_dimensions. + DATA: outline_level_row TYPE i VALUE 0, + outline_level_col TYPE i VALUE 0. + DATA: col_count TYPE int4. + DATA: row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: write_current_row TYPE boolean. +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:mc' + value = lc_xml_node_comp_ns ). + lo_element_root->set_attribute_ns( name = 'mc:Ignorable' + value = lc_xml_node_comp_pref ). + lo_element_root->set_attribute_ns( name = 'xmlns:x14ac' + value = lc_xml_node_ig_ns ). + + +********************************************************************** +* STEP 4: Create subnodes + " sheetPr + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetpr + parent = lo_document ). + " TODO tabColor + + " outlinePr + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_outlinepr + parent = lo_document ). + " TODO read attribute summaryBelow and set the attribute to 0 + lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow + value = '1' ). + " TODO read attribute summaryRight and set the attribute to 0 + lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright + value = '1' ). + + lo_element->append_child( lo_element_2 ). + " TODO pageSetUpPr + + lo_element_root->append_child( lo_element ). + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + " showGridLines attribute + lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines + value = 'true' ). + " showRowColHeaders attribute + lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders + value = '1' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + column_dimensions[] = io_worksheet->get_column_dimensions( ). + row_dimensions[] = io_worksheet->get_row_dimensions( ). + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + " defaultRowHeight + default_row_dimension = io_worksheet->get_default_row_dimension( ). + IF default_row_dimension IS BOUND. + IF default_row_dimension->get_row_height( ) >= 0. + lo_element->set_attribute_ns( name = lc_xml_attr_customheight + value = lc_xml_attr_true ). + lv_value = default_row_dimension->get_row_height( ). + ELSE. + lv_value = '12.75'. + ENDIF. + ELSE. + lv_value = '12.75'. + ENDIF. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + " defaultColWidth + default_col_dimension = io_worksheet->get_default_column_dimension( ). + IF default_col_dimension IS BOUND. + IF default_col_dimension->get_width( ) >= 0. + lv_value = default_col_dimension->get_width( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultcolwidth + value = lv_value ). + ENDIF. + ENDIF. + " outlineLevelRow + LOOP AT row_dimensions ASSIGNING <row_dimension>. + IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. + outline_level_row = <row_dimension>-row_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_row. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelrow + value = lv_value ). + " outlineLevelCol + LOOP AT column_dimensions ASSIGNING <column_dimension>. + IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. + outline_level_col = <column_dimension>-column_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_col. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelcol + value = lv_value ). + + lo_element_root->append_child( lo_element ). " sheetFormatPr node + " cols node + IF NOT column_dimensions IS INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_cols + parent = lo_document ). + LOOP AT column_dimensions ASSIGNING <column_dimension>. + " col node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = <column_dimension>-column_dimension->get_column_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min + value = lv_value ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + " Width + IF <column_dimension>-column_dimension->get_width( ) < 0. + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + ELSE. + lv_value = <column_dimension>-column_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lv_value ). + ENDIF. + " Column visibility + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = lc_xml_attr_true ). + ENDIF. + " Auto size? + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit + value = lc_xml_attr_true ). + ENDIF. + " Custom width? + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + + ENDIF. + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + ENDIF. + " Collapsed + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed + value = lc_xml_attr_true ). + ENDIF. + " outlineLevel + IF <column_dimension>-column_dimension->get_outline_level( ) > 0. + lv_value = <column_dimension>-column_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel + value = lv_value ). + ENDIF. + " Style + lv_value = <column_dimension>-column_dimension->get_xf_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + + lo_element->append_child( lo_element_2 ). " col node + ENDLOOP. + ENDIF. + lo_element_root->append_child( lo_element ). " cols node + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + " Get column count + col_count = io_worksheet->get_highest_column( ). + + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + " Add new row + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + " r + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + " Spans + lv_value = col_count. + CONCATENATE '1:' lv_value INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = lv_value ). + row_dimension = io_worksheet->get_row_dimension( <ls_sheet_content>-cell_row ). + " Do we need the row dimension attributes? + IF row_dimension->get_row_height( ) >= 0 OR + row_dimension->get_visible( ) = abap_false OR + row_dimension->get_collapsed( ) = abap_true OR + row_dimension->get_outline_level( ) > 0 OR + row_dimension->get_xf_index( ) <> 0. + " Row dimensions + IF row_dimension->get_row_height( ) >= 0. + lo_element_2->set_attribute_ns( name = 'customHeight' value = '1'). + lv_value = row_dimension->get_row_height( ). + lo_element_2->set_attribute_ns( name = 'ht' value = lv_value ). + ENDIF. + " Row visibility + IF row_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). + ENDIF. + " Collapsed + IF row_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = 'collapsed' value = 'true'). + ENDIF. + " Outline level + IF row_dimension->get_outline_level( ) > 0. + lv_value = row_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = 'outlineLevel' value = lv_value ). + ENDIF. + " Style + IF row_dimension->get_xf_index( ) <> 0. + lv_value = row_dimension->get_xf_index( ). + lo_element_2->set_attribute_ns( name = 's' value = lv_value ). + lo_element_2->set_attribute_ns( name = 'customFormat' value = '1'). + ENDIF. + ENDIF. + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + + " For cells with formula ignore the value - Excel will calculate it + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ELSE. + IF <ls_sheet_content>-data_type IS NOT INITIAL. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = <ls_sheet_content>-data_type ). + ENDIF. + + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF <ls_sheet_content>-data_type EQ 's'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + ENDIF. + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + + + IF io_worksheet->get_data_validations_size( ) GT 0. + " dataValidations node + lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations + parent = lo_document ). + " Conditional formatting node + lo_iterator = io_worksheet->get_data_validations_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_data_validation ?= lo_iterator->get_next( ). + " dataValidation node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation + parent = lo_document ). + lv_value = lo_data_validation->type. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + IF lo_data_validation->allowblank EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank + value = lv_value ). + IF lo_data_validation->showinputmessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage + value = lv_value ). + IF lo_data_validation->showerrormessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage + value = lv_value ). + lv_cell_row_s = lo_data_validation->cell_row. + SHIFT lv_cell_row_s RIGHT DELETING TRAILING space. + SHIFT lv_cell_row_s LEFT DELETING LEADING space. + CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + " formula1 node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 + parent = lo_document ). + lv_value = lo_data_validation->value. + lo_element_3->set_value( lv_value ). + + lo_element_2->append_child( lo_element_3 ). " formula1 node + + lo_element->append_child( lo_element_2 ). " dataValidation node + ENDWHILE. + lo_element_root->append_child( lo_element ). " dataValidations node + ENDIF. + + t_range_merge = io_worksheet->get_merge( ). + IF t_range_merge IS NOT INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_mergecells + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + LOOP AT t_range_merge ASSIGNING <fs_range_merge>. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_mergecell + parent = lo_document ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_ref + value = <fs_range_merge> ). + lo_element->append_child( lo_element_2 ). + lo_element_root->append_child( lo_element ). + io_worksheet->delete_merge( ). + ENDLOOP. + ENDIF. + + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +* tables + DATA lv_table_count TYPE i. + + lv_table_count = io_worksheet->get_tables_size( ). + IF lv_table_count > 0. + lo_element = lo_document->create_simple_element( name = 'tableParts' + parent = lo_document ). + lv_value = lv_table_count. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lv_table_count = 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_iterator->get_next( ). + add 1 to lv_table_count. + + lv_value = lv_table_count. + condense lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element_2 = lo_document->create_simple_element( name = 'tablePart' + parent = lo_element ). + lo_element_2->set_attribute_ns( name = 'r:id' + value = lv_value ). + lo_element->append_child( lo_element_2 ). + + ENDWHILE. + + lo_element_root->append_child( lo_element ). + + ENDIF. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + method CREATE_XL_SHEET_RELS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_value TYPE string, + lv_counter TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Add sheet Relationship nodes here + lv_counter = 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_iterator->get_next( ). + ADD 1 TO lv_counter. + + lv_value = lv_counter. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_table_tp ). + + lv_value = lo_table->get_name( ). + CONCATENATE '../tables/' lv_value '.xml' INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element_root->append_child( lo_element ). + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + METHOD create_xl_styles. + + +** Constant node name + CONSTANTS: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " numfmt + lc_xml_node_numfmts TYPE string VALUE 'numFmts', + lc_xml_node_numfmt TYPE string VALUE 'numFmt', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + lc_xml_node_alignment TYPE string VALUE 'alignment', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + lc_xml_attr_applyalignment TYPE string VALUE 'applyAlignment', + lc_xml_attr_horizontal TYPE string VALUE 'horizontal', + lc_xml_attr_formatcode TYPE string VALUE 'formatCode', + lc_xml_attr_vertical TYPE string VALUE 'vertical', + lc_xml_attr_wraptext TYPE string VALUE 'wrapText', + lc_xml_attr_textrotation TYPE string VALUE 'textRotation', + lc_xml_attr_shrinktofit TYPE string VALUE 'shrinkToFit', + lc_xml_attr_indent TYPE string VALUE 'indent', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + CONSTANTS: lc_on TYPE string VALUE '1', + lc_off TYPE string VALUE '0'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_numfmts TYPE REF TO if_ixml_element, + lo_element_numfmt TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + lt_numfmts TYPE zexcel_t_style_numfmt, + ls_numfmt TYPE zexcel_s_style_numfmt, + lt_alignments TYPE zexcel_t_style_alignment, + ls_alignment TYPE zexcel_s_style_alignment, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i, + lv_align_flag TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + + lo_element_numfmts = lo_document->create_simple_element( name = lc_xml_node_numfmts + parent = lo_document ). + + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_alignment = lo_style->alignment->get_structure( ). + ls_numfmt = lo_style->number_format->get_structure( ). + + CLEAR ls_cellxfs. + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress alignment + READ TABLE lt_alignments FROM ls_alignment TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-alignmentid = sy-tabix. + ELSE. + APPEND ls_alignment TO lt_alignments. + DESCRIBE TABLE lt_alignments LINES ls_cellxfs-alignmentid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + +* Compress number formats + IF ls_numfmt IS NOT INITIAL. + READ TABLE lt_numfmts FROM ls_numfmt TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-numfmtid = sy-tabix. + ELSE. + APPEND ls_numfmt TO lt_numfmts. + DESCRIBE TABLE lt_numfmts LINES ls_cellxfs-numfmtid. + ENDIF. + ADD zcl_excel_common=>c_excel_numfmt_offset TO ls_cellxfs-numfmtid. " Add OXML offset for custom styles + ls_cellxfs-applynumberformat = 1. + ELSE. + ls_cellxfs-applynumberformat = 0. + ENDIF. + + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-alignmentid NE 0. + ls_cellxfs-applyalignment = 1. + ELSE. + ls_cellxfs-applyalignment = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create numfmt elements + LOOP AT lt_numfmts INTO ls_numfmt. + lo_element_numfmt = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_document ). + lv_value = sy-tabix + zcl_excel_common=>c_excel_numfmt_offset. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + lv_value = ls_numfmt-numfmt. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_formatcode + value = lv_value ). + lo_element_numfmts->append_child( lo_element_numfmt ). + ENDLOOP. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_numfmts ). + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lc_off ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyalignment EQ 1. " depends on each style not for all the sheet + MOVE ls_cellxfs-applyalignment TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyalignment + value = lv_value ). + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_alignment + parent = lo_document ). + ADD 1 TO ls_cellxfs-alignmentid. "Table index starts from 1 + READ TABLE lt_alignments INTO ls_alignment INDEX ls_cellxfs-alignmentid. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + IF ls_alignment-horizontal IS NOT INITIAL. + MOVE ls_alignment-horizontal TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_horizontal + value = lv_value ). + ENDIF. + IF ls_alignment-vertical IS NOT INITIAL. + MOVE ls_alignment-vertical TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_vertical + value = lv_value ). + ENDIF. + IF ls_alignment-wraptext EQ abap_true. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_wraptext + value = lc_on ). + ENDIF. + IF ls_alignment-textrotation IS NOT INITIAL. + MOVE ls_alignment-textrotation TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_textrotation + value = lv_value ). + ENDIF. + IF ls_alignment-shrinktofit EQ abap_true. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_shrinktofit + value = lc_on ). + ENDIF. + IF ls_alignment-indent IS NOT INITIAL. + MOVE ls_alignment-indent TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indent + value = lv_value ). + ENDIF. + + lo_element->append_child( lo_sub_element_2 ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = lc_off ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = zcl_excel_table=>builtinstyle_medium9 ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = zcl_excel_table=>builtinstyle_pivot_light16 ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + METHOD create_xl_table. + + DATA: lc_xml_node_table TYPE string VALUE 'table', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_display_name TYPE string VALUE 'displayName', + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_totals TYPE string VALUE 'totalsRowShown', + " Node namespace + lc_xml_node_table_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + + lv_table_name TYPE string, + lv_id TYPE i, + lv_syindex TYPE char3, + lv_ref TYPE string, + lv_value TYPE string, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_num_columns TYPE i, + ls_fieldcat TYPE zexcel_s_fieldcatalog. + + +********************************************************************** +* STEP 1: Create xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node table + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table + parent = lo_document ). + + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_table_ns ). + + lv_id = io_table->get_id( ). + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + + lv_table_name = io_table->get_name( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_name + value = lv_table_name ). + + lo_element_root->set_attribute_ns( name = lc_xml_attr_display_name + value = lv_table_name ). + + lv_ref = io_table->get_reference( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_ref + value = lv_ref ). + IF io_table->has_totals( ) = abap_true. + lo_element_root->set_attribute_ns( name = 'totalsRowCount' + value = '1' ). + ELSE. + lo_element_root->set_attribute_ns( name = lc_xml_attr_totals + value = '0' ). + ENDIF. + +********************************************************************** +* STEP 4: Create subnodes + + " autoFilter + lo_element = lo_document->create_simple_element( name = 'autoFilter' + parent = lo_document ). + + lv_ref = io_table->get_reference( ip_include_totals_row = abap_false ). + lo_element->set_attribute_ns( name = 'ref' + value = lv_ref ). + + lo_element_root->append_child( lo_element ). + + "columns + lo_element = lo_document->create_simple_element( name = 'tableColumns' + parent = lo_document ). + +* lo_columns = io_table->get_columns( ). + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + ADD 1 TO lv_num_columns. + ENDLOOP. + + lv_value = lv_num_columns. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lo_element_root->append_child( lo_element ). + + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn' + parent = lo_element ). + + lv_value = ls_fieldcat-position. + SHIFT lv_value LEFT DELETING LEADING '0'. + lo_element2->set_attribute_ns( name = 'id' + value = lv_value ). + lv_value = ls_fieldcat-scrtext_m. + lo_element2->set_attribute_ns( name = 'name' + value = lv_value ). + + IF ls_fieldcat-totals_function IS NOT INITIAL. + lo_element2->set_attribute_ns( name = 'totalsRowFunction' + value = ls_fieldcat-totals_function ). + ENDIF. + + lo_element->append_child( lo_element2 ). + ENDLOOP. + + + lo_element = lo_document->create_simple_element( name = 'tableStyleInfo' + parent = lo_element_root ). + + lo_element->set_attribute_ns( name = 'name' + value = io_table->settings-table_style ). + + lo_element->set_attribute_ns( name = 'showFirstColumn' + value = '0' ). + + lo_element->set_attribute_ns( name = 'showLastColumn' + value = '0' ). + + IF io_table->settings-show_row_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showRowStripes' + value = lv_value ). + + IF io_table->settings-show_column_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showColumnStripes' + value = lv_value ). + + lo_element_root->append_child( lo_element ). +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + method CREATE_XL_THEME. + + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +endmethod. + + + + method CREATE_XL_WORKBOOK. + + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + + " ranges node + lo_element = lo_document->create_simple_element( name = lc_xml_node_definedNames + parent = lo_document ). + lo_iterator = excel->get_ranges_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedName + parent = lo_document ). + lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( lv_value ). + lo_element->append_child( lo_sub_element ). " range node + ENDWHILE. + lo_element_root->append_child( lo_element )." ranges node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + method FLAG2BOOL. + + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +endmethod. + + + + + method GET_SHARED_STRING_INDEX. + + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +endmethod. + + diff --git a/ZA2X/CLAS/ZCX_EXCEL.slnk b/ZA2X/CLAS/ZCX_EXCEL.slnk new file mode 100644 index 0000000..4bb07f7 --- /dev/null +++ b/ZA2X/CLAS/ZCX_EXCEL.slnk @@ -0,0 +1,59 @@ + + + class ZCX_EXCEL definition + public + inheriting from CX_STATIC_CHECK + final + create public . + +*"* public components of class ZCX_EXCEL +*"* do not include other source files here!!! +public section. + + constants ZCX_EXCEL type SOTR_CONC value 'DFA64849FDF4F6F1B39A000C29B7D360'. "#EC NOTEXT + data ERROR type STRING . + + methods CONSTRUCTOR + importing + !TEXTID like TEXTID optional + !PREVIOUS like PREVIOUS optional + !ERROR type STRING optional . + *"* protected components of class ZCX_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCX_EXCEL +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + method CONSTRUCTOR. +CALL METHOD SUPER->CONSTRUCTOR +EXPORTING +TEXTID = TEXTID +PREVIOUS = PREVIOUS +. + IF textid IS INITIAL. + me->textid = ZCX_EXCEL . + ENDIF. +me->ERROR = ERROR . +endmethod. + + diff --git a/ZA2X/DOMA/ZEXCEL_FORMAT.slnk b/ZA2X/DOMA/ZEXCEL_FORMAT.slnk new file mode 100644 index 0000000..101645f --- /dev/null +++ b/ZA2X/DOMA/ZEXCEL_FORMAT.slnk @@ -0,0 +1,5 @@ + + + + + diff --git a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk new file mode 100644 index 0000000..67203ff --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk new file mode 100644 index 0000000..ddb21c2 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk new file mode 100644 index 0000000..9a21478 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk new file mode 100644 index 0000000..9ebb970 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_BORDER.slnk b/ZA2X/DTEL/ZEXCEL_BORDER.slnk new file mode 100644 index 0000000..07c427c --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_BORDER.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_BREAK.slnk b/ZA2X/DTEL/ZEXCEL_BREAK.slnk new file mode 100644 index 0000000..cd1a862 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_BREAK.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk new file mode 100644 index 0000000..6c89914 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk new file mode 100644 index 0000000..a19f23d --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk new file mode 100644 index 0000000..abb4860 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk new file mode 100644 index 0000000..a9dac75 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk new file mode 100644 index 0000000..8a57233 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk new file mode 100644 index 0000000..1765321 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk new file mode 100644 index 0000000..ff8d5e4 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk new file mode 100644 index 0000000..b8df375 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk new file mode 100644 index 0000000..191fab9 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_COLOR.slnk b/ZA2X/DTEL/ZEXCEL_COLOR.slnk new file mode 100644 index 0000000..36403e8 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_COLOR.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk new file mode 100644 index 0000000..04abf58 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk new file mode 100644 index 0000000..8ebfda7 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk new file mode 100644 index 0000000..0c9fd38 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk new file mode 100644 index 0000000..dc388d6 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk new file mode 100644 index 0000000..8a26903 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk new file mode 100644 index 0000000..575b6db --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk new file mode 100644 index 0000000..5dc6210 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk new file mode 100644 index 0000000..92195ab --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk new file mode 100644 index 0000000..5f69802 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk new file mode 100644 index 0000000..49a45e1 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL.slnk b/ZA2X/DTEL/ZEXCEL_FILL.slnk new file mode 100644 index 0000000..016192c --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_FILL.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk new file mode 100644 index 0000000..b354d80 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FONT.slnk b/ZA2X/DTEL/ZEXCEL_FONT.slnk new file mode 100644 index 0000000..31c4572 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_FONT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk new file mode 100644 index 0000000..9a4f160 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk new file mode 100644 index 0000000..645ec0b --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_INDENT.slnk b/ZA2X/DTEL/ZEXCEL_INDENT.slnk new file mode 100644 index 0000000..7685234 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_INDENT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk new file mode 100644 index 0000000..2583e5d --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk new file mode 100644 index 0000000..894b12d --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk new file mode 100644 index 0000000..04fcb7a --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk new file mode 100644 index 0000000..8fd4a2e --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk new file mode 100644 index 0000000..89ea6d3 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk new file mode 100644 index 0000000..41f9da8 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk new file mode 100644 index 0000000..74847bc --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk new file mode 100644 index 0000000..558c0e7 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk new file mode 100644 index 0000000..32a9856 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk new file mode 100644 index 0000000..5d7f44b --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk new file mode 100644 index 0000000..c4e5908 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk new file mode 100644 index 0000000..92b73a1 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk new file mode 100644 index 0000000..fefe0fb --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk new file mode 100644 index 0000000..f5df235 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk new file mode 100644 index 0000000..41dd250 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk new file mode 100644 index 0000000..920e1f6 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk new file mode 100644 index 0000000..33b6ebf --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk new file mode 100644 index 0000000..f185821 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk new file mode 100644 index 0000000..f53f2d1 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk new file mode 100644 index 0000000..c4208b6 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk new file mode 100644 index 0000000..0bf438c --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk new file mode 100644 index 0000000..e8a09ea --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_TITLE.slnk new file mode 100644 index 0000000..e363d86 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_TITLE.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk new file mode 100644 index 0000000..92e23ba --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk new file mode 100644 index 0000000..a616e27 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk new file mode 100644 index 0000000..9985c78 --- /dev/null +++ b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/INTF/ZIF_EXCEL_READER.slnk b/ZA2X/INTF/ZIF_EXCEL_READER.slnk new file mode 100644 index 0000000..d0aab45 --- /dev/null +++ b/ZA2X/INTF/ZIF_EXCEL_READER.slnk @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk b/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk new file mode 100644 index 0000000..e4b0a67 --- /dev/null +++ b/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ZA2X/PROG/ZAKE_SVN_A2X.slnk b/ZA2X/PROG/ZAKE_SVN_A2X.slnk new file mode 100644 index 0000000..b144411 --- /dev/null +++ b/ZA2X/PROG/ZAKE_SVN_A2X.slnk @@ -0,0 +1,132 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report Z_ZAKE_SVN +*& +*&---------------------------------------------------------------------* +*& Checkout / Checkin the ZAKE_SVN Project +*& +*&---------------------------------------------------------------------* + +REPORT zake_svn_a2x. + +CONSTANTS cl_svn TYPE seoclsname VALUE 'ZCL_ZAKE_SVN'. +CONSTANTS cl_tortoise_svn TYPE seoclsname VALUE 'ZCL_ZAKE_TORTOISE_SVN'. + +DATA package TYPE devclass. +DATA zake TYPE REF TO zake. + +DATA zake_objects TYPE scts_tadir. + +DATA files TYPE string_table. +DATA file LIKE LINE OF files. + +DATA zake_build TYPE string. +DATA zake_nuggetname TYPE string. + +DATA comment_str TYPE string. +DATA loclpath_str TYPE string. +DATA svnpath_str TYPE string. +DATA username_str TYPE string. +DATA password_str TYPE string. +DATA class TYPE seoclsname. + +DATA: ex TYPE REF TO zcx_saplink, + message TYPE string. + +SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE a. +PARAMETERS: + checkout TYPE flag RADIOBUTTON GROUP act, + update TYPE flag RADIOBUTTON GROUP act DEFAULT 'X', + checkin TYPE flag RADIOBUTTON GROUP act. +SELECTION-SCREEN END OF BLOCK a. + +SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE b. +PARAMETERS: + svn TYPE flag RADIOBUTTON GROUP cl, + tortoise TYPE flag RADIOBUTTON GROUP cl. +SELECTION-SCREEN END OF BLOCK b. + +SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE c. +PARAMETERS: + loclpath TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx' LOWER CASE OBLIGATORY, + zakebuil TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx\build\NUGG_ABAP2XLSX_V_1_0.nugg' LOWER CASE OBLIGATORY, + zakenugg TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx\nuggs\NUGG_ABAP2XLSX_V_1_0.nugg' LOWER CASE OBLIGATORY, + svnpath TYPE char512 DEFAULT 'https://abap2xlsx.googlecode.com/svn/trunk/abap2xlsx' LOWER CASE OBLIGATORY, + comment TYPE char512 DEFAULT '' LOWER CASE, + username TYPE char512 LOWER CASE, + password TYPE char512 LOWER CASE, + testrun TYPE flag DEFAULT 'X'. +SELECTION-SCREEN END OF BLOCK c. + +INITIALIZATION. + a = 'Action'. + b = 'Version Controll Program'. + c = 'Parameters'. + +START-OF-SELECTION. + + svnpath_str = svnpath. + loclpath_str = loclpath. + zake_build = zakebuil. + zake_nuggetname = zakenugg. + comment_str = comment. + + SELECT * INTO TABLE zake_objects FROM tadir WHERE devclass = 'ZABAP2XLSX'. + DELETE zake_objects WHERE object = 'DEVC'. + + TRY. + IF svn = 'X'. + class = cl_svn. + ELSE. + class = cl_tortoise_svn. + ENDIF. + + CREATE OBJECT zake + TYPE + (class) + EXPORTING + i_svnpath = svnpath_str + i_localpath = loclpath_str. + zake->set_testrun( testrun ). + + IF checkin = 'X'. + zake->set_package( 'ZA2X' ). + zake->set_checkin_objects( zake_objects ). + zake->create_slinkees( zake_nuggetname ). + " Build a complete package for download +* zake->set_package( 'ZA2X' ). +* zake->set_checkin_objects( zake_objects ). +* " Let's add the CMD Scripts to the complete package +* CONCATENATE loclpath 'bin/svn-script.cmd' INTO file. +* APPEND file TO files. +* CONCATENATE loclpath 'bin/tortoise-svn-script.cmd' INTO file. +* APPEND file TO files. +* zake->add_files_to_zip( files ). +* " We don't want that for the complete Package Slinkees are created +* " in the ZAKE folder +* zake->download_slinkees_to_lm = space. +* zake->download_nugget_to_lm = space. +* zake->create_slinkees( zake_nuggetname ). + IF testrun IS INITIAL. + zake->checkin( comment_str ). + ENDIF. + ELSE. + IF update = 'X'. + zake->update( ). + ELSE. + zake->checkout( ). + ENDIF. + " zake->install_slinkees_from_lm( testrun ). + zake->install_objects( zake_objects ). + ENDIF. + CATCH zcx_saplink INTO ex. + message = ex->msg. + WRITE: / 'An Error occured: ', message. + ENDTRY. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL.slnk b/ZA2X/PROG/ZDEMO_EXCEL.slnk new file mode 100644 index 0000000..e84fc3d --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL.slnk @@ -0,0 +1,34 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel. + +SUBMIT zdemo_excel1 AND RETURN. " Hello world +SUBMIT zdemo_excel2 AND RETURN. " Styles +SUBMIT zdemo_excel3 AND RETURN. " iTab binding +SUBMIT zdemo_excel4 AND RETURN. " Multi sheets +SUBMIT zdemo_excel5 AND RETURN. " Conditional formatting +SUBMIT zdemo_excel6 AND RETURN. " Formulas +SUBMIT zdemo_excel7 AND RETURN. " Conditional formatting +SUBMIT zdemo_excel8 AND RETURN. " Ranges +SUBMIT zdemo_excel9 AND RETURN. " Data validation +SUBMIT zdemo_excel10 AND RETURN. " Bind table with field catalog +" zdemo_excel11 is not added because it has a selection screen and +" you also need to have business partners maintained in transaction BP +SUBMIT zdemo_excel12 AND RETURN. " Column size +SUBMIT zdemo_excel13 AND RETURN. " Merge cell +SUBMIT zdemo_excel14 AND RETURN. " Alignment +SUBMIT zdemo_excel15 AND RETURN. " Read Excel and write it back + diff --git a/ZA2X/PROG/ZDEMO_EXCEL1.slnk b/ZA2X/PROG/ZDEMO_EXCEL1.slnk new file mode 100644 index 0000000..49ca2b5 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL1.slnk @@ -0,0 +1,56 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel1. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ). + +CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HelloWorld.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL10.slnk b/ZA2X/PROG/ZDEMO_EXCEL10.slnk new file mode 100644 index 0000000..2967939 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL10.slnk @@ -0,0 +1,102 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel10. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional2 TYPE REF TO zcl_excel_style_conditional, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_field_catalog TYPE zexcel_s_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +"Conditional style +lo_style_conditional2 = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional2->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional2->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional2->priority = 1. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. + +lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). + +LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'CARRID'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_count. + WHEN 'CONNID'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FLDATE'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'PRICE'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. + <fs_field_catalog>-cond_style = lo_style_conditional2. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. +ENDLOOP. + +ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. + +lo_worksheet->bind_table( ip_table = lt_test + is_table_settings = ls_table_settings + it_field_catalog = lt_field_catalog ). + +column_dimension = lo_worksheet->get_column_dimension( 'D' ). "make date field a bit wider +column_dimension->set_width( 13 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTabFieldCatalog.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL11.slnk b/ZA2X/PROG/ZDEMO_EXCEL11.slnk new file mode 100644 index 0000000..4f262fa --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL11.slnk @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL11 +*& Export Organisation and Contact Persons using ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel11. + +TYPE-POOLS: abap. + +DATA: central_search TYPE bapibus1006_central_search, + addressdata_search TYPE bapibus1006_addr_search, + others_search TYPE bapibus1006_other_data. +DATA: searchresult TYPE TABLE OF bapibus1006_bp_addr, + return TYPE TABLE OF bapiret2. +DATA: lines TYPE i. +FIELD-SYMBOLS: <searchresult_line> LIKE LINE OF searchresult. +DATA: centraldata TYPE bapibus1006_central, + centraldataperson TYPE bapibus1006_central_person, + centraldataorganization TYPE bapibus1006_central_organ. +DATA: addressdata TYPE bapibus1006_address. +DATA: relationships TYPE TABLE OF bapibus1006_relations. +FIELD-SYMBOLS: <relationship> LIKE LINE OF relationships. +DATA: relationship_centraldata TYPE bapibus1006002_central. +DATA: relationship_addresses TYPE TABLE OF bapibus1006002_addresses. +FIELD-SYMBOLS: <relationship_address> LIKE LINE OF relationship_addresses. + +DATA: lt_download TYPE TABLE OF zexcel_s_org_rel. +FIELD-SYMBOLS: <download> LIKE LINE OF lt_download. + +PARAMETERS: md TYPE flag RADIOBUTTON GROUP act. + +SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE a. +PARAMETERS: partnerc TYPE bu_type DEFAULT 2, " Organizations + postlcod TYPE ad_pstcd1 DEFAULT '8334*', + country TYPE land1 DEFAULT 'DE', + maxsel TYPE bu_maxsel DEFAULT 100. +SELECTION-SCREEN END OF BLOCK a. + +PARAMETERS: rel TYPE flag RADIOBUTTON GROUP act DEFAULT 'X'. + +SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE b. +PARAMETERS: reltyp TYPE bu_reltyp DEFAULT 'BUR011', + partner TYPE bu_partner DEFAULT '191'. +SELECTION-SCREEN END OF BLOCK b. + +INITIALIZATION. + a = 'Select by master data'. + b = 'Select by relationship'. + +START-OF-SELECTION. + IF md = abap_true. + " Read all Companies by Master Data + central_search-partnercategory = partnerc. + addressdata_search-postl_cod1 = postlcod. + addressdata_search-country = country. + others_search-maxsel = maxsel. + others_search-no_search_for_contactperson = 'X'. + + CALL FUNCTION 'BAPI_BUPA_SEARCH_2' + EXPORTING + centraldata = central_search + addressdata = addressdata_search + OTHERS = others_search + TABLES + searchresult = searchresult + return = return. + + SORT searchresult BY partner. + DELETE ADJACENT DUPLICATES FROM searchresult COMPARING partner. + ELSEIF rel = abap_true. + " Read by Relationship + SELECT but050~partner1 AS partner FROM but050 + INNER JOIN but000 ON but000~partner = but050~partner1 AND but000~type = '2' + INTO CORRESPONDING FIELDS OF TABLE searchresult + WHERE but050~partner2 = partner + AND but050~reltyp = reltyp. + ENDIF. + + DESCRIBE TABLE searchresult LINES lines. + WRITE: / 'Number of search results: ', lines. + + LOOP AT searchresult ASSIGNING <searchresult_line>. + " Read Details of Organization + CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + centraldataorganization = centraldataorganization. + " Read Standard Address of Organization + CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + addressdata = addressdata. + + " Add Organization to Download + APPEND INITIAL LINE TO lt_download ASSIGNING <download>. + " Fill Organization Partner Numbers + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + businesspartnerout = <download>-org_number + businesspartnerguidout = <download>-org_guid. + + MOVE-CORRESPONDING centraldataorganization TO <download>. + MOVE-CORRESPONDING addressdata TO <download>. + CLEAR: addressdata. + + " Read all Relationships + CLEAR: relationships. + CALL FUNCTION 'BAPI_BUPA_RELATIONSHIPS_GET' + EXPORTING + businesspartner = <searchresult_line>-partner + TABLES + relationships = relationships. + DELETE relationships WHERE relationshipcategory <> 'BUR001'. + LOOP AT relationships ASSIGNING <relationship>. + " Read details of Contact person + CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' + EXPORTING + businesspartner = <relationship>-partner2 + IMPORTING + centraldata = centraldata + centraldataperson = centraldataperson. + " Read details of the Relationship + CALL FUNCTION 'BAPI_BUPR_CONTP_GETDETAIL' + EXPORTING + businesspartner = <relationship>-partner1 + contactperson = <relationship>-partner2 + IMPORTING + centraldata = relationship_centraldata. + " Read relationship address + CLEAR: relationship_addresses. + + CALL FUNCTION 'BAPI_BUPR_CONTP_ADDRESSES_GET' + EXPORTING + businesspartner = <relationship>-partner1 + contactperson = <relationship>-partner2 + TABLES + addresses = relationship_addresses. + + READ TABLE relationship_addresses + ASSIGNING <relationship_address> + WITH KEY standardaddress = 'X'. + + IF <relationship_address> IS ASSIGNED. + " Read Relationship Address + CLEAR addressdata. + CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + addressguid = <relationship_address>-addressguid + IMPORTING + addressdata = addressdata. + + APPEND INITIAL LINE TO lt_download ASSIGNING <download>. + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <relationship>-partner1 + IMPORTING + businesspartnerout = <download>-org_number + businesspartnerguidout = <download>-org_guid. + + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <relationship>-partner2 + IMPORTING + businesspartnerout = <download>-contpers_number + businesspartnerguidout = <download>-contpers_guid. + + MOVE-CORRESPONDING centraldataorganization TO <download>. + MOVE-CORRESPONDING addressdata TO <download>. + MOVE-CORRESPONDING centraldataperson TO <download>. + MOVE-CORRESPONDING relationship_centraldata TO <download>. + + WRITE: / <relationship>-partner1, <relationship>-partner2. + WRITE: centraldataorganization-name1(20), centraldataorganization-name2(10). + WRITE: centraldataperson-firstname(15), centraldataperson-lastname(15). + WRITE: addressdata-street(25), addressdata-house_no, + addressdata-postl_cod1, addressdata-city(25). + ENDIF. + ENDLOOP. + + ENDLOOP. + + DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_body TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + DATA: lv_style_body_odd_guid TYPE zexcel_cell_style, + lv_style_body_even_guid TYPE zexcel_cell_style, + lv_style_body_green TYPE zexcel_cell_style, + lv_style_body_odd_n_guid TYPE zexcel_cell_style, + lv_style_body_even_n_guid TYPE zexcel_cell_style. + + DATA: row TYPE zexcel_cell_row. + + DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + + DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings. + + DATA: column TYPE zexcel_cell_column, + column_alpha TYPE zexcel_cell_column_alpha, + value TYPE zexcel_cell_value. + + FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + "Create style with border odd + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_gray. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_odd_guid = lo_style_body->get_guid( ). + "Create style with border even + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_yellow. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_even_guid = lo_style_body->get_guid( ). + "Create style with border and green fill + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_green. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_green = lo_style_body->get_guid( ). + "Create style numeric with border odd + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_gray. + lo_style_body->borders->allborders = lo_border_dark. + lo_style_body->number_format->format_code = zcl_excel_style_number_format=>c_format_number. + lv_style_body_odd_n_guid = lo_style_body->get_guid( ). + "Create style numeric with border odd + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->borders->allborders = lo_border_dark. + lo_style_body->number_format->format_code = zcl_excel_style_number_format=>c_format_number. + lv_style_body_even_n_guid = lo_style_body->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->title = 'Internal table'. + + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_download ). + + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'ORG_NUMBER'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'CONTPERS_NUMBER'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'NAME1'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'NAME2'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'STREET'. + <fs_field_catalog>-position = 5. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'HOUSE_NO'. + <fs_field_catalog>-position = 6. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'POSTL_COD1'. + <fs_field_catalog>-position = 7. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'CITY'. + <fs_field_catalog>-position = 8. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'COUNTRYISO'. + <fs_field_catalog>-position = 9. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FIRSTNAME'. + <fs_field_catalog>-position = 10. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'LASTNAME'. + <fs_field_catalog>-position = 11. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FUNCTIONNAME'. + <fs_field_catalog>-position = 12. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'DEPARTMENTNAME'. + <fs_field_catalog>-position = 13. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'TEL1_NUMBR'. + <fs_field_catalog>-position = 14. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'TEL1_EXT'. + <fs_field_catalog>-position = 15. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FAX_NUMBER'. + <fs_field_catalog>-position = 16. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FAX_EXTENS'. + <fs_field_catalog>-position = 17. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'E_MAIL'. + <fs_field_catalog>-position = 18. + <fs_field_catalog>-dynpfld = abap_true. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. + ENDLOOP. + + ls_table_settings-top_left_column = 'A'. + ls_table_settings-top_left_row = '2'. + ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. + + lo_worksheet->bind_table( ip_table = lt_download + is_table_settings = ls_table_settings + it_field_catalog = lt_field_catalog ). + LOOP AT lt_download ASSIGNING <download>. + row = sy-tabix + 2. + IF NOT <download>-org_number IS INITIAL + AND <download>-contpers_number IS INITIAL. + " Mark fields of Organization which can be changed green + lo_worksheet->set_cell_style( + ip_column = 'C' + ip_row = row + ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'D' + ip_row = row + ip_style = lv_style_body_green + ). +* CATCH zcx_excel. " Exceptions for ABAP2XLSX + ELSEIF NOT <download>-org_number IS INITIAL + AND NOT <download>-contpers_number IS INITIAL. + " Mark fields of Relationship which can be changed green + lo_worksheet->set_cell_style( + ip_column = 'L' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'M' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'N' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'O' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'P' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'Q' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'R' ip_row = row ip_style = lv_style_body_green + ). + ENDIF. + ENDLOOP. + " Add Fieldnames in first row and hide the row + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog> + WHERE position <> '' AND dynpfld = abap_true. + column = <fs_field_catalog>-position. + column_alpha = zcl_excel_common=>convert_column2alpha( column ). + value = <fs_field_catalog>-fieldname. + lo_worksheet->set_cell( ip_column = column_alpha + ip_row = 1 + ip_value = value + ip_style = lv_style_body_even_guid ). + ENDLOOP. + " Hide first row + row_dimension = lo_worksheet->get_row_dimension( 1 ). + row_dimension->set_visible( abap_false ). + + " Set Column width + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_width( 11 ). + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_width( 11 ). + column_dimension = lo_worksheet->get_column_dimension( 'C' ). + column_dimension->set_width( 35 ). + column_dimension = lo_worksheet->get_column_dimension( 'E' ). + column_dimension->set_width( 18 ). + column_dimension = lo_worksheet->get_column_dimension( 'F' ). + column_dimension->set_width( 5 ). + column_dimension = lo_worksheet->get_column_dimension( 'G' ). + column_dimension->set_width( 6 ). + column_dimension = lo_worksheet->get_column_dimension( 'H' ). + column_dimension->set_width( 12 ). + column_dimension = lo_worksheet->get_column_dimension( 'I' ). + column_dimension->set_width( 3 ). + column_dimension = lo_worksheet->get_column_dimension( 'J' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'K' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'L' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'M' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'N' ). + column_dimension->set_width( 12 ). + column_dimension = lo_worksheet->get_column_dimension( 'O' ). + column_dimension->set_width( 9 ). + column_dimension = lo_worksheet->get_column_dimension( 'P' ). + column_dimension->set_width( 12 ). + column_dimension = lo_worksheet->get_column_dimension( 'Q' ). + column_dimension->set_width( 9 ). + column_dimension = lo_worksheet->get_column_dimension( 'R' ). + column_dimension->set_width( 40 ). + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + + " Save the file + CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\ZDEMO_EXCEL11.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL12.slnk b/ZA2X/PROG/ZDEMO_EXCEL12.slnk new file mode 100644 index 0000000..10803ee --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL12.slnk @@ -0,0 +1,95 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL12 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel12. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world in AutoSize column' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Hello world in a column width size 50' ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Hello world (hidden column)' ). +lo_worksheet->set_cell( ip_column = 'F' ip_row = 2 ip_value = 'Outline column level 0' ). +lo_worksheet->set_cell( ip_column = 'G' ip_row = 2 ip_value = 'Outline column level 1' ). +lo_worksheet->set_cell( ip_column = 'H' ip_row = 2 ip_value = 'Outline column level 2' ). + + +lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Hello world (hidden row)' ). +lo_worksheet->set_cell( ip_column = 'E' ip_row = 5 ip_value = 'Hello world in a row height size 20' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Outline row level 0' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Outline row level 1' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Outline row level 2' ). + +" Column Settings +column_dimension = lo_worksheet->get_column_dimension( 'B' ). +column_dimension->set_auto_size( abap_true ). +column_dimension = lo_worksheet->get_column_dimension( 'C' ). +column_dimension->set_width( 50 ). +column_dimension = lo_worksheet->get_column_dimension( 'D' ). +column_dimension->set_visible( abap_false ). +" Implementation in the Writer is not working yet ===== TODO ===== +column_dimension = lo_worksheet->get_column_dimension( 'F' ). +column_dimension->set_outline_level( 0 ). +column_dimension = lo_worksheet->get_column_dimension( 'G' ). +column_dimension->set_outline_level( 1 ). +column_dimension = lo_worksheet->get_column_dimension( 'H' ). +column_dimension->set_outline_level( 2 ). + +row_dimension = lo_worksheet->get_row_dimension( 1 ). +row_dimension->set_visible( abap_false ). +row_dimension = lo_worksheet->get_row_dimension( 5 ). +row_dimension->set_row_height( 20 ). +" Implementation in the Writer is not working yet ===== TODO ===== +row_dimension = lo_worksheet->get_row_dimension( 6 ). +row_dimension->set_outline_level( 0 ). +row_dimension = lo_worksheet->get_row_dimension( 7 ). +row_dimension->set_outline_level( 1 ). +row_dimension = lo_worksheet->get_row_dimension( 8 ). +row_dimension->set_outline_level( 2 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HideSizeOutlineRowsAndColumns.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL13.slnk b/ZA2X/PROG/ZDEMO_EXCEL13.slnk new file mode 100644 index 0000000..b32ec40 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL13.slnk @@ -0,0 +1,77 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL13 +*& +*&---------------------------------------------------------------------* +*& Example by: Alvaro "Blag" Tejada Galindo. +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel13. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1, + lv_style_bold_border_guid TYPE zexcel_cell_style, + lo_style_bold_border TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. + +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + +lo_style_bold_border = lo_excel->add_new_style( ). +lo_style_bold_border->font->bold = abap_true. +lo_style_bold_border->font->italic = abap_false. +lo_style_bold_border->font->color = zcl_excel_style_color=>c_black. +lo_style_bold_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lo_style_bold_border->borders->allborders = lo_border_dark. +lv_style_bold_border_guid = lo_style_bold_border->get_guid( ). + +lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = 'Test' ). + +lo_worksheet->set_cell( ip_row = 2 ip_column = 'B' ip_value = 'Banana' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'E' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'G' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_merge( ip_row = 2 ip_column_start = 'B' ip_column_end = 'G' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Merged_Cells.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL14.slnk b/ZA2X/PROG/ZDEMO_EXCEL14.slnk new file mode 100644 index 0000000..68b914d --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL14.slnk @@ -0,0 +1,168 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL13 +*& +*&---------------------------------------------------------------------* +*& Example by: Alvaro "Blag" Tejada Galindo. +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel14. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1, + lo_style_center TYPE REF TO zcl_excel_style, + lo_style_right TYPE REF TO zcl_excel_style, + lo_style_left TYPE REF TO zcl_excel_style, + lo_style_general TYPE REF TO zcl_excel_style, + lo_style_bottom TYPE REF TO zcl_excel_style, + lo_style_middle TYPE REF TO zcl_excel_style, + lo_style_top TYPE REF TO zcl_excel_style, + lo_style_justify TYPE REF TO zcl_excel_style, + lo_style_mixed TYPE REF TO zcl_excel_style, + lo_style_rotated TYPE REF TO zcl_excel_style, + lo_style_shrink TYPE REF TO zcl_excel_style, + lo_style_indent TYPE REF TO zcl_excel_style, + lv_style_center_guid TYPE zexcel_cell_style, + lv_style_right_guid TYPE zexcel_cell_style, + lv_style_left_guid TYPE zexcel_cell_style, + lv_style_general_guid TYPE zexcel_cell_style, + lv_style_bottom_guid TYPE zexcel_cell_style, + lv_style_middle_guid TYPE zexcel_cell_style, + lv_style_top_guid TYPE zexcel_cell_style, + lv_style_justify_guid TYPE zexcel_cell_style, + lv_style_mixed_guid TYPE zexcel_cell_style, + lv_style_rotated_guid TYPE zexcel_cell_style, + lv_style_shrink_guid TYPE zexcel_cell_style, + lv_style_indent_guid TYPE zexcel_cell_style. + +DATA: lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. + +"Center +lo_style_center = lo_excel->add_new_style( ). +lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lv_style_center_guid = lo_style_center->get_guid( ). +"Right +lo_style_right = lo_excel->add_new_style( ). +lo_style_right->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. +lv_style_right_guid = lo_style_right->get_guid( ). +"Left +lo_style_left = lo_excel->add_new_style( ). +lo_style_left->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_left. +lv_style_left_guid = lo_style_left->get_guid( ). +"General +lo_style_general = lo_excel->add_new_style( ). +lo_style_general->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_general. +lv_style_general_guid = lo_style_general->get_guid( ). +"Bottom +lo_style_bottom = lo_excel->add_new_style( ). +lo_style_bottom->alignment->vertical = zcl_excel_style_alignment=>c_vertical_bottom. +lv_style_bottom_guid = lo_style_bottom->get_guid( ). +"Middle +lo_style_middle = lo_excel->add_new_style( ). +lo_style_middle->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +lv_style_middle_guid = lo_style_middle->get_guid( ). +"Top +lo_style_top = lo_excel->add_new_style( ). +lo_style_top->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. +lv_style_top_guid = lo_style_top->get_guid( ). +"Justify +lo_style_justify = lo_excel->add_new_style( ). +lo_style_justify->alignment->vertical = zcl_excel_style_alignment=>c_vertical_justify. +lv_style_justify_guid = lo_style_justify->get_guid( ). + +"Shrink +lo_style_shrink = lo_excel->add_new_style( ). +lo_style_shrink->alignment->shrinktofit = abap_true. +lv_style_shrink_guid = lo_style_shrink->get_guid( ). + +"Indent +lo_style_indent = lo_excel->add_new_style( ). +lo_style_indent->alignment->indent = 5. +lv_style_indent_guid = lo_style_indent->get_guid( ). + +"Middle / Centered / Wrap +lo_style_mixed = lo_excel->add_new_style( ). +lo_style_mixed->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lo_style_mixed->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +lo_style_mixed->alignment->wraptext = abap_true. +lv_style_mixed_guid = lo_style_mixed->get_guid( ). + +"Center +lo_style_rotated = lo_excel->add_new_style( ). +lo_style_rotated->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lo_style_rotated->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +lo_style_rotated->alignment->textrotation = 165. " -75° == 90° + 75° +lv_style_rotated_guid = lo_style_rotated->get_guid( ). + + +" Set row size for first 7 rows to 40 +DO 7 TIMES. + lo_row_dimension = lo_worksheet->get_row_dimension( sy-index ). + lo_row_dimension->set_row_height( 40 ). +ENDDO. + +"Horizontal alignment +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Centered Text' ip_style = lv_style_center_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 'Right Text' ip_style = lv_style_right_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Left Text' ip_style = lv_style_left_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 'General Text' ip_style = lv_style_general_guid ). + +" Shrink & indent +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'Text shrinked' ip_style = lv_style_shrink_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 'Text indented' ip_style = lv_style_indent_guid ). + +"Vertical alignment + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Bottom Text' ip_style = lv_style_bottom_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Middle Text' ip_style = lv_style_middle_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 'Top Text' ip_style = lv_style_top_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 'Justify Text' ip_style = lv_style_justify_guid ). + +" Wrapped +lo_worksheet->set_cell( ip_row = 10 ip_column = 'B' + ip_value = 'This is a wrapped text centered in the middle' + ip_style = lv_style_mixed_guid ). + +" Rotated +lo_worksheet->set_cell( ip_row = 10 ip_column = 'D' + ip_value = 'This is a centered text rotated by -75°' + ip_style = lv_style_rotated_guid ). + +CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Alignment.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL15.slnk b/ZA2X/PROG/ZDEMO_EXCEL15.slnk new file mode 100644 index 0000000..3859adb --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL15.slnk @@ -0,0 +1,50 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL15 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel15. + +DATA: excel TYPE REF TO zcl_excel, + reader TYPE REF TO zif_excel_reader. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +TRY. + CREATE OBJECT reader TYPE zcl_excel_reader_2007. + excel = reader->load_file( 'C:\iTab.xlsx' ). + lv_file = excel->save_as( zcl_excel=>c_xlsx ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + + " Save the file + CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTabFromReader.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + CATCH zcx_excel. " Exceptions for ABAP2XLSX +ENDTRY. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL2.slnk b/ZA2X/PROG/ZDEMO_EXCEL2.slnk new file mode 100644 index 0000000..933f44e --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL2.slnk @@ -0,0 +1,117 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& Test Styles for ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel2. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_filled_green_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +CREATE OBJECT lo_border_light. +lo_border_light->border_color = zcl_excel_style_color=>c_gray. +lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. +" Create a bold / italic style +lo_style_bold = lo_excel->add_new_style( ). +lo_style_bold->font->bold = abap_true. +lo_style_bold->font->italic = abap_true. +lo_style_bold->font->color = zcl_excel_style_color=>c_red. +lv_style_bold_guid = lo_style_bold->get_guid( ). +" Create an underline double style +lo_style_underline = lo_excel->add_new_style( ). +lo_style_underline->font->underline = abap_true. +lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. +lv_style_underline_guid = lo_style_underline->get_guid( ). +" Create filled style yellow +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lv_style_filled_guid = lo_style_filled->get_guid( ). +" Create border with button effects +lo_style_button = lo_excel->add_new_style( ). +lo_style_button->borders->right = lo_border_dark. +lo_style_button->borders->down = lo_border_dark. +lo_style_button->borders->left = lo_border_light. +lo_style_button->borders->top = lo_border_light. +lv_style_button_guid = lo_style_button->get_guid( ). +"Create style with border +lo_style_border = lo_excel->add_new_style( ). +lo_style_border->borders->allborders = lo_border_dark. +lv_style_border_guid = lo_style_border->get_guid( ). +" Create filled style green +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_green. +lv_style_filled_green_guid = lo_style_filled->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Styles'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). +" Fill the cell and apply one style +lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +" Change the style +lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Styles.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL3.slnk b/ZA2X/PROG/ZDEMO_EXCEL3.slnk new file mode 100644 index 0000000..e2b6025 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL3.slnk @@ -0,0 +1,64 @@ + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel3. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: ls_table_settings TYPE zexcel_s_table_settings. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. + +ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. +ls_table_settings-show_row_stripes = abap_true. + +lo_worksheet->bind_table( ip_table = lt_test + is_table_settings = ls_table_settings ). + +column_dimension = lo_worksheet->get_column_dimension( 'E' ). "make date field a bit wider +column_dimension->set_width( 11 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTab.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL4.slnk b/ZA2X/PROG/ZDEMO_EXCEL4.slnk new file mode 100644 index 0000000..ece3e3c --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL4.slnk @@ -0,0 +1,58 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel4. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). + +lo_worksheet = lo_excel->add_new_worksheet( ). +lo_worksheet->title = 'Sheet2'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Sheets.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL5.slnk b/ZA2X/PROG/ZDEMO_EXCEL5.slnk new file mode 100644 index 0000000..6170568 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL5.slnk @@ -0,0 +1,66 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel5. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\CondFormatting.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL6.slnk b/ZA2X/PROG/ZDEMO_EXCEL6.slnk new file mode 100644 index 0000000..c8a4176 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL6.slnk @@ -0,0 +1,56 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel6. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = -10 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_formula = 'SUM(C4:C8)' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Formula.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL7.slnk b/ZA2X/PROG/ZDEMO_EXCEL7.slnk new file mode 100644 index 0000000..f4f4b1e --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL7.slnk @@ -0,0 +1,321 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel7. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 5 + ip_stop_column = 'B' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 5 + ip_stop_column = 'C' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = 50 ). +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3flags. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 5 + ip_stop_column = 'D' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 5 + ip_stop_column = 'E' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 5 + ip_stop_column = 'F' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3signs. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'G' + ip_start_row = 5 + ip_stop_column = 'G' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'H' + ip_start_row = 5 + ip_stop_column = 'H' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'I' + ip_start_row = 5 + ip_stop_column = 'I' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 12 + ip_stop_column = 'B' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 12 + ip_stop_column = 'C' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 12 + ip_stop_column = 'D' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 12 + ip_stop_column = 'E' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 12 + ip_stop_column = 'F' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 19 + ip_stop_column = 'B' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 19 + ip_stop_column = 'C' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 19 + ip_stop_column = 'D' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5quarters. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 19 + ip_stop_column = 'E' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'E' ip_value = 'C_ICONSET_5QUARTERS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'E' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'E' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'E' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'E' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'E' ip_value = 50 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Iconset.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL8.slnk b/ZA2X/PROG/ZDEMO_EXCEL8.slnk new file mode 100644 index 0000000..97aecdb --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL8.slnk @@ -0,0 +1,66 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel8. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Range.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/PROG/ZDEMO_EXCEL9.slnk b/ZA2X/PROG/ZDEMO_EXCEL9.slnk new file mode 100644 index 0000000..674a19d --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL9.slnk @@ -0,0 +1,73 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel9. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + +lo_data_validation = lo_worksheet->add_new_data_validation( ). +lo_data_validation->value = lo_range->name. +lo_data_validation->cell_row = 4. +lo_data_validation->cell_column = 'A'. + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Select a value' ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\DataValidation.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + diff --git a/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk b/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk new file mode 100644 index 0000000..39f9110 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk b/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk new file mode 100644 index 0000000..e45a42e --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk b/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk new file mode 100644 index 0000000..79800f2 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk b/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk new file mode 100644 index 0000000..afb8b25 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_SHARED_STRING.slnk b/ZA2X/TABL/ZEXCEL_S_SHARED_STRING.slnk new file mode 100644 index 0000000..92b7b70 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_SHARED_STRING.slnk @@ -0,0 +1,6 @@ + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk b/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk new file mode 100644 index 0000000..673045e --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk @@ -0,0 +1,6 @@ + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk new file mode 100644 index 0000000..ea370a7 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk new file mode 100644 index 0000000..0dd48c2 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk new file mode 100644 index 0000000..3c70c4b --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk.old b/ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk.old new file mode 100644 index 0000000..d2993a3 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_FILL.slnk.old @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk new file mode 100644 index 0000000..0a252ce --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk new file mode 100644 index 0000000..b996db7 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk @@ -0,0 +1,5 @@ + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk b/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk new file mode 100644 index 0000000..807b9a0 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk new file mode 100644 index 0000000..a36e8af --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk @@ -0,0 +1,6 @@ + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk new file mode 100644 index 0000000..64f2e1d --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk @@ -0,0 +1,6 @@ + + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk b/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk new file mode 100644 index 0000000..fd9a169 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk new file mode 100644 index 0000000..f25e698 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk @@ -0,0 +1,5 @@ + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk new file mode 100644 index 0000000..abaf13b --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk b/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk new file mode 100644 index 0000000..f852a4d --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk b/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk new file mode 100644 index 0000000..72eacfa --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk new file mode 100644 index 0000000..06c4a9b --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk new file mode 100644 index 0000000..fb30252 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk new file mode 100644 index 0000000..89c9273 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk new file mode 100644 index 0000000..6e19440 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk new file mode 100644 index 0000000..1564172 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk new file mode 100644 index 0000000..6da9c5f --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk @@ -0,0 +1,4 @@ + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk new file mode 100644 index 0000000..10629bb --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk new file mode 100644 index 0000000..da2bfe6 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/licence.txt b/ZA2X/licence.txt new file mode 100644 index 0000000..07dabfa --- /dev/null +++ b/ZA2X/licence.txt @@ -0,0 +1,20 @@ + + abap2xlsx" + + Copyright (c) 2010 - 2011 Plinky.it + + This library is free software; you can redistribute it and/or + modify it under the terms of the SAP Community Developer Edition + Licence as published by SAP (http://www.sap.com). + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + @category ABAP xlsx Manager + @package ZABAP2XLSX + @author Ivan Femia + @company Techedge SpA + @homepage http://www.plinky.it/software + @licence http://www.sdn.sap.com/irj/scn/nw-downloads + @copyright Copyright (c) 2010 - 2011 http://www.plinky.it diff --git a/ZA2X/readme.txt b/ZA2X/readme.txt new file mode 100644 index 0000000..5008f11 --- /dev/null +++ b/ZA2X/readme.txt @@ -0,0 +1 @@ +Check out the Installation Guide at http://code.google.com/p/abap2xlsx/wiki/InstallationGuide \ No newline at end of file diff --git a/bin/svn-script.cmd b/bin/svn-script.cmd new file mode 100644 index 0000000..118086d --- /dev/null +++ b/bin/svn-script.cmd @@ -0,0 +1,5 @@ +@echo on +shift +rem echo %2 %3 %4 %5 %6 %7 %8 %9 +%ProgramFiles%\Subversion\bin\svn.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 > %0 2>&1 +rem pause \ No newline at end of file diff --git a/bin/tortoise-svn-script.cmd b/bin/tortoise-svn-script.cmd new file mode 100644 index 0000000..c56bc8b --- /dev/null +++ b/bin/tortoise-svn-script.cmd @@ -0,0 +1,5 @@ +@echo on +shift +rem echo %2 %3 %4 %5 %6 %7 %8 %9 +"%ProgramFiles%\TortoiseSVN\bin\TortoiseProc.exe" %1 %2 %3 %4 %5 %6 %7 %8 %9 > %0 2>&1 +rem pause \ No newline at end of file diff --git a/build/ABAP2XLSX_V_2_0.zip b/build/ABAP2XLSX_V_2_0.zip new file mode 100644 index 0000000000000000000000000000000000000000..36e8f2a4ac47b59566cd959cfd3ddc410e35a834 GIT binary patch literal 572480 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

Ls6QDPkBLCQI z0{13q^a=UF1V`~|5Z#i)g)c(GED#zJgp@`J5MG z6$Bw<@7of_Xn}kOApa%i!-K+@jRCupA_kgaUCI?I*@lmsDm5umw^$Dlvti$AWjlJD z7{75&Y(#LOLms>s8f$wm^wtZzATnz>hfYMiYaQXC_&29tXSmt@Iq_W+fG`>wG^P-Y zy@_@9G}@NcChu)+6B5wm-IbZ|?pWRr>ZuEqwgmhhu6Aet*~ey~IFW5?T!^S~Y>ey7 zu-i8KF2N(9zH_?;zo|m@Gn&;$T5u20j677023)#L5Q9d zj3AM;yAt4h^g4P{nC=%>;liWKp=-+a>Fa?cs{Z-H+2q?>5@E-Ou{^i8G-E#{KTLXF z$02>iNBY~}K!CS>nBKc{jdR%sF)w#BRKJWJMfV*_SL(kB4!B+$c1RSRz`jLyKPGW79{a(8 zIR&55f^KkcP|L)T%E4LP0eZ>T+)IdE!QI0G;0%`}qa1RAJgBe}9jjM!=BVKy|EsTou zbl_D)h+MC09l12@?pEuM5y(t!fwSNkGJuMa+G>UXW! zaovpRfj_wh>$x)I)#FUsua1spa#C|bD8-3|Tn97os8RtPM=45u(R;I<^BC{(8c*sdr<$cwNN~TSZocECcQs0v2ji zkFaaciwzdP>PMejm75O1#Lat=?xN{?9eNQVZY+-#o3Hyree1rBAZ4LmX`^N}bJ2cZ zmxj4N>~iXb@bPd%2j(C5hEaNeFor$=DE}~L1g09+hv0S!X>qcIXzXR}Js&_3Sy(`T zh5P+;U#-5^iCL(5qAdbioC4wo$iH}FEdY%BCv>4swRD9fzL55y>#BlQ>1Zy$d>RAn z1Vl1UWPrv$1}PH@!~*?MA;+C=3jmL?$K#|Co@7AB5%5pCk2BW$w{F1jx)g4IPC(oK zcBt&cWxJG)3vpu9_Wgu(YU101&yJ>e3j;~|l-F8o29=xb;ah97#m8|DWSE7^OBj!m zUhx>!WCJJqmtI;QBsCR?<|O0nBoQQ!x>v9!5#;DUf}DW*lj>J(52&@thbV%@&CJPn zkOoE`T9P^xiYq*MW) zq8^d$qDgpHY9jPx9ZEbZv#UphT=C|oG>TBb2HNPgk2he)2us?b^g`2)>RWBt<_VCE zNb+GIuRJ+Q!w6b=?Wp-ZsAotG4?d#mtqfS~;e5Xie6${1lOE(o6&J7bA&ip!O;`s#L%zVT<(5bzS-OtZDArn#?4DDW3?b`SPtxh~oaku~`JYGBJ<`88GD8rIS?# zu)^D$2y-xTp2`i2M;s? z^`TM=Rx*`bp51|0!&F(QaEI);6QJK$gM>-1gh}n!?yQ7$ zVI#38(SW{5BWxW6RM`>7fA2|tF8Ox(-23n_&eYk~s}|)Z4ssIxy#{IM0`am3cN+h zV8Yd*qs8x$!c|cS7hT3URmO&DB2DTrNF>cVQ* zFXp~qA{(<+x0$We4p{+aIfy-Hi{MB=_gr7>QnsePL^F?U#`S7HE8aTrwRL6j&^d9`ikQm6`zNZ3^;bI+>0&Z_Ovn3#En0U~hP_V}*suWjiZ3~? zM0O6J1=c&NUH_Rm`k_g1uU7^W54jDND<~3pYIwJ5E8=4F}@Cl`*A(cfb28Rp4 z3`C;b8ww76STKW)%xU0J8x1q#3^lpnQJF4S@dG-9J}rconb;LZy^#g|JxXPGW`YPQgO43O$;6mo9cxCVQ$4s_VBkQ+4fdzQaw|CcTNUfM zhf1LNL|&ebOLOCXnWx0ab$PFo=nrg!e@hW`r0Q4qk5i=KMiUQX;ix(qKxEdHo_Nb* zDcv+s?o4zx22N(2beqy=)bPu;rfA6QH;tqjwtr_eIJ-yw2iyDn=7*6{n%rMc=bODH zMVRRRynuBTMVc6@t7hY&tWWHIJ)5 zYZxco1cl(dw^+_<^mqr5DPrQ}?x2a8t{+J$Dj5TjL-FXt#mJOJvCBg4lIvr;Rj~R? z)P!S@w4u=aQX-;Kq>6;a$dfMTzp_U?T@U+^7xANB2Xtxsy+D;Wz7Kh5FM-W2ijU?B z^IVdD_61Ngji^7}!<}?NvNYM|fxJ$IfflFR*cQMOTl89F!@?ak=?~8%W%>`~Xt_DQ z`u#%3)G|TQDPr^Mk3bp!1FmApe*aBB?QYdMm0AAG>wyw5B+qe~3CvXh@n-tHWGHO& zP7Y3R<*N4b6WKk*fa9tJ1ps5ITaHZelr-GPe46$@4D)k%N?fZ`%4&_@XtHu4A|6ea zL;2H?LDxOLyFa%56$c=3SmAs!P{iKOK~IIh>721HfTwxg@nnd}U60cz z_0neul@6pY(Q37v(`^nq9V z%;O7w`U$UxlN&XmH|AUVbgW@qUOEdul8fUn=5jW%d-WF*_36-Gf4MPyChA89W%~NG zOU=K8rQaZpItLdK*P;a*M1~vY-YYD?JA6AH7iJmrF2S>3%zEvpxUyWxfrXb0S;HyJ zRPO5ImxyeJ-lQ8WS~*9^;IRr=XM|yL%KhyO@~Gok!#OM|orAv~tVt^()?N4BfEC-{ zU8-71EWep+;D60SeXmh2zgxG!go*9!e^^1{+0$unwF|?bsvz; zjHC;ldo>sY0SliSPH#r^#fVWF(FH?R!=UL(cD$XKi9u-{vOXAlWDj#^h3(B2O8=+l zX@x28{E@5s{0~CavIj}>vSn<)I-R@I!;}{zOJ#h8Mm{(2AGHO=#5ecmvWRnB`pL9S@WrLJNIS4XsNS0~*E>Mp5Yt`p=0~N} z{zt>!KS$%4jaBQF$mPu=c;FbY95yfzcT5#>V*3a4)(%|c?~qaDKEe`^YnfDfNHmDJ z3i4zq9J4n)@I)7EwJ|r>q_3N!Q$xsh-sTYE*>sboHrv8A22VW;+TMb^aUYQ+gv$gH z7_wOd1dH`ZI6aSnc7X!I+KN4Z1few<=Z6K$gcn~*?>KQ5%C0rh?8=;2li7U;$w(N_ zcMt~v&!x-w$0c-eopj@I(3^b8%H0_uOzkDZ+nXPq(flmX4I-Gu_{ld7ogD`66_Fs3 zJ8Z<0t8^%W>~|E^o{o-jkT7^$5D?K`IOk;X?YJ&)eZRE^5jI>ccP-J7{-ojR$p#gn*vnz}LC~fl^JxOi^p*s;f z!!!5alSy+%NY7H`V-9p1Q*LHHr>+-e7m-*Pyy!dZU20gce)TFCqzlO69~mUP_kK{Z zlI^L)e;|3xE^F?<>L8wQqYz(7ehkC_6h==K&u2)zYN0{iaN)~ZCPt5{m~Q%r1ctS= z#ZZq^*0aT7Y9&54xS)%mjBJ>cmJ5U!XDN{)pEfqoG&r(7zyJc!^RoaQHS~*)j<7iU zq0ab*U%N?6!p`)-V;};LKv>wyawY%$ni1kmAQIvT*znGm~8wdykH! z5Ab0|Iji0ePi=K{L5T`9vr_@XF*;kXPP?$Hu8Iq?>j~^&>J$Qhk2>^jhWE=|`sD)q z7=Ji>Os9<J)>5hniUU=qAP=kynx+a4+-Cp%~;IS_ly zsiSz*KsYrl1}SH%;`0Jr`=C_PJOtm#ZA#@AKoV+2(^9}`h_^anH=+um$^0Vu*r(=W z*TZ-P@7yMN*{1@h4O&;wucSOW0xb6$?IzjHhxgpcX?=LnrwV5sJRlO-n1# zfqP%E%|wH{<>;_O^FxUTCd=u(xdy>)n}j~5&8WC>8BMU^f@*58q)VApD+MJF9OE1$ z0&MoNO8h%c^1w~0 zW4zt!dg@+Kmpadute`m_ggJ(C5QH?qUjtWh6&Qpbo7e#-t1Nj1EUU{X>m1zqWh-;? z_lmkH=jVy1R#hZ;lHi$*+p|Z~12Dpxr_4xWp5RM3^7o@fE7q{pvUEo{8XN$}05~l6 zC7V7>;gCVDXtdJLaUcSnimc36m(BiKSCc+rioCmry#Gy6u9tfVWO>_%e6M2Z6^6HU z#N>Pg{{Ha)4Y70TC1bd4Z(qHIymB^#>`gEC0*eYBt^o8M4L06R!Us^f0xVKZ0*TP9 zNmOD#!WfL4LMbeP(1x}v;6h*$PcY#ex(@=TT}A*M7vaL|FAg0e+846S8tw)ww;~S z!Svw=N1+5BCXxnr6l>XvJRS9HUle-XELk23p}xn-tN-m>)>sEJ=CvLjjtH}hE(G-?7^4vWc zD;4U*$t;2dqlvkkhL<;Ke{9dEK%=(psLO7leq!wQXm1ZfB-y2;Cvc_NQMUyd1EIiu zr-Uh`MJ(;iH_qCMG3Wi5x?=hB5hSLy8=-FqtrT)DMi>35c~Dy0d5il~|K|MNvJb)( z;{W)kbI?2smhmG_4VXkhV_-K^xb>OU$jWMz-pw+BI!0t)D_%y;`J4YPBn(65psL1a zTxI`*cfA_ep#mZ)JpVFFGsQu2n@ey#71A#VJktgja(0>znBN6EN*<(mGQVl(`(W>| zZRQRySyP~Jh=`#3Wd6%rjmwT~;9z$|n>qtCr6&N8wY&K@jSeqs8EoFs4OZVyP`*+u zyB9wkl}@EJB+%_ua#%`cNZNl3o0R$5PF+bcwgU}Q0EYB^cJLQBizo@Q4L~u@Ki`SBXkZi?m>4sc5ulL2n4vnWk zGY8_R1RhG`ym_>!{$ID((HHprA813uB;EH**f&Y>)6MoJnU4;VV~XTyO*Xp(7_}gx zT*wHR6~>kh_Pvd5)S>D#c69ito*eg#7L9K#j{FAX5sMLL0Su@j0zo2mne3w8?{FwO zso>PLfn6VVn|ajo6DT$3(S`*yo#cp`1`%ZNr>5YQq5&)GUAD^~l!YW{ZUg8$gVkb+ zFIlqhNHQOWy586@aks0q%4ECp&wy@G6jyl*R(=cC=42l#rp(3=tSbfgwwd% zs>`^H>~vOO=XnyY9#1C`L}N<#I`bPJGoAE11hjWK7o|C-yI-;)EPa%`DXyT3*c9}q z*>6!Tu_<8V?$x3iQlr}%#px+^xJH+N-{phKP}N@oTBkQELliP?@$HA^Aqwd>@w!v1 zaD^-g0b!*TD%==)nQ|(V3%)>gRiOuAiC#8E@YuK7PQyW;(-{D zq6U(&QGuKXed1KyKo2Y!3Y$}gH28p#qG|%LM?w4e{|AIXd%v``#0mXe5R0^x#7GV} z*g@K|V?>4|oJTG^MpD3T*=fs;kq@ZHaLUr-qyp+;nuKMBc-Dn6O)vS*C4w{;%t_g% z*EvpPs1|kx^QudJ3#~cBTE?&POsliKG#z9k&f2zUt*@RHT-5M$`Cj(;i*|SU4E{gg zub%GiobCU4^Zx@-O9KQH0000805pmvJ&#x#Sgrv80KNhM01E&B0BmVvWo~0-E_8Tw zeNw@0+b|5h2gpAVJGHhqts#$^>NE5?$&}KK;qGPSHBuH{y|NSUu!8V}SNtF2b z`1Hv640y%u@gcc#7>pYldx)dxU zFNyKD|PvY2X3hxW|&mz(yo2FYdG5vzXB;$N&6`r>{f-Ot3=I?=<8FoRZx z3x5`HS-Ah~-e>*ivtLk40|XQR000O8I*KJdb-6s^PXGV_T>t<83IG5Aa%Ev;ZDlTW zcyvw6F%Ezr3;@8d^aV6=bagO3qe24>m6A{+&o^=M_S*`_3U)hqVK~}wQY9B_u-}px z$f3CR6){@kkj=7kh<0H|I;k&H$HYgf;D3Ml1yD-^1QY-O00;m&iX}Z_hj&Ay0002x z0RR9C0000>IWRIYI5I9$Nl>+qK?{OF5QRJMuXx}&ozb=}=pweol0rxa=@L=~9g^tQ zslVPBc1eXUJ@{ajd5<@{vYCs~YJ=QuKMw|G1{`UbsTYn6U`UMc`}Rbvyl1SufCCJw zX8g)OAxfNzr2spjajv=JdBCYqCG!&7Z=EFV=}S8db%aw|{Q zx4r7v4TXbtKa3_=bR(>XBl3CJ-y@@c>IG0s0|XQR000O8I*KJdPHIFfVRHunjB5x0 z3jhEBQaLa(F*q_VQb|y(x^-L~Uy?UWLa+eA-9m78w?KlsyW2%B?i$>=!5xAJcXxMp zcXxMqATz(2-OoPHJG(pY{iAPnozrEftIoH&8w?DL>9YboJv|FOBRwkvGb23%Jv|3K z3j+%S8$FwiiIuJa@bjM^8$H8kFfhb-5@28u9Y|l}e}H`j14AZAdEcOEYhp18z3#LV zDNh-*8QBk%dXOn|@1$O*?p&u&eXnB9yW~kn)6V1{tM}dyE3suQH>1sR?ZLtdDz}pUmU=~og(B>vlT?K2eu`n4B?IA zPf%1n(6R)ebhzg3&CgywR0mn}u-cGCJ6o*iOdPjf4(4ea7V};D6ZP1~bJ)?aV#!K( zK=Opa!!Id6C2HT`cuZK{0bk%;pHmeqmgz9ss^z;Z`BuZtdF^s4cQ|N0Ui=h}t1lL| z?v2nsge1|(@gXSHt{KZESX!XB9WmA>6;&TxNQb}|KL;sPAFQ1Clo}fQn%!rec)!!f zY{Me|C4e^1PFDB)@&0RD`!#lBS1b#l%?$2*2v+YPXN&}(U_!C^iy~OO=L5;9Q^UEc z-K9lI&BXzqa?&ZFnQ*f__tzBKNSAHpD)U{bG!ajhR3C#tw zWjkZ}sNB4ZTmfb3Hm`=MbL=?l^*!*SX=;x-GnhIXczmTkqvGDaOQ=EtJm4>|1y%*A zX%P2u!CVZ*3Z^GX#({eaqm z7vwLA6+)|DC$CY}Cx1PcrnaF;X?;mMI#38z?-GS^1+3b@=91D@$+O7^0NcrTXS@FtlatKf7$^&gL)`6o;c3P0bx1ZG^3$*n0@IH%yf)37= zNy4MF_jSpyl)6A=Pwi40N0)ReA0RJqAae;lV`#+OLuq0WAn52^Ig%>UV6N)hKt2EH z^%D~qyl_b$HTcz!9BNCDHe(=@MoxU#il%D|=JXa{W2>9G_?4w3&WO2=+~t7ejL-+N zCBhin8bdE2QFRhZI^`AzN{nx- zF2Dutycw1;RM4&uh%*U|7FDl|4K=wbL#SAFyV1l4j;S$Lu(h#Z~+_^M))3HM-@ zAM6QT1f~#}Y9Z9T?glcSCe>_ijM~7Tlk;&;y#8pp!&#-}<|CWCE351>?F*sT4*l$b z9*z*|FEf{cA)MYpTPznoCA8QvOYo)$aPE%|t?PaNfDy4YtMdcgYcpmNg60{#Daq0eZLEYZL{Qkw zbk7fe&%1ax65mOp$=!OCrDg1l{Z!>lMgCihvs$6t-?e(u?@BvhuyR0(VfyJynU=WMbb5!$+e>{%Q}MZ z?L0}cL4V$|4^Rgy{NTZQq{Sq%LGJT?4WO=dF7lxG@bf8wHAQOSJTmbOTS*G<{_BdG^V1P(~yh3iPq ziQ~#0-iD;KiP!lzmBP=Y+$VP>gm>Z`&~L-K?hC@hBCx`*ih8CZMlB!IN%+UB8x6W< zw2W)NhtCnCF=@ZqB**BG&c%lB+VU9}I3TVxST{+jVgo#^RCBTAAfI4mMPII^@T+}Ulf5)E{c2R(sT<0D zfgG@c52@629N9EfBsiQm#JLmIjhoTcGfbb@=VRldn|zhS=Lu{aq|0BHEA-MLgVW;P zgMy=)cu~+{`QkzKUHt<+%3-hK;_e`2M-YgYUXLMi} zWi-W)W0N1VMR{{DxALJQl=oHT_#c%9;a-m^6y2{9vIcjoOkG`;6`u$4HfY@vLQ|7u zDhYbeBUi@4jkUAIwwv)oGJ(#06i2mY==TDB^t^7|Zvu&qq~8*P)K8`n_n!%2Zi52l zO|J2(6KoS9mh=%09Pai4h_8ziJ@LqM%&aQaDp)n;B=R|UK zWiC9Pi6q3;;x3O%cU7Rrk!AEeoe5LNW zGcIm9;MdRH0ROY_SxFge7ljF7v3yRDE1(DAJ>#n&fDbdhhS2Bl)1$_`DKye-T7eJpqLPrW59Q{a5PE zgvQG~4ac06q%&;Sop>`3=YjBQgFf~nCO=*%>8B#Bm{1&E)Od8d5R^TxSh3T~X$CP5Xl<}ec>Q`oY$aQv9yfIF4jnCuh z8-vmBIzd2r^?g>Iaxj++^Go9&pRkW${GR!w-MQb~${E|NT@rYQHnG#7tCoEw3*%3{72qg%FYbne{BL2M4F=XNqve7s! zzQ`08ZOc}JcN9&XH@1D_mn%I?5`N|x1em#hF%)h{A*tg$DFy`C<1ULWt-RB^)SN$} z#>#Z}gmQ`)eTIF_k`Ha*swm!nWyyF`9d!-NH{Dyi2}KO|4@#N_kysYh8;7Nm=B7Sa z3B*#Y2}bo6Tob(NX(c<*DB7(Uoof<669M||KoDP~hv-k#oKYwo4Xai38YRJMdxz5n zeDc%J9YFs(EIB7H#8~>yBRH+I*#pxw-muTDMDLDyzP^WzKd40nDQj+NoS*MvHDIlF zAPmSMrfb4Ysgs#4TUTlTex1!7PXcshYfs?W}b992t+rU;cx;a1v; zf5ZVxa^^SVnR)XluQV!>=RJT`I~e1hg|B2vqA3~sc)0Avtv70%e1og^ymWm@>VAYy zAV=ES;F+r&Z<`kPc&e&>wr#JCX&Pf(p`7|!S*~M>i5AvcM84V6%iMS1t$`-|jy0}f z?aSCl*%vw`#zaAISb4zBVR{waT=hqJ&EB<(dGV;PT@_YkTXACdd?S~tV|iz}#K6ByYVzTy zK(m~L{*T2ilTe&hEj27{1Le4{Tcc=PwJRNIw8vKn-Dq>s^Mbr;Ng38Ug?lLM?o-5I zYGd`?31~6)O_UX`%*DMqlUm>QIfj`S7sqEE&xT)u6D^kmn#h);=PkeUbVB>FNUWXA zezld~mm=Cn)VKVs{gg}yR6dZAaTVT>%xi#~Bq}7yD<;rXF+2M8rDt6-&lPU+re2cv zhtej#Sy__Y3Zo3D%wg1xa?~scdD0zn9|qa7!o_K8V=QNK6OnuJva^V{fugEIBqd0e z?V=mF55=%=v|KC7LtfQ+{X5BdgSASdY5TN0IdMM_l_h`;eG-Mi^php^?>~Qoc>~R} z_$+a3$X5!1iAFLSle#98Gx#iNY~#Js!HFX{C;a&>4p>drp}a(bLpxz8ZPUFwVMy0s zTip&AK-Ojp6941i#IK8_|2c zCcd%cvP$}OHcYqJ8}~ikAFlUgglIrVC1{b0t?E#qyTU6ftGR#+l zjP#1epm;3@S4Bf#?IQSUYS?Cc*)9CXAiB?0Ir|mP8<;(Lazu)0LpU+yuda@>$ZHm` zrDfLKn9mrW3035dMGyVvYF!JvFnJ2-9qh{lH^`j zi0`$4L5fspXmS2kz>bz5V^M0-={>GDKH@sS!*_RYUTu(pia8bvHH;+L_y@QG>3c$g6lu&7@bKS+#6LTb8Gku#g8SgZ zdFdPl3BS*@A6P;gXbF$f<)awX4L#zqlHE8mmz<6P{oDwo2(SHtnTEm6+0mkxD^*OG zFD>ipH*e8ssF>{lFEbJy=&YE14JT7D#8i?$=?*>#>lR)p)Y}SXUmtEUpP&(QKL~b( ztX|L+NO>g_!imh396WctrqVdVq|)YmgmS5Vl|Q+YILSdt8peI}@G$MSD{O8a|z zI!1OE-(BYoe>IkJ#k{LVYw?tgjSu$xWEP61JeG@c+7yL?_HUHT$mrYwR|GGvr6R*71|(QF-*$y#o<1kRs}1errgm*vZ0PG4;5e_stYKJ-sjXgx zIhg=i5-+>eORXhiPI-%Tjv#i!G5gI!AIFU*FGof9&^#pY$;&HmUKxUcwnNg1Leq0Rbv zb1f2M!{?Q-jq2UE1v^9T8TgLi#&b;{`!HKFxQI`dKk2eun=RFeZ@^~niZA=N(p2WI zgpJ(3Fq0?UYtAPmO_WusY+8h7)RhTV7mU>iL!b9wuW<^S^!v5Nbw%rV9)mVeGaS?s zxKY}=VTlWQx(!7JlX2SK*52#9R*5da7#l2gUE}Hw!FTRB+*gv8%ID!y>*;c`evrDM z@$g~b2kM+#grTIODshqW6f#{#pWPg4QApNNoLYdHCTP@6ru3j1MV6zbqIic5cH%DH z>9}{{`JnImbPDaU_XW2(F=1AGK2+{4Z+D9sk0tcKLvdOWtgx&L^m+F}qbwLuREo)#RRo;d+npLyLC znTd^G7tAB^A5o?=nC&}7RD#bIyRRdqT1Of#%ESncr%qKlZ||@cD$9F^wajT$nj z<0c*q7pSeT)xLw&5s#?M%y$rZ@31G#Jc7e0OMFzzdmK#?6)1(1U#_!oQc%XfuZNC` z*J+`6`00sRy|O2O`Z`~4y$f|jwi`Yp-7axGpY0c!W;wMbf~l$oEbV%>T`Kh>*2NBd z_5|uoMu-#U6h}_x?^+Y`l$=_0t#96WG@8WJb3FRxwdmUTXH4h}i8Up;iM8lDovA|EeT8o@~myN_e1^Zmiz-SL3B z`EA99o(u57KE;m1P&wORzKiBWo&jgU3b9H*Jd=v#gE-+UxTs7p`aR zI6b#CR+mw>fyV3LBXj+V>99l+CJi#VWH*|aup_Z++}DB1dC73IwHg_9xA@ zvoEU@1h>Uo(;%h8d1Kj%wU_iqsJDFtMIZ%*=C6HZxp?Z3)dGBNFFPP3;2M51W0#Qp zqpCHor58RRNOZC{ma;#*0)veYhq=`P*Ss9!{)_waCkl0RQP~_;YjaC(Utn+|h$%6h zBQpYb2MY%5bRhs5n%)Vvk?q|_{X^M9BKL#CJL?t#quH1FbTI9wLpTv37u=D1Yeb>5 zGVX(94Yq8UxOZ1>1(_(3*F^pC9!6EZagQk#j_!9(*3NwHw?%$EE$qXyjvV$I%LGw} z-07U*QQlYmv&92t;NvwN#{)KVrN(qMn(Z#YIQ^n6{9c<5ej~aXB5k@JwE>>!t!@}e zQS@$byj{SoMYz3@%>yy6MC4?t0ooxB7S5+f04Aow_Uy@kS%>0>9{wi?@l_?PLl<1! zh_*8sa2vTcEv&;T4yRr~{@RDU)wy|__n$26+1WoQWY1T0Z5h0$o*WifFiR~ezGFe* zgB2##H(L#d`vhfgh2}=?6VPWZR`^6sLq8)f$9c9fIX*xBabuM|sncgy<5hNRYC#?k zf5?JnMQ$;DWU6Vrw?b)Uy9S6P%f;}cT-ya2X)BOTTsmxf{FPRU4BckcV5SyW2m%6N z0e1fEr$p_`_hY`{?$~>w$VYqM)PybZ4{yNOJ4Y+Dh%N){|bi+ukw_=12XwVqk)ZEsi;y zk)twlvxOv5MPsWOB0sFo4RyzaZAJ~z*T~#k=q&u9BeUcs=_hiNpB{SF7`~Yf* zAtz%H@acyEwmAQJV+Z8Lr=lG+Ln-;N30ZgCv54#;4LU>BFl1y)vZE+|AYL=KB`S*g za;8YP~3vKk+zY?^zrX&!)@V%a8Aovo#jy@t+oXRqGw@Nn*j&R`)8OdN$G@i z+zx9pQ3@FPPo3K>&tIfa#~yAd&%fa{Ecq(k`@gVbmSKH3MfuIZ-f3-r2(9l*FoI~f z2#%q4Yn|@%R1C3#^N1UWZ;4+iu2HMaxFNye^q#p z6Sp=1WCi=u3c=mZ#og>p;nq4vvAA}I7tXu7i)ztXchh_GStykYJhG}@DCm<|T810c zRRc;n-x~W&1n4=e2{h~3nkhZofNX5>^M>cT)}Nz?>z2QA3tOQ|gKA0$;nv;nNnJNv zJ8tmok!Hq}V`ZS)PidxI4r3PfR4b|#>zN7Cih6p7=rN=qL_OkRTPV~@`{2Mt&db8$ zfU@Ye&`oGwg$V2JF12Jlm>+V7JiAVb@!YwJ(+9KU9@Ut)?T$jsG+*-y?pm!qvWBJ; z55%A@a~x_~9;`S<+6>gS&Q<6hUa1Z|FZ3m$V9HJXSpB%KR&Zowr;#>iq8McO3=be) z9LenPqr|>&6Obod?H!o6JD;ke- zcoWo=jerh@c}RRxg9lH=+_XDf$^ohcLj%7Qaf+BiSdZV0;MfN9=wR5gtM(+b7?>1f z=gto?Zck1M)Cmo%)l4ookfYHWhC7y4YAC(1Je!ll)V(z+gvM(_alo901 zwy75drcXiL61;5*)(qOT-T&MY>MpB+AFSQn_woX+aY_TwfikG5BvcMw_)3d0L-BM! zqiOE+h(+ch0qdWw-(Sunj3F$@8^>uxaSg;7hy~&fy^kb60&ykZjhvUc2p;#QZN@ed z69fv9>yBE8h_KgrI|?D+9tS&}4q-hu4?$j+80HntY{EN3c{D-2Xhqd*f`lv@ByYqj zPd;Nabdvhqgx(@jz`8x+G`d5i73;c+YB*h`ON$M!p#*riyr}Qegdd=XA9CEmhRrS6 zl`MDkI&Km*wmc2$U5Vl^37?(_vmf`$OiE{Ab6MlI3|LwO1!hs{tAvqFZ_ve*C93UB z;b7$&RfV{RJe|ij!B1VY`4~n|4{5P9yEEphy};$j=oVyjS1Q_quSNBU_K+f4G5RNjxuMO-!PIz8(Of}=0G)!% zW`y|cvLXq-9gA}CTcSh6Ik2|WfA)E?nU836lp2#PW^)JM7M_h{ zIt?A?P~Z>E4uWtXyyDt+N~ooJ#}KADhIZi^tIBcVU@pOjf^dL*~ERqIHgRk(~gC=u}EOekbk@%7M&;E1M!iY9&oR ztDCW1G-*TUy)eYh4#`^kf%KqYJP~Rn8NoOk<(tg=c+q63Pw}AVNfA|73TE!1Bpdj>{M%3b*x|Xa8y(I5w^8Ey&~28-I$I~=4kpdnEo*q zORn+51l_tSFg3pE)4wgP#_2;Rd&h}G8SxG|tXUBWT;N_DSk>tf2Y;vdpLC;rVG?co(D@igG*-ns*9=g zk!r1yFBBEh>V5yUE1JK&Vmwm{n49R6;6-#{n}{x0&pLDT_1N_+>+0N>FryK;SKA`m z!J1bK>Q<<9^s`Ilh^0Y{7Ij?bcbtgAv%$gZ3nl=NMh2z&s(Lrm9%m$B7ilg_&|R`|4&b`^g3cU_z$ zG`>h4lB?=~zDk}o9$kp@m$i%714-_mauzVIy3-ib(Mh01x2j-WyCHU4UDJ#9dz1Db zR~0AU+i8I+1MT#3#l8u`@KV_RV{>c-b!(3%tzvb$5K_wU82!+^)n^PH%o8{9pa^Wi zJfAO?Zdx@;L2KuST%0^SJQO^fdb1(DA7TN^5gs65G} zgESwNsyPn%el*ElHW57p3qyHx?v0)JhHmBVm)xlTd4~%YZ^(cbZAHg;=t}^*BrL>yrDWUvgld5SXgMW@jX9~bpUoR z(4^U1@{QDxYiGN~oGbP#Q~d9U7vthLyPj_vl5GF7t5Thf>jSthsy~7G6W~(z#R^Ny)jZ@Sg1;3toqn zrtIhCR2~Jl4M?iyCU?(dBO){nGQ91aZJl4mZ$)<%)J z#HsakbJq*E!hhA?|9>;-KQQI)m|mTK2iDxak?@aKBo<4Dh;ZL!arxE-kBLGfOVQ@P zd&38TBv<-2)ap`{e)}RJnIunW>xrFAuG7geLF4>#q^0H|dlA}F&EuwuG0r|OR7j2K zuaI+Aq8t(Xe=zT?8O2AQq@L8d_54Z1HfJAHk9YP`l;sCCgQ`vz?&{mnp<2GBE}CF= z&J4~tT^4CE2my+hP(6Ck(4XCpMk?5GG^)%lyB9xnI5~J$J%#hny!Z*2BO}X8;DaU~ znKa1>63YqO2UPFSd7MlCUzQL=x4bR>JMjKk<&uA_zWm=;AJpkLND`XnTQur_EB;f# z+(nvprr%gC9T^WcD|v#9A@j+=1OcK~^FZACF7L6*rft8wS5Ut7qznd}uoC&~7#}ZB?aNrU$0Y+aP*W5gR{u zqj=)jQOFi2|Aevazw5X3G_lVGDfxnNo*o2}U~q2KyBJ|kZ=@Tz2dk<$rzN2CgnWyE zYa_myz+WNAZFZZHuybgCa*MN5kX&NZ+ScID^WA8P!`wPbMzz2b7Ru-H(7 zVk3P}tYtNyAHTHgCjaOwvf1On!ud~etu7wU-gzeTz!)JfZG#|@s-^;_d7P)W;&b7S z{^}l+3QIZIlpmvRG;)A9+h0c$zr9|TH%v1NVNpuCsh~d?YQMfiu;tj+y>YpD>eSh7 z5#VJ$3!)%hib;GifZlRfpN6{Sq;enQL-=2>b+fYLpWGX?m)ZWy`*{nzKe>m=>mKFo z%l~1(Ux`?y^fRkF8OUraF|ra(NC1#BK{u7Z@bmFoYdY1B&FF^P&zb87dx-hkEWClMldU%lzRh6!52%0){9tXG>2$dUqo>F9}d`tp`19W(lR{p z|Aj#>-;Ced_pde;=&je% z>u{N5u`JZO=K7X_TCnb~&9waGEL``=2vzli&%$G3g?9n2gO2JBzj zO=>J0pds7I;RvW|7~<$n(--_BNj;Dg5pmvjK(`z;1x(n8AlrLlwF%35XPkFXqVGnz zBsJZnp2Pk`(*ZXnk~%<3dHx&MBJAoTVr;C6xeAKA54-X0(q_vsTN^xnL=o z6&^k|IwJBiaRp?aBr*w|9yKN9@tEn3P;(xrzJ{`#>P3gPhhAf8#r?7S^OZIsLE>#M zYSb}Ok|&AZc{9xccw=A743>t;qXPNACaUAWD4Hwv>CpROAl zubk11n^bj73oaMOhZ9mt99LEtUZKHHkffVlu;_!xkmq>7c{9ZUk=<~A&2Adhe=91c zGFvBaA%Gy9-Z}rrXGJv@N{Ama$ivedc)GdU6<`;{03Y1H)&;UQ$%7X17p8t^VPhbT zb3FgDzTDp?Kzg4=rDH|=&E>Cq;eWF%hCLL%my0KpD_!75D(ivoUAd?Zxt}(N7PqNf z9YS!;R*uYTO3nPV3rfqbt}2LLa2NJ_=qITdJGYlLO-|J3TrZ}t%0`5u<~aB0*{bpm z<~Ejg@O+wIJ_=eQqsU9l3!6Tt@J53q=XOu6m74#`!@t>rW_|be)d-l23My*eKN12I z9t7s^1?KM_|3UI@qfY@kMgE}D<>HVcNp)v#1)#->58k%JcaX#( zyRLs}E?DB6CBzJT-43any13iPVHSjPz7Qf)m+o;nYf#lpe8dj*eFdW)qPbICOOIbx zPhoyJQfj?Sr#_tY*`%Y4mDwrx_(?t+Ef8%MbMXR1wol(cxg zabCHL5xew8%l><4I^!+%%MqV{ANss8rPtx!q5yZPsy6=5oAA?XLCSb7Nb1rIAbPR( z>IigxVoE~R<-b8v016&#L^sD1vit-WYYQ|x^E)5){a6cG;cdz0C5Aq5F^FS0ws$q4PhA z3FpAdySG?C8DP(+{nuES(fx^qQkEcjkXT@t<9V%;MJ^g8W{6PdYbb!Zj`eqft^Chu zqa4Pxy#GUZ{`WlWtGiviQFzTm($_phb^Y6(Xli<)zR=KtjYBP?V??#3rdvQ28nLi+ z(bROBFw23fshq;#Tavb9a2<#A+b15>da-2h227&eNad?TIY2RJWfJq)aAKfsvWb!= zWl{httTJSby!(o)gtW{9#kEGwq^QnDQa>ktK%aF+;-S{HsYWq%!I}nSlwZ70(ZJn+ z)uSGJR^2w?)}WE(r>A@qX76s_KlU`y!v&@N0Gsl*?qG2ub=$=MtU;fo5TU)vKZYkr zK%@BG^=yc$^1#%832rZ-y}!1!96SrQXQd{6^AyvJ<`qr#a|~t`x=a&DY>R6-? zy;paVm(~Tot&%R_)r5!UklcK38iK{DGOO6IX|6t^oq6PL|E;NKc7(-P{53zt8`Lk{ zR*W;T=FT?#>hgf!7A*LH&H6tdN@OlyfjeK)l={fxiD}8?BN0b5D9%#D?q33TPh-)%-PoE5&0`z$-+=Wa>=|*cn8axP-;< z3|T#O|GE=h_dn=b{$*q`Uy=I?Md}+`_$(Zpf|u=p`?A?Jzim9L=f}Z1E4)+S@>;sx zRWy|k8NBIAGz}fnvX}JLxYB%8E&Uz1J#;Pf7Fw(KrxqOH5?}YXZ&AF*X+w`i#>Gwh zRIiX7rT^g^X9t`+B}RIT4>Zm7=RuZ-)us~uUm>XA;jDi52G?)@g6luN`>jv>f$Q;g z$4$#zQvbgo1m&mgKX4uFx%5|>*nfUpC5!0~@_UFE$Lw5@%R+{sLjPOO6vdzM+B9Ze zHMz^-*<**)WTC^g7)*1}2zY#Y@juTeFA07-^w;P^-_@my3YEC(gs3GO{!Os-PA zb6#M(CJl5zH%513JTqEXG;A*tDE&PLbhM<`Hs~wuQ2~_w1sRS1^Fw}Y?B6i@hnJ5M zkN>qb-uDBFt<@lE)iKi`L3 zywe))&)x0&mmo^^Z;!0r!)+idY`yp zR9rAA9h#&TWn!ZOvvVHcTyAVLJL7*m;O$~qOmO4)Yr0lV(2{U7Q+@h9?n*j0!Y2td&}M;86oxF=b@peiN5|A z$h#U%vSjIbvOLWs1#bjIv_cgmq&RvUTA8^s&z$FRJTuRp=m2zLg)XnMHu6rD41@3Y zkqNVz@x};Sk>_)^EIa|8t42#WqlXdHxCy@OQ;YdLQkz0rI629ohvolz@<0c&l!5C_ zoMmPa4}?%&D|F4%&&?y&<}SyN^vZnYDUZ%D94me?KJ^pF-<5^d#83ut?jA&fQaiAV zx+d@eBJM8jWE=f)Wa*+)0=k9)USB$I42{g{^L2!2CM-g z2F;Hi++t`AWg;dX|8p1}$*-h3PZW!Et*K!58+ex;FpCq&l+^E-tI#sVE!LoFdv*!( z*c5hI=Tnw4Rxqq$T3^O;VGba$k`|uu4;w$Ymb6v0v^}wKYnB^RO+ztOr#KkbjEr7V zz7r>tfzqvBAemh}MpJR>`hsISNOalCa*y*oZp@5-oDPLQ%RY;XCRxeVkf-hLkh^1+ zU$-<_F*zY_B)YPEJbsMnF_I9MH2VbBLXgnnIAq~WT2Rebqn_G#U)5sS;9ffG!^IMN z4PAAHWL~cuTO7ZHc}zQ|eYlVQ6dZh?U3U$1gu`zE7~Bxex_31$1sok6ee!YzYng+0BJYgf_(E@YA(d%^l>2FOmnRC>)< zSXPM3Rm>EX!CnKeIZdzYSsdD$hr$Jiv}(F7X4zI8QOjlu-Ub~I-Ub=36&o2A4*GnA3-AcqJ4;6a|3EOR+}uAEaw+}?6cJ(r`CQ}X4wI61PF_MiD=f|4 z7uirACB9My?fr~`^DHk{)M?Lb1Pc={L(Qsl_|HSlJaZ1uiYq^TV+?~YO>ULlVUd+$ zDaPp@tA-=5QK`Q3isug;y%uW@an}9>BV$pfF0n2)-#B}fIfk+n;z08Zsi==f20K!z zuD0L@cx5Dr81Is{L~yJsQ`qh77W&TfByCz%c@^29G?JyKMBY$v?v?q|sg;IzC!-3qU_5~)GU|}S7xoZAd~It3 z!M3@t-q~NgE5Je~V&9oV91mW^I3Xnqs`$wMET{H{hKCP(A1l@fJ)BYYN&HwaFin0U z1-p<9cj*TLc`9iH(kCztvgLkjmno`M?QFfPnLgU63f_ix|nd@yGxMu+?d z;+Zi`ocH(I%?U_#0laug@zC@1ivFl%>p{}l?@XBeu@>n?F~JB-myh4OEV-Gi+6)Eu zX~WpyBA+B7E*yqzPVx4|e)zx&iz;yN$n`~8#|zw62XPgtW5ee9J!vSSZT#nx_bqg- zepqgh2vVmX!CQU|j5=}%!THSKYayM%3-{vsgk6a~*q`yjKgzIoO1F5gfVntLc4XrJ zj!>;?PJ%SQvlZxn8vj`|=o$Cb`FrAI6ui8_?d_3%LSd`CA0c+-w~W}SqTJKLuRJ6% zs4ElsRm-@QF5^L9c6)p5{d6b^y5T7s&WegAm}#8ErgIK%YM+Wy?R?GycgH87Z3jCw zDy*|OyET$7o|DcBct^g*P+ck<$3c8!1_XSkQJ0kVA-N)6UvEd0iZDLosybabv__OUjU?*#2(vkeh`o=|o`X-f3E1nD^9 zJLuw2<0UR!NxGij`Mcd7#bE;3W8wTPs@~FuJo|p-M%32=vZY_#U+OP6*H*++4U-CT zw^q{Bc(MuA6JBV&-Ykx~kJTzJP?8=>pNg`O!H;mcVs3lH{gu5Z4(I=$^{y+H8&fG)`O zD|SP2kU`#Lk=R0cJv?`+u8Dc3VsU@5c@>#!bNspYI_Fx1P>|I6hR8yJ7WQ%72E*B2 zj-^Cs(E2Boax9avR~POS3{bl1vK_wss#aoA1gGZFW3XfvWcUC~Yn#5*_v&~kE7q3^ zA5oAqKxUf*VQDIWjE4^MN=9q>z3^er`vsOi?UzlEsoex+&uoO$>EWAT3Bma{u2{i) zu6{aRGs|n?WyY!4IV^%*Nj+YL@n{9+m1ymPR2z$xhS8j>;fRE6FRtraR4vrpmQe-Cv2OliF%JXH z3U3K|f!AuJLdp)4U$^AChlI@rr*XyDjV2=-;5(~eHrh+HV6$;X))U-W_Nb-MQ>b&;u4D98zKwtpc=aDM) zEM6z%5ea~WJ)>bYoh+S#Kt4cl0Nm4eWuPqTaK0z5&%EmELNdT%qOb*jXLIpT0yRMZ z`i`^S>FjW6!q`%)<;lbWfz}OSMqg~tTxg;Qz*N1aibEvx(VvbbzBmrq;t!+I)qZosMdKRd27qGH0U_uXSNmgtU=+i25Y{_wEqQiW*3v z>Wntqp}}Q*YDLeAwDxmN3jr=e5&CF{|8_`P0=p zY>l2lmYrUIsFA5-=YdZfjn-?YLg;KJs-1>q^v1k# z8ct^Yp_Gp|z*fDt^mU2KhDoU9GyUwnU&(wEvO?XBFIEh-#{4m+Kc4vg)<~*WeS1uX z8D9h8WHs_E`;Pjynu10O#y_kxzc7XQhk7zH9MR1OcAE7=9oINiID}(o+YuH|1za20 zXm8zUYW?X`O^Rab*9+hgGB1ezbYiV_z2xW%UE|?GGb~h)Tpv+7asq}93cf7Eg7jd8 zU``2Jym3iq$$g4`f1)!X5$jEI23m{Jn>)=$KDU35KyQdBUDLggV!91l=%Rnb&vtc1 z97=`7YM&NSM-q$0#T`ql&^c7bmKaIi+(9DStT@TwkpL2vOzA`uNuYv`e8+u_v8;%P zRi224)jUF-jSxQ6mD0JlzOQ*Sv_pz>PGzmBRA-($nz!)Nt#SWCKLeBPt=w<1X6;Dk zN_rkTllsBdQDCt4cw)J1048p0+xRyM>lBRM4rfD7E95+8C#{`QEaqG_4}MRgb77k8 zK`~OiprCzxMUqgVtUTRb>eRz@)0Z%62lBic)wDYWa()+?s~DamS}L|>T5;pB^@XBg z?<;;fTBiKAi)?S7VVzbc_~STQK}~1QPjClaH35!V*d5=_ia6DKyuT&IR33Xkbodhu z$ALFmUjs1lxvfVVjk_!=jXKcyZ4p2d+_!pTCd+3T?t@*mN>E3GUkf^F_QoQWBP{Modjg9F1IV3yUWg6IA6*=#>o4O7EcFT7$;TN&iE3LPC%0whp5Zw;F_Hk(&qn%U zKPyQ;CTp>Vsnoi}>?zI-P1x{2_Fz-(?H-K6X-^T=}+x zivBuM%JscP)LM;YgV2Ub=7;r?=4r#v&jq$9{f zXi4DYLWaf@q95SS?@bkFng9tD^id)5Om7;RRHmHxkWn|ppiDX3NUeJcNb_6J$(yp8 z*I&+s15Q?MU-)XnxloH=325N4WQb`*%ex%cu4WHfzH&KsWFm7$H2pqkK9{2uzTM4F zZuMYa7&^)KRmWF@6p;RQKRPTY^;t(Pag;udArIK(d1kr9fLEN{bdcB>WDzua#Q`JR z!>wnCzpO_?;UR2t0P9IocZf+~H8W7e49~Ol;XnyQeX9ZEVrheVU>Pa03SrT9H9=U$ zDjijXckeybOE{}RRsmxbh(I_y3XQCZ(u+9r$}pZXUf{pY<-( zy!kL&)3JXrJL#epFIow$;j605XJWgqcJEjsqnscEr^BS$+a9R`qkS+}fBftaYFGbL zx3JR3Z^-Bu-(+SowkcgP`(u3~-Vv-3e2X&DUo)H-8~peXKjCH?g>xs{N0g8DLA205BSNB_MtYQEVGOF*bl=5 z`gU9RU9R<{$V z%kkyqETtvlmu6Wg3^fP_s>@TeyAbvcU|%^ZdOzCq_Y=^wj5ypxCYvhr`ji{`5wMu; z^617H@0PNd$=4hn%#HfUDOd0jeQn$}%Qnmq#{^;XXm?oY_%tv_X#6Uj1!ps5hAyj_ zzfc|jGITjgf`nup6~i9Q!zW=*GHGdm58k!=A7wA{ zM_#0|s5{m#LA_8e*Le=dyKC>H+BfTcmU*Yz8PpT}G1p@}jsi`)@Uv z*XZJH2Gm(u2?mK&z4h$kFuM(R%iKRjUPn0Ccv}DtjsSx0>e5eje2*+}H47n$ z;b`6}4fK=6fM>B`>f<@I(S={P$SzV&0LDuBPLzeXAr|Q*tbG&(&JH5t$Lc2hFb%O z+ojgmnv+$QrmCN)S-$Ffu<2qhMDD>?ETvN^kY@K0eS(lAy5)4xa6RrN+CxZ2g9GqZ zEc=H+(CS=uKx?SZx$i`s^%mfX#EWiN?z}%`tFA4hjP{YNG46m(de==3_wE?3I(52F z_fz*&^WHgqVB6leiq5IlJ^DO8i4+sq`IBLrkHGAmGZDlRWN%9B5-0!K6FoYQ99#7GF_;rs{V}fvq2JO`VQ@n21CVv z>IEUYWRj-Y+oh30P%rca_6VINll^Y1FZ$!Jo%DOq>6y7%{EyH{MZ)>k!w|xB^mV#O z0P?6^=UJKoZjP~G`Fq)j-2+`ec4Em;?BeBq=Q>c= z3YrE@{=A8Pl{A7&hi<#gQOUi%c>5~Kjyk;RdVz8g5@kj_+3+rMq89j<`hsflG%>3! z`$n!L)l*;P^s-Xht`gibd$!H8noIq>BQPuZWAmFF0F7a3FZ#jg(vf7uvIo*fiB4zy zhUF&<>2Pj*zvI{SrM7QLx0=(k$`1uY5AWo+?xVk1PCu6EQ`v4&q7nk^ z=6VilmaRxuRF?>~9OOCHIkUDID=$YgL}OHm6b;%VmgvJSOS&MsJl9?#QRmX=y-Q`o zX2gKyq{I#D=As|N=`P%O(;2xp!7+zQF}zzZNU67 zXUVXnR4TOTiLoiR;YV!w2^Y-eH9Bo`=dGEaq9_+9!CI0_c|E(9Cx`ZGdd65JmY=dT zpZO=p{^NJUbIF#!u~3JuzdEMT!6O`MFCRsVVp^fX z%ks5qNCVUIR}mH?R;S^M7Gi}|3BvWwD$j(>gSQOAX^XnuC>GhPlF+FHuYKyjwkBTF zS(f)#m~l|1XRXaN9am3VPBYRdSD_#?myhD8m!WQ3F$rJqkew`8hY@LkD#P983|8|| zEJlUqk4hJP@zPQxBhr#fi&(sm3l-n&I!QbWP7>3UhHVqBQ|fQj2dqSd=M9Bd4OgW~ zhkf^5OAJ`|o*gmC48`Zoie12>xwH%mP8x564jj#Ic5*&wJ;r;Q*o(o>9*9g4nr88+ z-T7nIS@#9boJC79KOfXaT=MxlLS8>-^*AKl@|W391{2BC++W}iakPnX^;dlFtvIA0 zc=lvEp}REUC)iK+FJvwfuvlo(pZ*lCfxCRIE~YJH>J^-Dc%B{7K2NRozJy3645DpNn{sCiz&F%JjZziNc+nmXkBckH7af!)xH`C z)c}wv*$ar13-0ak8yy12)vJp8D`bWX1@p=Q0SZiWZkz+J(x2ZCJd>bs7QWix@%7_HTXCb30`zOtz)eQ6k zCiDCFTWlTh(dLnqmd+okbHaoGs1+eHl7g{>dYQ%+O-@;YXbBO6Dxv+FAx6rRRp#gl z;F~$)J9HiPi9fjWf3SYh#>LNETG{_0%}n<#I>!gXj=S5w%&Bz$U6$!&r&i(YV~&r1 z;5)7j){iOe-4~{M9|pk`<&vmq4ZE#LTLOR5nlvLs&M~GP46TYTm}a7;P|;epOZaex}$sTF5frXf~5x{VGD{AFdpf^a+J#3TxTRN9Oo!0Fq{Ww5fllz0*udB1Y$kR*1Kzp*x zS^Ji-DGsUZD77oxp}6->>#`UA(LRC|N1C>QD79Sic6RS__ou0r*Ur{({p8Z+?&Cvs z*paElL-c)%(n|nYw(7m@QnPWp;-YfOa6*N`uaHQi>kT)}YGO;E(S}GKNw8&gP;|Lh zDEU>USQ3JWQycWO0O`6R;F1QA>G$84+g*0kAqeA zCnbLk@W)M4rdhnt_r!VaABikElI9H6B5+&EVv=f!h_R@IzWM1I0}FfNEl4miJ0y<@ zrq-81N(0e|XJCY|Ek5=ftLe9ncj=m+_;e{?AElup)a*qYc4RXw3&UmcsFXJ%auBbmABBiSGjRSIP24%uv&Osfd_V+TZPQvlTLVnbsiaap21Sh?dzdKxQESZRh-Q`Vfxs3W1AZXDc-cxZHVts^wSQ;kPdTA79D59zKs+@2DERhU39cIUM30`vg|$P_Hd^^99Mo{r zjCQ}3ob-xw(*QptYiTno(Ka=s>INi$Nte?RrD_;iP_TD-QQPFsQs3;-yOw3w$EN-% zIc)?{3N#B!dBip&O}kLd zQ#NMB%Hv@ea{mCm`pqojXe1EtF@;j&W)S*3)@_K5XX4|IX6RdJeE-R{1TV=R_TKjr zHb}L+s;^_)wb1saIa06h4q*DGVKi7fJL@7!<^msxB>PQn=yD%1-_k*caE8Ec^Q>ON zvgbTE`&uRK6r!>|7n<~oF4%l z7pn>TZ6+FEXKnGFzxJfojwcrhi)sCxe@xKb9>8i~@{YLu{rZ=Xfr@y>WDY)^)7Dl6>x?wtNvY-)<5b8R{m#$nsO2ONw@i{$1lyeEa1`@fMt)0v z9QM}NQ3c&+hZkheY?T!e99g|YxoM!cVjwLneVLe;Ym7+%7#M<{SE(@_VuU1e&Is?(AhV zeTQ6K?LEXaJotMpEj(*+Mg*rxPFkyop^j~~qPTHR$0`7x7~m73AD3eTyQ!9NoZeCX zNzXR5RB$#je*>ODn zHL*$Ts`ZS`3I_WybsCQ2%`BaWh}#-Ss%05NdG)r8jYmfC3^;#hc?ZI}=QC!p)%SbN zO(1^bd>?v=U`KsHhQka zeV%EAOHX~~C`x5cG!m-7* zq=BC{OZ_P8KL*6#QZ^w^{uZ55En2KVW$%i^^YLUGRpWgB=EilQVH+uGD(poJt%lo; z(Mhz31*SI`x%&aQN3^F0idCMiZmMk@$VFc&_8v5(JKieUqN=8#QjA5Mlqo{58_efW zEEE9A9ma?okvGZJ59UD3{`W&*WSfE${Z+3E%-}y+nJ`- z5G4ieLQx~j%ToD_#~yaKxOBUQWTnb$ODs9cj@0zBv|%YKc2mHo!Cjf(^i5eBot zpH=OtpRPU5WIV`7#1G-$x7ov~8-{PBTkX@}ZITy-RSeXw&wO=!#aOYp#-7aG_s?g_ z_T2Y2v=7<_libIyL&4s54qZ~8k=hqq;>lSrn?c1})G6^#l-0TYw5MEYMQyj9m2R=K zBuy?U3+$c569YGC;$I&pukvf|Cuu{LZ1@pnT9S>qs>}J!g_!&$-8OtnQ9W+Ws_jsH zw|~&;95cu9ror{sE0dzc)` zc8l#EZFu%tW~|1X1!tY3a&O>HHAe<9m3BODh)GZ{jb1vKB_+6}gPnO337sX@RgF;qWh@= z&gR(m!j;w@Z1}oxbgi1g1HqxecpPLA#%1QXDOQl7Q$N zjtSO~qZj(<4}z+U$@T>;v2ivy^*USu?SWSFw@{CG2B$6ydGo6(wT0rO^XqRas^k5O zzDDf@8}jT#jzY;z{dOxngEz)pOvvCxI561)dV9oSyI#6YR~N9Hr~1Fj#{KJ}43^V5 zBi^^6+ZkOiURvlbSFbeTa>Dt+C8~>n^-;^!DQYx>@dA7uh$_XG3KdJN;()GN8Q*bg zTyM&-p?G;qmHndB?_A@oW?72rhdhU&32Td(CkhppZ{yK=jHk^qm+_P}hU%f0a`ChC zg4=1sxnheq%#`OCbIh_*VZ6<JBe+?(0E#AG zV_9>}C(AQ#q==W;Q=Cyf(05W-;|o1A=#?F5#A_kB3%6etbQ>Twx?ZQDn!TefQrRQo zS(mmegF_tJ-{j}tR|~ZejfB<#(D)*Q^n8!_cxg&ISw` z)7>7>O8vH(aIdf9w-cQJ+pF|n+BC{;a@ZSZs!3N|=^z>&0Ea38O2-z-FFY39q0YB= zMG?!L@T~Gv)<=!_*y>vLspt=YpKVYL*6kqgc)G@&x7eYpJo@oq`ZvlSv*^SXQ)mW! z@o#u4rE_A`-ybb8W_76tu6Q&NG^k1&3ARp zeE7R3Uv3HA#Lf;9OI=bbgx*-F-94zLo*qhW-Cf%yi%58?{SN$KP z;d7>s^@8@M0T^fG)?MHvmi1KKz;8Y^CNdFgS@(9DE%nOy)^z}OXA5ktwzAFd8V!Un zAP*y|mT@eRV>b}1&Rhz0=|$7ZZByC$*)6Yy7N>d6S9$fv_DBRjIV#m{-Co_Rqj_H4 zD}i{KHBS#uo{s%e2_fnKN=Tes{*3e66DUi3JAcW=T2?u}^C1Rj)4Q9JSbdTXGR4kD z%!OwRBt0qGWjVY=C8V(UY?`(mVB%8OSrO$EL-3yZH0kJHrQoMw1wDfL$m<63wwHxias9j0N=t$6ymlcTB*cAch~JdFsr9i+VJ!|wvF zo*&+&)i9#|3Mgj9hd;H}eUQTb_@5O0EMSQ5-ecZdUQRc@aVdp=UVz$bWYKhtmmbBP zZyNs>X&Bq>{$%Jw(zE8y{8M03{FVsyYloaNh$OD;C`k|v_?jYFw95Be%=VLi7dRm8 zakuiw^cfr3(~k0avg7+V;eeX`Ksp+sVVg z)5Gg_I!Ve?MI?gc^8h931*ZDjDDKcxx%rc3&xYCq+W)p@{=@i;s`W>xz>3Gz_ji&$ zUg>8jK^;_J+aOohPQF^O$%mvA^vQguLmPF6B;W7f)dgW+jd&y`OK7BgJNX?)(C(X8drTXI>=9c;=Ot05-?K!xqbW`T`X6r24qiDc3US9Zo5Z#?;R$_8b z5Cus$GxM7${H~rh3n>dni1y~F0NSpitk!?=adq{FtpPn0i+%H-+9>G>pAjMnOI!79 zq+D+_!IZV4U!h=tDoC~J8wD);V!;|l9mEY-V)>({}zi_A7w`teG~t_4>77> zDNdVPcGWDueVJf)(e%J{wgrwg=1kbXT7GGrmc?&EsX^*gXj5IZqBO&@yuNLCSAP5K zy}iGrc`tE{8(wBMw$R-$&f#~Wx}+7*`9eJ68nfiU;kjw{> z2abBy_+A2OmfbNJ*s0q8?<9%;hH=(2{_T%$=H<(28^vGYXvEwi3C`!d(Ge7|fa0Al z!9HQ8Yo#XcXig%9x~n^h%%As4K>?-ZL$+0gSm41aMZ8shlrYQCZy>-NQkSi!q^Uo(`cE{1h8}%!gmCXlee82p<*M8aB^+8hCVA+XTOrJ zcJ3X0HD4?tnmm_5ziI4_B2R;+k@DD`WP_S&l0wHT26KMCwt$ z+S-=H0(0>)V5CX{Nil<++nQ3k5RZnk(kYB(Ic?V=VFp-lF>>{^glwnWT9Q`I$i3Vf zzmK8u(XN%I(y@D-gr}Hsrrc>Px>`*(+Vcl%s!jyzwVzXuc)psaokI)C0;(L$RqOG} zc7P3iN0rRqzI~}p0QNrQ0nLe?^S#D$&`Sn z^kf$8OUWwuT?Vh>wH5!Xa!bUoUDcl73hi>{QIZWWn`B=Qn$keRmUKdMdh2nK8|%Lw z@%2UGi3pnL3OKv&19{G$m_R7A6>T+h>@-!?N#Az*DZ%OmfN_&49|E|m$6bpZ!^dVY zN(SaMr4LVRZfYqCXew_MSaEL$ERReQ?o2J=?g2}&)94GX#W?V8`WZJ0ptEVb-wVc| z!CPyE{T2LX-0c=!GWP}nX}2QxwF1&otR|~bUNN8f0`HN8nlc?uibYo)Ro@=cZq3O| zGuenc<0VqdNC8dy)gODy%eqCaQp5z&xKA3%3N3%fU<22=JalGJeEY{ z4Q{Jq*4i82VUArEw7Q;q69Et%zaB{3w9syhhuev*dk6N{V=ZI|c9d2rWkQRqP;jF!m<=)LluGY&)^peNKjykHK7<*{{sW4z8hDh=`&=kb2l$I)Qenv!<)h;Bj|@pySSK;=DnppX}7 zkg2gQHY~XculM}Sy9l8iYJW4$Up7Rh5|{2iDsn{T^bc#}wS4=$bhVTxXBP0MRVg0f zfOLH)8j*%uO!sDomU6f}}aiCyY8Ma18)Gaq? z(8S*uU2p(~X?xt-2BqK1H7_kzPs4o8*q(*Gf#E9^#zUt59nEgef&+T@K2K!#AKTT7 z%{yp}zSzulB(>HvYUf0bNr8^#9QF>|Fr2958d4oppJ0=|Dvwv}dcHt3><_vfuXaga z@1`yB{CI<`&$TDqGzO}VkY_<0a@P+rXT3oF}eIpFX3Sw=KPpx8_&-JJS=U}u) zy*78fK}}^N?AmaP2Cc?54Sq@;a_zen=~{KO_o$zo!>Rwu$HwEylBKIX62 zYH0pdDXf@VEO7XoZ4a{cVXlQg2pzGBiVr*LqFRF`=jvt=lgPxD?8tnH+7(NWb%{h}CQ}S%yQ{ z)+Q(I$gzr(ADxyWZ(F@y(JHX;AHK*e_BWBm`@wu1zIK?}I$4&!I4fBq;=qE({#O2c zg&$Db>d^I3^+&5Jnib52(qhWMa?qTu_=DIQeQJzf`S!a_gh z3r~k0!T9FVt<3EvqCET}j?jfjp7_w4fb1i^cLP123%p(T&^;I-TuBQD-%!&B8s9df9+RSY#Z}B_FKhCi(;R zk7L|%40_)PXNil(t_9+}v8^uINfc3DR@hGW7u!x}K`NBFFJBKiL2`mwNo`4&AC3IzF@jX+h3`{Z) z@jCcn%8-&x+i)nb-usp0=PGmx!ZI4w0JCQFI3s8Z)S0@k|>IGUkV@r|z~)%VS+ zao_eFJC4ONI;n~83~hmB=5ZmH`3kKhS9>Jqw_a^t?ZGZ!q_t;US3DE@kI*kS!$}FW z5j<0egLGK-T246mdOeRGia7FKta)2BLn%7W73zjlYWA06wW(HAE;Ye*4DeJXI^r>% zjuvHkE*IdthbeR&%K~+)u&oD5&&t}1>R@Y>ZXuvBjwB^6o47W#jk0RisD{v%BlBed zTEDvS+@jKKoACvSuRY*E5;S7ZEm6Z!FF##6S40X@Vd^k34y?I>Ke^Zm{l5d2m6uKTpGTkM_SnPu;3(oh4tGVNS=Q1Yck4 z-WJ&~o91S*e1*!$ea3GU&X)*naxSmol-!_N;KsFU@7AM^J*k@IedP8sl9Mz+9-j@I zbpo#ia`n0T#J-!Q@0Y(6!=_vkxxz{B{q_BWCDIjS<_j|u5l|x3q>wi0X1x+koL6Wk zScx7%Ooti{Z4sgjLL0gyAFOyCD@LC#Cuud*uqtyVTib-I*g@QjGCV`?v*g3Nf-FR} zxYr?uITp?Wf3)KkB9Q+?7NF#dxlTfV-}h71m^m?!w4-@Vf+9w z%L1rbnBzfIXV(OQ9!&_R6w4E0QS^-bPPVcbVNb8#Iv3BzXgBOFO7V3!Sl&udobIDC*cV#FkN!TMmz)a_hxmyf@LuIOX`9hDMVQo%kOE)C#AK> z7Hicv%wYn)APTVJ z*Cm;cfH`B*x%*$C8li5u@co-^g{e^d-W<)orODLStJGsrg-b6UmT^k?B@`uBdf^g!u3U+ z$N)>~fEG6nb$tWqN#!>d>NUpiUS zzWbA$)kI;Yj#tz&?q_%#cRmzc^;)5dDsCaX4B7*fw2wEBa*wi0b}0;E?#=O3YDl<5 zCP-~t?1xg;T)iCeQ*k>;)a$D8HqQ|}x0&l}5}vBp{*BV^vDXJ5%v3-UrG}x&^6cAL zd+NAp{9}{6;}n*vyumLkq@=~w1HXDqN}F@q*^6P02V~>vobhaC-olqpU1|n2>7=n& zbn}=S#lTk9($W6R5>+ahu4e3B`}~m+ zgB;L+LFsbFj}aiK+9Mbj5$2iQIEt<(jvW`KQWRo=Wj-^b$iCQ^S|!5MvXr^CFxG=z zSAw1xw|%>-9$!>a9mv1SHxF(+6BFul)2so|d6-kHsKWzw^uEr=!y!ER)M*2hxsMlS zUHf^=oyuzS;B`fyxa0?PHP$P9PVbGAXbYR_U3O1m z_qsd$$>TwE3xzQ;>*f5Ml`*-L*S?SVSX=00Auv{31*iU+I>{m)?Xa6e=VrT#veKFJ z>G|jFu-cT&=%WZeMH8YnTbKqNo*j1ar}ADs4nUI_G9h}{;n!m~oDxr?7eNxZSq0a~ ze&74SXtio%1)r29o?Ftpp7^{H_rk8`kQua`sc{c%6}si+fD|?CX$&ILK~qkG65<@S zdSeApExS=@p|-6VntV=#Qd;!@(srFO1hSHhST#O>s(x zT9-afIYyS$BLZt8kr4#-?3Pe(UDaJAgRUU+F7fX? z@q!JN(Vvkbe&P;ZU_Y9(R{oS!oqu(jV#Xlh8!cC%u=jm!-xG644>wNmNX6Q%4#)Y#~qkzHa5B3;YJ3k1<+x{l+ zp^wh_4}^BAVU&~{7@KtX0{V1-Ejr>&3CA$w#>it1I5dz~=oZRqyz&*S``3!OcvYnJ z82feeL4IaWgycrYedf{>hSk~2XjvL{reYWB=lWLOw(%y0z=0S)UE{emupj0<5>yS z3ydy31I0JRZr(Uvp)GZGA0{!nln%A+Jt|q_**^hVk>;niuv>dcz;)C!9=l|}2wc>q zLxRX`V@XIUfm()cy3A>eW$$FMbrj8QjS^f`Z@nWCwdwHu{cu9+m0M~17iI`xwrsHs zl^v77g9_LuGoKd62Kz*=J(2tE=M*YlO_rc{Eb2U6F(p;u&mksa_QDVkkzf5DH)pI+ zFh)>wax5Fn)bOqr{P@UNWQ%Rahp+>L<}4&zqRahs|Ct<~a-Qt#anUh>qDI%qH@r~jL`!EeP?`JAOzjXPJ%GG29@);En_Wk4#Y?iWX zY2k#{1u&?3J6u1Y)NUrSVNi2?C#y*ZFtW2%Z<;3sU%zIda6d_D6iVJmd`p%ZwN54! zLe0xh$v@r^`^x$FYYT5NVfNlcn5nGXbR`@4Agi#NYAv*RltyeVS07ZCpJ5jQ0F@bH zkEm-}X$dZW=xS9JZS6feO(4GTw}S&EWXrK)Tddl6a&hy#0^jD-SaCxl1gt(wX;JB3 z(_`O3(j^q#M@--{4&>im$D?v&Q?_-o51vs@+e^TQla660jRMlwvjZdmU<_N`ri_b#dbj&j;q^==$b#jf+wg z^JJP$@bWFy@+@u1{H7$I=pCkM9bz~sqAkrqhz@#IHf1?8qs4N>tBsHc(<}V_RF^06QtSXjdV8tj!1-R7f#xt&da(mDvuhkNE5y=eeFRuW)sIlwGt*r z8zQ+far3X99qZe$H#=faDF@*{sbNeXNW7J2b7+cJ-YC*GOxL&{1Z|!#>?z_1mU@9X zUsfl`qFZKP!)yCF7xB*mh5^S&+^1>*P9>}si#3JiF8#0QMomVvPD{HBcdY?*jS8n3 z2oxs??~t>!bELIxl6hU#E@g$-u{T#zPEXslCi?f}ixE^@ARU1S3r}fBp+J<@AlTNV zi~8Pp2bWGZ* zi>&E!Df151nnEv?8W6BTc58K~@%X;})f)>SrQN;9yo0@;H&~M?I$W9NJCq?}OUfQf z6S{9|nBQw=DLn2>bbqEXpg}*cJ^J~0gWc25;9wx>+2eBtC!Em?(TB2}k)bALe%_R= z28m&kfrQPb6#WcZ&C0riN)8hz__Z_p*k&%}T&V_bpS>)`i5N+m>u5-YpJ^40tSmYp z(Zc5_H9H%U-c$I*tD99_h>}{$K4OKRtkd+tJ<6avzuq-EjrQ(F3l$%+;cOV0U5bx| zJ8z$cSn&}`!@i%}u`b+kJd0P5ni;XaMmg3re|=e^Rd&kN*IZ>dw%QJZq2b&rbD(dP z+%u76my;_nxpgt+tzUR@!9G`_aS0hFT+>+Xl3Wh1zw%SoscUMrX`?oOLHIqnF?HOGi+v^mU9A+qx1`kafp3nxMazgB{0hO zSU29?ORixia9^cJ6P1=gB;hECaTZD)R<0B_m5V#z)x8#%t9MGP?; zO_M7L=G77wn;J;=vXfJ@6&J%Z-aa-+o-+DFt#yZwUkv4)$zR*N5x`fE?6>p1DVw=V z{F}Yqn4zQD;9)|~Vo9;N3hT7*?XG%<9K3%dQ^%iJC7Glr95B&)+CpW^oq^-U!Dy(R zK9l!+mSADAnrS}0#c@2aaH*nuSimRSx4kzX* z*FjPa5Ft)bkYt|ln5h`$ZfV#5C4P7)JjQPI2w1QZB0@YM^CR3xbF}*gR^I$X_JL>v*}z3Hi;PDadffwcNvzfKuzR9Fn_ zT(2YEvPy;pkKXywZ{9c7=E6c;gp)dw<37Z2%OPNjr+JR|3T78@6LtlrRsNeK_}@lW zKMMar5`!V^Q7n!86BziPa~yDHn8f%hy#t}iPJib(+@i`A!3I~3UF4)6&_K2e!An6v zVy4N@^Zsuzu>UYxkbxdSz=CEB80yFzLGPRs5*^PVcE?-tss<3QDuB2f;;4^I;cDK= z{A6Ua)8RCv%g)?vp|4zx!LMR`HPlIx@GncuNH#@OuhX z)HmBf8EDt=(tJ9{`Zj<#^z`@_a`8Vn%3t~Q{ht*JRFM1S|El!(cqm{{9q(YNrHUcm zToWTZx)>tcwQCHF9y&&B(wSpNl+sk_h1mcQ==%;IL$>%X760Ps8e2r7r(y)~xE zw+OunO&;+PtR|3UO+I0{I6`*dLyeGuO*jI3xQG6Ew9gZaqed!D#uNVM=DpKURI`}@ z>*^9}jf%+3YU!|?w0ZI+&X0}@j=(Q)Pi@>3HkFzNPqrHtfEw%cW$f?)W~%t}lbV(l zkNLi}^y|~{?ow89bqu_$nTT=o;6Rit1Y8>GdJ z=wqWK_lmFJ#4=)A+IGauwP?Vvz&sW3nqzkOFA)Ai@ga5>O?OSaA#S1c0^y(P>sdcN z>A^-VQuX)EeU%6ylBcdB*VNHR!E#ht1YOcM)Zg7WQ6Kp`jMwX!v^=4M-*2r5n9gS` z&j!S8xBW&k*1wSLAumgttMjP0ExS2b_kfY5TF~*lV6Xp%e`e9%hDq;kFNSEI-6pM{)dAWX1PRs7GVqTizbq$d&YA-?1OCt{@%3dH-*;nJOuiz)NW_#?~;7Je#O z@k*`tQat5k0g@dE6DMCj3`%$qtHv;cy~)BtrGc$U4M%1e32gsQmUsDM+_HuJ!dt;R zTGQCiX^LCf5uPK2JubT$a0J%AGN)1}qO`DabO^2PemOv}ej|xfZWi94u<4W2e+QqK zYtac%6V6)H^Iu4BQMptzTWf3P)XHs&GF*{Crg$r`?}dvio};Mjk{71rCPj z-`{n&FvenoLLq5d2FZqxLFnX909_Y)oacGd+nt1ZRdaN zpZ|Yja6h~6BVe?tEkqckQh3FQ#xBg4_hmJ|CE7Q3fiWka4PC+;_AoZXVx3OS(I1LgmI!&Uv^ zPgWQFTPw8xKS%Lz>@REvi)Oz@modz;Fa^|YO&~ezU+o?D9jY&}+r9!805QZ%Wi$DMYw+?moqf>4Z;P#~0Y6*WWAq|4k8r{pH-2Os zXy<67-d2U_q_nsSzF*gH8!!(mD+3;;Ms#afA>;gN2-TM^ruuGYK~Avwe^9;QzMeF%HzYYvje|6F8-@P$sxmx-e>i0OM ztU0X7cM!ckP7Lw!=K$1S-k_cq@^ubJVBV8xaxNI?oP2M1H*-@FQzZM}Ul?e6Pvfom zt>{+wC$l4YRqyOr{ieIm2P3!G#)T_*RRBphQoye+xTdMC_}GSNYZ@Uwxc;Nt-{=V3<%Vvzx}D#=KnPl=V257w_gT6E6oS|B|k1Ox5f7VN&i@-)BB}Wx3gIJyJmtg zn`E4?TyqemY?j#bCp5(QjoLsoZ8`Lx$b_*_L1Xt6L1u1S;Td}1H3IM4tOTaHq!yWH zS{43XDxejv6DSMoqv`~Rm$@ipkv(X2#9iLC?dKKHd2r=% zWwi9_!7J;5>HG_o4i{}d9w6xHEzif{YqRCeQT%MF`WC6uesdf4*8o2e_y8=k@=^rE z&)ac&LoFirlgNa9jhA^CfOHF^{VS}>GyNl`!tPB>@s;!D{`bn}SeL*K0|5=UB~Tld zwxG(bb1LEE%o|ELgSerZzPZgX2)w)rel*JBfblH1R*QF@WwsS%?`4J_$k{y5a-UXB zmSr|_RJwIP_HnKi7Jrz|-7lotK=EzeN{WH00Xqd`I|XNv|CmN^Y@Gk52r=9HSU|u zqRtY`v0;@-45bCMITZYMBq^<+`1jb{(rvja^m;LRO7fUnY|djawiAY1)Rr?EQmLoK zd}5ocf*A_WmnVv#qkGT-foBZrJmTlCY)icSjvenYn!jcFPz+78BqDCl`B|*AY-sGT zZFDOY`$MrXfWY^x_}*DiZ|cAyHGjfMqy(~b*5Fh^YTI!7YqE8uqMtf#+LNe1;b?XvMOVsSKDf4L`Sj!uct?P(H8D`uSHVST)d#LB#M^)i|z2>S3 zA{)s6!9Kl8$R^Q31R+EVZZ&vMxyxz>{_pFAHZ_0u?hsc7`*oQw)`V-n<|VUsa@!eq z$}Mzub(`3^E~#Vc{&8o#iSgXa0^GP{J=JUzM(f?Nvn-{fh)2SDv$K=5*H-NioT*j& zCXn5tm8fDQO5(w|Q(FUCT^d4w&YydZl~Y66|MdYA_vV@WqEns4z<5((Tj_ecuG2LL zE1is$>5$w9;mEm-gW%o4S-7Cw`lmg{lCIVHy1}5nk^5l5s`iZgDsgqBCvt4SzHk!0dDg5e zc^@{}B_n<;R^p^Tr+!y9GSXs>QC>ph(w=GLU8GJTFh$ z38P$J#clAS!+E2Npa3$T~(z~Z@RV|dkfQh%Rk!odwbV8;xL#e?I{Z{y52Lh|0rFL1QxiRxbX_aV_Oi7yTe48qqxo-db!My?i zLV0@&jt2)>xpBC*g+oZ0+nZp$Z-v%ws-y+zm*Y}$-raT%d)NqgSIO81@NhN6#?3z) zIN2lZvUwZi;cUd-|Psf#B*9 z4|e*8RN(QN)$GSD2c5_4mY_xDxn2Ew($yWu1qqdqcg>SO`1v&NJDQ45Z>ZQCj5w|0 z5WK>9qzLk&92i?ko(Fwwi$YRj=ughNPHc=#e7{$}5WjPszz#J^Z3%kHqKDg9f^jDF zxWc+^P0h!wId;!z`Wo|mOD{CTi;IN-7Hhc4Bx(-T$q#p3*bO?}AADe6yG}m_PVQ3+CU>zh*)OyO zjsx(tEQ+lyr_;ZR&%tiEoEXoa*6jp;bD@S*h8IJG%!l8ddL`ObOpwD=afi-|RHVG^W1zfU4& z8@a%ES!Q2$u5ps<{b_ycbp_R|TmA=UR}xOUjdBBzHmiC#;KtkVa>E_QS&PLk=>b!VW0clw$rqr_3x4m{Qy!GN`{uZ$tVWk^|6IrP03hRS!aB-fqIYOqS> zbc-aaI(6;}P53(XF1&9@wYKM+&q$HLUt5!2*R80-E0bTFd0zM*0;P~=aF=fGAMYPf z0896py*y_z+6J@TK6{y)!Sv7gY27sJT_r&(ScEQ@B`6P!Oo50NuQJ|frgMVjBDP_e zA&p3Rb4V3yxzkK2>M;S2h}t1WU*ZhOk~Nfh0HLcnMaypTZ9R25&BCFp3T1H`(i^R- z9a0XGU>)G0(v6rtWb4r`3S5Q{X}ZVZmBNqh=YH_D?K#Idp8V!A4Q1-Q-@|zPZVq5EzFV0V{Z!$<~Zk*I$CU%OY zggVtLUou^o{*0qYz2dGU4u zHpk%jY+G2cq)2NaS~I1r7Y`{z z#?SY{y2md`z}}2Q{n)1iv*>ihle<&7qVoIKKFehO@B>Axdp#=cjvqrRhIl&zcC^yT zr8Kf;j7gVswrkGNG0nf`ej}ag;1Ok>l^={Bo_ffyrzxu?Fpz%Wi#1fIaQi&Duajai zB_*MpVLK8mLyw>%7baxt)ay>rS@RkHz0W!-s4$w_cBB(skO%ODQ?J#K*IpHNOh#Xy zh*}fot(w?Pem_j}m}@k(%(5b%Z|UHc+|XQRRqLWizEX!U!*aUJ;vuS36LE^0V|60x zxgxh>tWgqcwdxmcW=*WGZk2{?Ra^SlGD=D3F5j>Wj#gQjwI!zwY`DFBaM8Q*qExCS zZ6lGcKVg4JIJWI~U&zFpD*=?=8LY~$rI-BLYiVc?nzSXDA21F*V*4_o5EJbq6`g=II z_I#OSoGlKvx^AYt^51gGF-AzoXE>nyjTt>`1l^oe={I0)7Fc*nx9(DEXLxVaeB04)?u@efLuRmvaTnlwQ0%z`*E!yR+EB*-nY(^dTz3UNov=L=^DX@FAn0R} z;6pQYBcdva=V`{pgaQSg52b-zrJ0xCnub=*uXPtoq<&OUxb{FZ)8Yx>XqbMim zI`L?H0zWoa=5-zSV)-6%l4LR4y*X{J@=Q|cJl_H-W4ZRNDimB2GP*zqK1Va+nVWUD z)chMT&wcmHS+~`RHmj4(=&|a36v`zt<^9izQa$Y3MAL+bucbn5*SZTxm2>QrwX)W8 zqICTw!RQktCsTXQ2~h_vsrI9)WB4|U=5NDU#%H=fN!uMNy<@c9$|ag>{wkIod_$RS zuvf)Xf%8#K1GJ(XC=5{OV+Bm5=^|SHxnwhx$0|0I9pKv}EtFhEYWTGeRv|*h46|z# z;fRt_4%zi?c>MuDf_D~VTRryrR_uTV(9w1#qf;Xk+DGLl>Gi-KH)_L&Zkg9|GPe?Mw-V~Io-E)G z+xm?TvXLLV3E!zqEOMeE}wI|o|%=%yRPWo+xccSSDd~)pUM?o)|`q?#QESyXmV_;JW3Dvq#^hk=v zqH5ss6nGaGP;My-z+{EF?;Eg{(qjD*aK3OR!D(bvxbL?wzIZHUzWp5Fl`_tVL!goc zq<^^c`Qz0|L()sx;4@}2s`JOvEVQ)$aO>~PIX6dx9wKzkXV$(&`b>$PDP42%%9sZAlw{7r0$*ji&kjQ^_9qx-T{3Hi; zTKC}l1EEN%FT}&XIkK(qXM^lEU!J=(uVpNY>L$ii_Y0M-tysX?5=$p<>(;s@17v?TEPV3dq?H?>B>we0J$!=9G#84hYL%>xORn9da&7TfFe9^D zBZfA%+k*nUDiXNcO|=Mu+Sd(Pq}LadR=653LDmlaKhOX2A=disVd;~^6MtV_hHznD z=^6U^e>S=PuN&VoDgPw1(0L^Ow!7?HV-VxVgv>d(Ct(+u6<#w}DpG8f6b>pvc|7c4H#>DxF&P#9A%E$Vu3XWOhX2I}3R_hL5D7vei6T;Z z3&kCKdKdt`Tb~b=$>v4)uRor{?uS2^Tj%7$Kgv!uSjj&M{Pwz=6gWe+W|=IG577NY zj3l+HFlseBIQQyb$1m&{iQp#1>v$n@u)zb3nSpNY`tMkw{anAi*x??HJQa%XeMP z4Ws>6Xo22r|G0#EL1qZY{ylg_MVh?>_k9P+BdrbhdP_(6y$Z>_xn9HNEwPRyyo*VT z9Mzyp^B1h&UbCRdzQz;%E3V}`)>u3MIQ}N^O6~-Srr<^aJ|Nnu`S&ZHi zA&*%0Qy?eee0ICxh(W?A9tDXoV_P)xkl2s+D-96?5&<{vnzp z#GA4Goq_lp6UVNPX!K8lbEL@stO^(Y@h?#PDxN{y3K8kobKsfLfPam~O}}{;W^uOn zKY9-TMJ+)?n8URLaOM@=!csPeKd=_hXwx+eRn&u-ZK*?ODudj%3xDnfhk{dK#iZbj z!5Hl>rd&^>#aS2@sO2$qiqF}q!ofxmpk|}5v0yVs?3}*1-1+z%*w8GG_&blt+LRo}1kt%iRf& znR$B_Yvt5mn;{#HNidC$unRV;8;agjIS552*380SK{{`%V7|lb%W!MWota834x>KW z=Vg#rS4kaJCjQA-BU&^;xYF?pFJES@7A-F9Gx)AaI1z_V)o&v?dU^C~M2sLpg6a=; z>G%jAriP0#!a+mZ-Azz4mmxS0WDlEiR5#Aoff}@st_F#X_Up08>tA?o)JImB4GMSU z_zbp~1VTpbqckNhSPM`*A$JO?c>)}TE~N@uP0!KF-Z^#YdBJ;%xCuBc*^4W*^Z?V9 ziz-bCd1)tm=o%m@U?Ldn#%0rzZZsjhIs@`CeH7iJ>}_vY1|I?tP#zd_&o9KQbk}F7 zzCDy5ed6L3q2_O=fzljRhkEp0n4|pAd4D7*06gcpK`{kA>?BjVM6jbgD)gOWsDJUc zsnryEMYTdn0gie+Ey6x}Kas(VzK65BwK~iQ{k-)ouy-bUc+0A$&`jNyVXVyFKPtcX zk}`IKcEso@Q_Z3bJf*pLiOd5K*3Cz$NAe`tlsa-#YR>_CS0Ik|<~hAO4eHXZH)`Jn z-IB83VR@$IcL0#?Rc>f9t|2N=0q31lvIL4=XO~dDpL?pS_|(15KufFMlj7$%(>(1l zr2(pX{p*;r(ep~Y!t>G@Y6KU3)EQ1sj`j35V^_*U8lG+E0dAbc<=RHx%=eDF+dJ}3 zg$yh3%2+`+gOx7su&i}Vtlk+4KO@VFFOSpr@CBa_GDi9ySdTZ2pX=w_*Sjpcs5SRgG`8zi=pqw+*;72Cn0ec+|}2-=+-TJ-WU>k`{Vb7SyJA z*!U^ZP>3}vbtP!-LXD%g;JP?Wo^?0>(acm#sj1!H9BTzQZM)=Tv ze)gJo&{AqQjYty92$r-^GM-0q@lY_UwjlGeft@vtV~{l^4b5Yp4q9{(qLy<|r{H zdh7c18^r~0%Lj1#{KG8J+MLUuOq}y$)n6rAAFGG3qBUt;hL&uMgGSZd z3#sC$Mt6C@z795e(Bk9zN8MW`}B3=!pU*R3;h2x~PJ-(D4(pp#E{rbu0dem-(R)>he z7stYOw5uE?pw~O9)IL_<=eqspx#LrL%ZAB2*7=RZC=DGn)Y*qLNb87BVmphawdfV= zq1KG&Vt=Der|%j(+JKmJYl)jol$@Jrc(5J(rVDbq0G}@R`U*JQ4;Nj^M^Rlr1XrnC z0|yJymNRrgLh)aH;!KS~l=C#yw`5n}Fgrv-o-GD*M9p4ixIS;cbuWIb*!XZ3oz(@W zNu;wmS1FOVFeqON<_Zqwif%E8yxiWiU2cC%%(l^scuAle5>^xD9Bhlz!+z#f7gl!p z6U-z*Hnn!Pq;1XE4XKn;$jILnQ9$7V?y{wC8uPwV_e19fOaCdhqzlCTtVuB%cg)GP zh-p=-S0=#KpX#Z)MQ0rf=IF^Gv3|5()=jPyr*2cGXbJo_PA1xYeX9X0Di&8`vdpG^ zD%6=mxiNT9QCH}R-V&eO&A9Q;gc#ksA-$JL!AwWM&hw4lk02bR4eEJ|fTt6aAObtZJ@GD9WX< zmvqJh09vSJ8<%mIx3Eik55TpO-c$QX?ieSg8bS#uVeVSENmN=jJ7Q?bO0VrQzXEeD zD0kql*Joce($cM;X`sU(WYl!)8kBhEUXuPbhQL15F4x(k+1hp@S(>H$hfAl=airCQf8mD=UuHVy4owpP-VBgikM z3${uk?lSP7YqMJxxxrG@w04@USo&qz;V-&-=#u4Xp)0=s4z5A!k?!(=THnqa4l@z^aTkQzc1O3(4Z}Vuzq(cS~J(`4Wb(Ijcr61#iWft_q$%?~v8KB-}6d73hcx z6-ftub4k^6JwD*a26=)!sLmb?B|QA`9(KyC`(E`+-biku8LkUf>EpoYc3snZipZow zE^K!s1gq`$wG|Epf7Cl5mhWBl5B{O#XklT#65K;d>veD=YB?lFG9O~c91LI>%B@&AM~k}iP04BK7kSiC`^e@vnDLui z2PxKVluCPMis`H#V-txH;y?19}NOXLZ z#{@N7lHbAt-v?DI=jwKyy@OrMcn2nN6DrZ<%_m}8VCQ&^Qq!daRj*|Tx1f{TFh>h< zzMC`@EJ}VEY`M$nlwv@=`f0tWcMNr?=4S_KC8V7^1*o)^LhWe;M?p5n9eQZuL>D3G5aDf(Rjc8Hxv24A$qKpW1W({1luvLoGlpTF_ z-M+qs_qeu_ZSXE~8gKbm40%yZmJI0 zX~a|I%Fp24C%vq#l@IW`WSq4(ojF_guUiP;;CtLhteo0mH~8=AMwCsTt5%|x>2liR zjrOjYW~`Dz9j685ijd5!B+(d#xKvHZO&c{+-PZsnJpvwdGH7{VoIIPkq(a$kX!x~i zw5Dpm`-)H)PB7l)I@tFwIIN7t#hK=-NT1{a)W ztI`5=N1X1$=xdoBw$sGTiai}#GCSDU9*j3li#-)IWPr0Q9cpaqBtXRsryD7!z_*pf z2V?nP=S>zNW@qxc%LA+qH{&}V``=a8`^6b+YDT4)YTF&whw)v`(~onMb5AnPH`xx> z^E~zsZ8{!C71oQ-hF+}K3(w@5DDi+1na+l!^(CWtAeP8B(h1H(t~(=f^MiC*X=ir`WFi* z4rlWjn2SZMN)*7_?{8o{p-eMkMDW7RF;ABVm*c&YButMT!wnWQOu9#p;P2ZD3E1Ej zj7zf|r5AKrelAq?*3GR?wmGBRSRZ9h`EsEI*w<=Trke61VNcCd+G#RK2I*3M6D-Fr z_=qGdSFavHYp-14R4=Vo>ZFwGC~u|6)0(fDF-F!@XjA3Cd|H)>WZl^${&u*7f=r|)-#s?9v56V1sm7O7encu|eirN%6P0O+>-`8} zL~O9wadrgy&j5C+Y6t0}T~;OZdX2I4nLEImrMSifc}v~aZu(1#!S!Ccn*)^S6Aac% zCH@zyo3*W8{r+-|o#;wkmw;q^W{V|TRW)D+&@N|>iU7VebF5^a0YzHFy54PaoIGoJ(GyS%Nc#lQtjY=a%2m+C*jJ;nyYpP8~fJc=+u>8ZD zQjAq@Mf}&chUL7}r#|&{_ouwZu;kmA*a-Ey)W^ZzCsXY=-4Knpq9fXuI97FK!$xQ0 z6Jy@O5_v@df|&^xl;Ky;=sBu^A_++y<{l!ErrepWd5R1Cg7YDj{ zAxx?oKj{I;ZkwFT=ym53^Q5|&83KAZ>UGVdw8YV^sCBvwUUsR&w(@n3Z^w}`fzsQK=K zOxvCKV|e7g)YbT#g-jy|Vslk4W-1MZuGcy`d=04My=G4gSiM#gJ_D6~x%X6#@!%;P z;?7dq$plc?15D7G_gUZnSv{#4H59&%gQ9(R>$ zKs{){QJ$LM@v=n1qlX4Ge#kRR8P8r(deN^4y{4GIc6m|(_j%DFOCoVI3^jDsl=l3+ z|9=-lKK@$wcgF4y1ottA%+=AJSQg@CVSDIn9-psK9&4&@96{O5UNUQVwP%A{`%}J? z%c|4cf#t7hO*Yd<_TQ^0|9wz$pZN9%V}YYHNV5G$S^2sgB4iF3EP)+Stv`K)88Hu{ zr*9t=%h~X*x|@SR_IpNj3c~#zFwzhg{mU>+#GN4DZY%t0hw1-}#4R9BJG?3QU;xOf zdLS6nPb~NL6;9~7kt8jvOx*;&mrLPVF2LuXmR6`N8d$k70<}8UIIk8=O9^^qD>0wi z7nYj6dX_U;%~k=PEUD%yuicu~`_1Km^A2tLgU3qQ8xnf@{yew5J>a1L=z$CePu*l! z;|AdO|Afij=0E?IXnT)H$@$sfpM;IYeQbBaxVIdJ|6+4CznLSRxPG1ro$FA3}fz|&jqM@C@KLiK3!^z5>zx7K0gd%kAA8e)7zcemg!VCfpiGMebyM9%~ zYwd^p^QYg0!|!doh2WLq@D-4BZ2J{w!OyJ!iY48z-mjkZe=wl36$)%Guc^w^^+V+x ztL~}Wg`S~n92lEe+R`m8GisrNuB<-oWpQle7P+`LKxo!-F$0p6d;aDRR+tdejuAIV zTfTYLJxB5bvjljULS*C5MqJJsbX3+__R?;$+dAL2JbmZ?e`v}7!>?Xi@E70)p5Vwk z@=ri8%jP$;^M0I$#a#Z7((;ii8e4%#7-zN|e768>lQeP>lED1UsTCf} z5R3aoe}lE95uSzab@FpOod7i(Z51QlF{6eF%Qvrvr||CIa?z%--e;8q^T$KXqw_%h zYr#F)_0CSazr?lQxK#i9r;%FljPeHzw}-wa{TEedf!|WTqrOo6pG?wjf}3n!fZe zMNZqc_2GY#Ry7Dy8pN|dv81R!v~aRor(Z)2P_cQclG17(b@~TU0`apvwzxL!;Qy|nUDVI%w4;D@v%&kA}>0k-C>Ad_3qlteF zqetPt1hzdmOa)l~33Ow6_kr&n7y)VJ9|9_0ve?1yy!DzI59|M;p6}cGAJ!$Y0kj1A zKaGm&AA@_yA_+iWTueNcl27|w$*E)w4f5jydPpzr%DHF)ic{pYd)Tij9a2obfe`F$ zecqAbsaO0}nowhPu6en-pMKttg?*qG39g_)thd&ONKbO0@9R9l8E&O-Y4VkwQLSXN z+W4s|Va+Xy<9T;cX|!Up(W1Y2!9s67ZANVh%ps{l+JDKpQD(~8#Tj`TWu1T;%1BW8chT|xXat^q z{1dKUKI_%~(?gQ~O-+T(`WdiFteLi>IP#?`*qbc9sW5S+2vGVvUXixgd7_Q8klR>? zyCab4JgiqQ(!c%JJo1Jhhu&XnjPib5N<*^fEo)ITHtlVHaMlysu7-Vh6fq|;8?ANApS{=eEai9A%0AJnDc5; zRm(hLX!9IYRWZx9xWW3X>gb=C-93nofwV1T2>MsKQ{55Z$!iR(T>l1rTxCD-k1D=N zS=Ar}xx|WO?<+P0a(b0uq!a*6B8~baeGGptHHZ?|W5QH;(@oD}aj!zV+TSL!zT}wT zWaeweJ;tv)E7>C~sY{moqya%QzEH@dXvy*RWMygvVy-DcBa$HRAC z<{9>%%c43@;D7gBKR6$K!hh+zzd4n>(wW%cUy`74qoXIQ9A>l|YxnBw8yvFs34H!n zO3zf*IE^!XbXxwbY(7ff@BB^cT<2-u{;Pz8rNSVQZc$7UbykSH>SC(tjatwG^;l$E8<>8rkM0)fsw<*$kK z#B5o8bnDP6HR)3>|+id?~Ge^=vwqvY^UR?I)AB-*ba7>%TSX~Iri zSr?}!bcr@?57h6n>3O7Hv5^Y|3Sc!s+^!H1P7D)g>Br9UOWC(e5GE8$;b+KNNf)%v z`U=H;8ETviorK>Xk`XjFJMKa~S1=90bQ-fFz&$#6fra6La0~}BY4txvS|4IKnehqU zX#QL)%yRV8=I8c&>$->V>Yd>n`uK`gwNU8MBI1*}=2@27I33C0l(c`kIgF^TQkG)G zi$mf{dMnaqaADmg0^^iYOu3204?K)v4|kQW1@R#qv}!R}1U-)Sg4+-m+Ot8vG0xU(bHem{__CKVD2;E3&bF{~ z80-GH-?Gc(lQz3&%e^1;aU!^toH)RlIQ7&Bn#uIsOIYFsgT&B#Qqz*SV14iIrw$g2y(1 zbArpdM}!K(Gh(F|d4Gqf#c$2@{Ks;d+?os<#(rPmiKpbfMy-+^POW>c{DDVW;rQB$ zD;s;iWF{`cCCy26@g=Rt8}gWGo_PK?VlMFJp}m~IXPtY}I?4yTIuN+(;(e8^m1#FS(1wUf&Y6H>BbzK^sk(t-Uo*m_h0}-3LuJ zc&)jgsgLt+A*19|6{fLdrl;Iw_n=->@^GP4I#E*_()Lj5L?P{}^xn))CMEkGThOj^ z&+j^flNhPJxbcy;BXJ-hOtZ%(~ zQI-r@+Jmo#01tF%cn=}gta%@V+u!6ZaI5!kF-?Cj@4af5%y2$#J=h**m&`iYP%5H* zs!t%4ZL$?RfvY~+7;^r+g*^4OE=GVKQT_4@_x)nfLAK14hm9AcbjBL-t>}p*vdzb@ zoIXfCh6CDf&TZPxcpt#)->)hMs|sL|DRu{bd1IL+!91||>3m`10^6yj2@LoETo2-S zRG;j-bqNU`q!w}!3tpwI$Qyo65)b6N3NK5ut~ZBjdi9sxc@9+!<*)Xy3z5<4)Mn6H z{!DI+iSC5!{A7>hQVuIMaCU)l<9+ct)S5FY@`YgXce*q|9mOiQdMmR>Eww<+*QX8 zBRdE47B9)<57r#OnkF}<$c@fJ&(UtFeGPP0;5;ai4&v8~gqzeN$D5VRWW@*kjWG*U z>MM=sl8detR?rNaxsqlCiTmX-~poGj)&iAYCA4$=; zNZwITaZie!VFs&aV2uK_)jEDWxkR6xT&V z5zPkS?DX%=tUS1l>?2U-C2k#L zHMQ3Fb=9*7A8!t~+-Q8;V_YDqpq^ql<-H?^nQ@f2D9~#GbY?nwiV-CTr-Rp_8Mz2q z7YA0VamKSJXG2wxam{Gdn+eDtwk6}u9~-<_T=xCO?_#zEznd&+4^TZ1x%q|LMG9jP z#@byMj~1LU1O_L9xZT;t?&0&_13GOuGtxRM-!{6vUz)rK0bBf5s=J16$<()%*w&-X z=7QmIR#&@Cxvqzz*!caUS2*EkaD8{o4@H^tO#)Bj$b8{}dq$05`i9IE{A;U8x+l(j zZ>coa&`n6=)M;t2%v!4#u|9jp5VALh+p0PsAAAB)*OGZmC+#~+cisHE7e|~pKb(}v zmEW^Gq)bu8*~H(~_FkncQmer|g{ADanMD&i7V|EsM5AWWdJVrp1A;noq)cyx+oq9f2l zgh6!-)~xsw(#`REIw^=sX*kzE<+pai_B-l>nR_;0yB$^9e%$&*<<$!XLp84p1`K+b*nZrpU*hm2a{pFxTup*tTVPR4 znRwt*)Bk=a+BHki^*^p5#}BlwQuERG7}Y;|50%kd=C@E4Y2 zJX5RMly6NSZp#Z7QR5f!#5B3NDU(D;5JN^L!(gYj~M%dON`hnBd8< zrqq~^B?2aF6+}m4Bbr^=KrxW??L6=^1N{8`Avc}d(B;XdVnuwlO-PpMG{NHI_Xaqu z+ISVv)B(9PQ^`-q{7%lBxgKtg@5m7)jDuQx32cgjTtMI=lq6Hh`!%p@w5H|&G^4~& zdic5e#U;FAR~hl>Qk>7;?Z^XLvQm*GRM>MSdh!w6?o13C+;?8VBK2ldML7>sjHyO+ z(V9#p4i7)MJdrF&q4lJVz3g7*g+ zPkVCMkU!<9XISMgRk+qKCny~y_L)kBfK!DmLn0$wsNa%q-JV1(s@G_bFSK6W*;^^h zgoW%;EGOoes8wzRI9C%#gzurbp1ny^PZaAckW`O9TAe~nxU;cLRfytUx}1QL&5UoI z`q+fb?*mC(G=_=Dpdt?HyRg%<96fIj#$fwtEMqwoT7?QuLNen|&s5Xzp5VdrN-WxnENJCR7Ff!7bn7x%~Xm ziff$5*I`5^s?$xe!{b^5@7U!mnW9}c0=g7`8ii2n8J z0_oL0N_(hnFA}oP0k7c<{;G{)_;R~k$ke>Qlyl_vtM-o4h=-Y-j2C%xUuLdcBxxGL zvEJ&!*})^<#8#hBKlfFJo0a1IVCl+H7@juPORzT<(S2F8*2r2~UNxNIt23>PVYU%Y z&${(9)m{-j44RL@DhA7J<3MlMOeFnH_4((X`O@}Bcupekxf0q1-OQC3m&iCLkgsPo zvg!Tr=>+^32E_O`hL!7OaV)h8-BU~JrFtuxu2o(FhY(XMzI-C#Wov1(rR5hRg&d#6 z1Tp=E7}HLT`GxSM{bi4>j}?{$yb6r5hbJjzo1M{N0yBzQXzBaGxCYNB^H@m^ug^$= zD5sYVm4>ot+~#F3DCCa5SpuD#F0tRwz;{v9t}Y#dC1Mn*)MB^axrz-wcx5gPGD?hO z^^v@PMadC3FaGh!?KYdEkq$9&PX_n>N6QVL*DNQSOOYtiP59(dHq`WME7%5@HELeq%kO1~b&v~o9xa=nir{21ih%uJlWCPy zRXpoG!WUvx5RBK=Oz%L57qvyE&h_RjvajNp7iT(s&F&@hc!G0yxz??6_Xyu}e(J#6 zm#eXgC@_}ctjSf5EiawxP1co^5HCr>wsLn3KHx|D)UW9?b8kKS%EM6Ok66jl86k8I zhi+Hn@2Y;Nhp)nm`5G!$++yEP(@;UGIeH?7@=ePM?l!)?Wb>e4=HrtZCaN$i6(zvD zv`>VLvP{y(xSodH+1+5Mf_3eIf?d0H-ElPDy%am*noZ`Nyv?0rJ8_5(+P4{;NRCL4 z9C>Doq`+-&b{?+hMNr{6oXD2-26u3-moO|rQ0_#pHhxd$ByQgjhnHxZJYqMzA#Pg3 zIi%f{iajC_o6X#iu%pG1T9P%mNh%&zZGNh98cn2f3d>aY#V4TU<35wwwC%Fxa|4;y z^4fP_Aqv;jkh>GigvDfuTIujJ6_L|bo)>h778BX{lJeTY7~^7V{nLElKq5Zfu8hFW z^}$k1cL0UdsPt0R4!lc(%1k98hwg~a&diM`0YX(x?dT8LkF8CS=qSgZ1f1y`M;Vgs z(@ym(sLanSYsunASTI)1(!w&VprP_>#&?~U_v}s5diYZ;6jH))tqH<;dc! zR?AmsR^?C3I9JN1SVs2%Yhr=@->wpIigrNPM7Som)TzAZGrlc1er!aiCK=o*<#&b? zX%2IOsfGo;Scge>Cq;@@DGBGBLvD5x1=sb13^KHal>0+a@rkD7z@inVrJqr-?*v$bekP(=4w~@Rk<9G)s>{%w4Zcq69Az*g9Ua9uJ1Ix}6vx|B6s}q=Zu21Mb2UiGkx0{zVP_z8k_~KW^X{J*m>QQGn5H zBK@A`SGQ3(;V^b6!V*jReOF_h_2f8S=WiZ1?yt8sIkad=IY4tubg<&*lqaB~B{o>G zIzx%{YpDoxPPrs89Y?IeHwrr|9#ZohMp8FMVp~hwF2fL-g4l2Qsv68+!~X ziGDzzCMfYCz*EAwQmV(Xc;aXA0PKX4{!&{8w^9-h?%mCCuu7>6fR|RT^SeuJL}%~O zei3c%VUZ%3nQ-LS_8*5wL2ZNBf*n!Gl^Lr09(9je`k9Tj#5iP^Lvcz??o^c!+smm& zy=Bec%~%!--+r^+K15LI9n{RaSYG&3_#=N%AkSY%kh7qkgC2D5gJsuA~QnY%e)Z4YU zUh$rP;H;w2{rKccH?UN?tkkNnLPx(Obb&rtP})?WUP?K33VGeq|9mIeZBnEW-U6XY zjWA*7WUNS$Fazv}+DowT%=C+rFwda1Ef{OVf9ix@LHl-@dW~09SUi73=PrvyoupLi zto!lI!{*bng58Pej9K#LbBOG_c8slvB)7uk@}bzz-x&1h$-$UY4#LJ>h6S`9%xgaW zf2@6VKvZA)Hz*+?h;)mHbayK$Al=>F&5%lmlypmXcS}nR-9yLF4MXz^?)u$*w|~3; z40p~Q?%X-|Jg1&dygcCH!Otb9-WZBS>nU7@x0q~5akb58dL?TcT@rw4wEZ@52djH% z$_I6pD9?(S$&vbsCE}^6<=D9g9z7|MM_R1oj{W>(alTc4unlwAwr#ywkjJid$y~vr ze!i0FMWh$f$c;Aj{DpbZ(J*t_zEv*j%Le0bq?oR6l~B1$m;#4MyBZ^5jOzMq=Gl_? zkO>TiC#}&(#h!O>rl~sDu8R2a_`qHna*Q$VIod?MkK+cg<2ux%J3budzxGig2QU<* z8O~Cqtu?o15~i+Q0X}7xr~VLi2@T$GBO^T_e13FWP>TAclrPj_yv%R$1z3-*RG#BHDZAbsv{8kxB9m;&Ld#1AE`0SL6OaLTCKb!s1H% zTl+NmTdeSST|aa=f?cZTQ}$~g%6eYn)5th@b|9-KQOL~R0Hv~1PJmlEVlJT;sOGx` zgz^_x3z|kl)it?dY6lOdrgOO~*c*C{VU}J^b3BYV501=|?n4++=i5mK57bP$od+#m z=S!>02evqrJE-I;={H;aZ=6iw;9frRfMdf4{+HImwvQr|FIvk({r+G96Ry2L7M8`~ zo9|U`?|7H1K%GVPUf|a9QX_7Wl4RFhp*Uh!O_FDA zc_Miwv%vq5e((7Y(|G@XVWa(H7W!^dH|Y2eCUA4sD`df+_2G@w`%;hGNUe(2n@i@s z?aG6mM5*a}+A7;uFL}s`<4sCYFN7UzaG~GU&SwAn4A{QOiTYE}LDgaxGnUG#HzGN= z;!#s43R#$nZV23Uo3e?;9fOM_h-Lw+riayWFO1XOc`v^PGBce^=@yP{JDJo|`6mF( zRN(;xXYG!9O&>iiUT;)8|B{3=8ltI6tm~lE@~?3Te9Dhv;m@!n&ar=!*?vosV$Jtx zw6DFbm7@~imw7*usz++5gL&I-*B(k>Ti5L$;#7>JU|Mx{W{~%e|vZE&q;)y~Z)4N(79XCh0)KWTPlQ@DMOPfln&kjSp}`nVwx>Ut~k-={zsX zDOq3)urA@nJU^}W5T69_BUCQ%?2GfqOYHGfH+!6&Vfv&$GRZ}A;vJMNT83WqUFZDl ztDOF*A>sh;M`He<&NuwOKneYS5!o*Ch((x*GYZ=Qfx}w=Ck)`i7RNidM{Eqyfc@Sd zndLtd^Vv%D>2w`3)zf3%2EIC~w0%%)pE5JM(LTXR~A`jEN3MU zR4&Hpm~wLlTzqM7kv}@I@nndb1(@xuTAkqfv@AYQsY&HOriM?uC-Fr?994;z z_Wo{u`2Rr2fAm*|mO3O+`vWZXXE_mq`cN7YC%xQ^Vhs0pu$bigz3W`ZY_ukRIB1b8 zoR{B)+&sS1XZS>gLuZf2(rv}1w2Q}R~U$$^V6lQqOol5l%0Y57Spb_Ks zI7`sK-`(MclfTD4P7jj)$cS6=YnJe{Vi>rn7c8!&B4f{zGI?=w*jKZcbGpKE&xwd-JeibeYB|60=r`__&7J8J@EZ~|pKx;9=|iAm zEBH`t%dwB4`zgX!k6yiC=QM{G5?cf?17RWHo*5OEE8)lC_p2O)(=iRa>AU{pKF23fox-UOX?~c=!hH(2y+8g#H zm9E2gk>t%4hTt7eHO^TDfeo!C;pVlb5*<>LjGpE&}es*v_|6*u(o?e*mFNTHUv0G4hl%3*FVF%8p0)^6jki z!on8cJ=y|LhMgU_b3Gr>sS2A0%Td+(VUGOJ^6LekaBFJ@L@a5@hOE)!0OEiAZN+`) z;N1J!mW@chV+*8zfoEDg6@L`EIX2S|M^{+tg-pb_M*@j~DYv0obH6@&?L<;-Utd$X zf9=PGs~-40hT>fDV$p=f^93po1G+78OmoUAhCYrg>sGBv0;}rVV6P(>X}(4keU!>` z<-vuH;KYsHsor)+2g#YzD9L-&qrx~$r0c@@W#FCMN!V09z8$uB3YhTd`Lq*|yJDB& zERBoF(;Z~0x)19buuWQeSgS2yMci{;Q6t(lK(lD*2DL3E1n+_~n*E_g>VbcMWI&Jl zbsa%MZPI~fZ#ge0m*vl=*jB~p>6JGsvka#g`Kt|DSiqfR)kJUXevs6msb1jQ*!#LV zV(oqldgSpNt@L)gWiX|Y(Ke=D=I@%BE7I?#|2p;aE3D@Q5{ACUYKrnyzao5R=T_O^ z&T?dc_aG0Dx?7w{d7?U6G3eUaG2Ho!;_p&XTT(b+EY@FQ?0GCN7Y;AUli;68L3ze2 zSSjIEkFylY+O&Q$xjU*&r?a*0w4b{){DNDv%TuO&)wbz#b1ULi^32tKMoIEkk#vZ* zULIl9;#$k>Afrie?qFg@ji0s;9NuxjchV))tu7kEm!EnJ}{B-`eA)nw2w_c+Z|3 z+AM!^fwrRdy~u~Er^Vb$|4`yQrZyeAUiYF-Ap#>%!DIsN1$}!AHEP@E+$CVB@n+D> zJe>6n@ubwOf$^G){=w|3b@$F$5dv=SXzM7?Gbjym38^{A{Ih;#gr{|ONxRdL&0P>@ z@3Q&%blr*+jQ)&)lQKe%)Oo;`%XQHXgLRt!xxKS+DbN&Wx-j!UBIv!w})j<6Xxz^D_4m{zlye}He&OV!?P|TWa?Av zb&^}Tc8Jsqm3aPe&9-7fziT(bSPOEpF!rG{NV1N#x$MQn_fQo!2FEYqe zGx?o#8(+ro#3;o~C6$C#atTrKuC*aNUq(9S`YuQ8wfG&1Z;7dM{h35AY|pr|DJDND zWJpx^J?p*2h6$>oR?mIUy5Zr{+EMcQ{BdRMR-IzcX2+Dt4AfqfakNwF5>raxS3I|} zh3Tuji8(UWlvm;DI-OqE4ETDIwlelaL{Zt7tHH-%d{GHUFA{z5LGLdQ%&-fI|fWmeAs4 zlMlVu{(ZO4?Tx2XCQq>F!nfiqUJa}nd}W}T+Cl`N0<*j%v8$g?j*C1_**bb2pK@^$ zQ@OJ!9n(-b14rqU~F*`JVZS*fkT% zpA|r~Q|WTzLcL(?aZstJ`&Dw(Tuj&ph zC3By|T1(`O6Q0dV${Ir~2{~&Enid>bYYNg_j6I>G550)b=nhp&^$7^Wr$}r{Nis&M zI3;qgY-8`xl_c|x)x_9K-v_(B?a_Cl5chhRLcmHfE-?)Mp1drYCC##VA8ttSJ6w@k zaiw7KSc-JMFfkqti@=mIBME==Y&m2{hg-2nr`u^Z0`(U6w%OwxSfWL%Pvsk0%^fRU zI5%eRRy&kp@FGKn#Pyua3xSI~9Pjjbkgr-9xn*hZ8+_$c-&k9%<`T}$x zd_|VnT*wDnLtO*Ya6*%mbCWpFf#z;r@m1*^&i8j{E5WWT>5HZxG*zCPWx#XQpSpj( z7t9x^uG6Z=%h(ap9C}3c17~#glW{eW(o*dUNM*?5;)jtop z)2Du}NA?w0z$qMAm_lMT5tmgVLE+$f|9q7j^w*&{(Hvr4S{bSqg~Y))(eDTR+XGsL zC`)pJc4XlPpYF11*1GBRE)cNN7Gx!kO=QH81rco}j77_W?Ydj-*x!}C5^iP!QSP^PgZ zCurr&BSp9yRW#L@*4{YFsxv&i#IBh33bI7<#@!mP(HKQ0P^UnV1=GLlOi{76)$&4Wi>{_Cc<#U^om ztobrEI>SsSCy!ePMxzYgYQ%-o=)BF;ZINm$Eib}iHeLE!HmMn(pW5;9%#A@lv?T`* z$p2c9W6Z_rWX$io@w1(0s-5S2MLwot&8l0kNUgGaXe(k$9Snib^O!wEGwj0WW)o+7 zj%lP<^Xj@<1}S1Mw{dyATq!aaqp;)joqw2^3#3pL+s$ zPpUzsly;=eBKY z&O(dJK6e@(#h3o0j&sIVV#-teD<(SuK8ICEqGd{QLJ4F{tGQ+3+JTusQpk&?>1E>( zD`N|xw5#%5zXAb5M;G2qhIYA@sY;vE8dq#r<1$yhG~Fco-H!GhF)X1u$dBg8Is#0Q zPyuRp6un!I4Qaq?;RPMe7^g2zaU&_l8l8QZSvlL-dja!e>yT4==Agv3%E%~%i4~~2 z(OYhR@s{!E4qdV`1#XCoDX{^2L%ZKmEoVo4BWm!S!)5l1{-Ny~%yvPJ;vD z4%Ts@=kh9K!|RK&;pZ#$B~?nH{k(=`-Cgz*=iFqGw&iT*2E*%g;UQ-_)W)oAkeF(` zq_IJQq%kuKC83m}`l1u#edz2>$o^$6s%kiIpd2zp(Qp**Sf(sJsyYZ%U!U=Ypd8Q}B^T?uhnIpM<gKEnpu^MvtCjOPZtxPoJJdM{5BA%#~J=$;=Tdvr*=0 z8@=4Lvt8OIuOMr(#o9p1ZIc*4E)!h*AZHX#Suf|uSdRJYsmO9kfk z_sQwoVoHRit;dP#=U3E%)l$hBeMTx{cxn@gErDk9KM%Ro&JsO6Znt~A+_2)VnC_%x z?Us;;?A|>Y3bgSO^y+Awmh0hMr0nyEsk5X0N}q?sdrz`(m@A}g%+w7}(fk6RCll=A z<1-4q5cy*cUF|O3>kIOg)hw}MYQ(-Bc|1DIj{&|7cmfiQqG7(#Zh9ibI9^?Xd@;e1vW8A7qvds1o@yn74M9bqbmOZc@WZq7(WCYB@Z7Rt8#qoRJV%y&2hM z#!*qCRb+tw?BEAg+MO?nIFq1k?Jfa}7%FRuzJ$tD#2D&KZ_%o7*|t=i?`{PnioJ`3 z*@zR?o9m<=5y{JaG*yVws-s_86!MZ~2i)kJ2Z64_V)A(k%vJARt06hXhf>nVg|iSQ z;GgiV$tWSQ9~%MNr|fvMkK6(1=1Of@jDo8vc0h}}ANSkcb}{bF#xAFEMN@R_3uO*; zZr)S{@MR)2Y+K?*QbyhWRF_TU)AlOrepFce<`Q!bxw=YNH2oVRpso{zyy<(?2vLp$ zJCRjY1H9(kkv+6huLb260GiT{8S(8A&m5tuv8qXTkw7(S=?6#vQ!%IaDb&w(;r{iz ze1Vwma=|uCbCKo@hlSb;FDET2r4kX)BfPYB_wpJ2Z!EtN7aFlnpPp$E{_ICk;uZC5PmCA8p z);$b8*nD)(0Xr6Ke&1Y;v%&^nQKW5cRpP=Fcu;8mENeo~>i>CV>8uT1=4UVaq&|Sx z(Vi67XE!P*YceVh(%wHZP}xH+-f;fj*^;I!M(C8m;48T%HzKbKuFRi%{~Ec9YCEIO zR#uJTnfG2sYcsWU=0(At%2h>bRCsT56v+2`TxVO}mkx`0yrk2QcrtEV2KrUDeh9Cv z;=7_DjPJrd3<%N<2wro)YfI!)j@D4k>LY4^r(PWW=mCtM6|VVGC!{iHxp@dP1!|tg zACk9xRa$sVx~(>#{$;MR(W_N5h1~Ny?MD1^2j0;@Irm3S?dBe1)x^@0Yia?z z(M}hzlIMEOt@F9M;;mb<_hp%@Ey-t8^Fe3ZZR>>_47SqX!9u;0g6Srz|Mu_(Q1Qqt zBD|JXPX7z0*Pp~;c?GN)xSe$?^DTYf%TQvXS-R#D)hbRgQgp=&L~IlAo6wXh-Mr+i zd!}QfSvMVhL;Md(m|gW38eRo%N4}g&9Hbp1=M`nzIw2q;W_5_lY=e1o`+yN5K|2Vz zVP~NRp8e91S<7l6s9YTXs+rhLWtzKa@2awUhi@P!ho`@lk-hphzj#P=XXq++n*0RE zPg+?#!`K0`*D7FY!qlDbr0i5b=c#EQGT3_je7&$?BGKuB?ik@ePn=EIUp`tfBB6#g z{lz{tJoU3D4%-2QsH{TPE<=U(xebDi~ zuO&7v|6{kxe^fYQYis4Q?^fVeE)>iP{9#k2iFMA6F+Iy!dG;x$_!_AEA#(Z*St5zf zW;=Nc-S1>z(&nRPwH~y#c4Pk@FWWii*U6JghMhss`4PIkZTv}S;h-pT_b-P#!_^XZ zu+_EWp1w)T(4Xwuc#{8##cXNZFF|E0z+sQUA5!$lO6YLyuXwaPf|~)7JPM^RUq740 zI{Q|Sfd)fQwH$dGc8y)yE{Y4^hSM+>w7p4EJwb(m`=Wr$-$byc*8+HpV%p~Qm z4aIVR;(vcQy&#weoakAn!}`I{jc-T8(YJbmDc@8!qzc9<2U_h%FtX}eeKMx8e!Cyl z-O`Vz&aFY^`k`gY6XzHPJyqX^buo0tm&X?5^=c}-KC4R2voHxox~U6Kbk}yJvJF>T z+i564a925b#;!`g#dm4m7$je+cekqIdNdCn5*mZBJ+{-jAOa6ZiLkp z+G;R;sWC^zjXkAqfj!j6GU+|qt(mNo@7&CkNgVa zdc<^-vDe}}J*as7Nig>qoVJzZ6|T{Ae4-K^$9XD5nEjc000o-x;C0z@9;#T;uD@59 z-7{Z*0XnF1JEHPau#0+y&5PvZ868D%%D6fELu=|}lMu0)=*?8ZtHzNa(;(iQhS_qb zJu3C1`RX{i1MMB~5BSntww(!)p-R*ZrlgbR!dv5K8$YY3SWM5Yv}S(FWK7N3022U~ zdmcW06U`Y7nP&&$1Gps?+r5bX**#v~yFF^C&|AX-4F8Y~sZf=~dG_gWP4axh@n-}F z3%$U|=6_WmP2~C#L+Fs#9hAydA|N*0J*rpDd>uJIxL<~F$wmUbj0#l&(KP`k-24BJ z#-y@c0TZBRc!w4Z<98f-3I^lS54X5P42GIz9_@j9tG$?T$@Ig+VFRYvUmFf%^vK89fjt z`4<{EY`@awR>xy?_dH5rI;77w>ew`$&M}#L9QW;e7CHWF=jew6?LP_GqX>M>Yy4Xu zRi*iEjrQq`S%1oBx3aYDlE1_xFa#=*gGYf!&^?K$>JMTPmy|j-QkvI)fg&O#2hW0A za$T_OJ5`nfVc;9Z+t1+Ci}sSI8$^wEN{&!Y%FyQ&jK-#VS(QSgAQ?79Gk9U?)Jh+h z`kRx+`HW4S(>=mf~^m5gO+(YCGc(Ku>+qD`dgk6q^`Y&B1f)DO6gh={<;6pOxcGwW@P++o9!Wr8S zcCd&+T!|XL-R7+bt6w1d=@NK>E^)x5$$Q@O!NtBN7*4C)mvtpgDaBQWZ?legt|x%H z)_M1VK5hsMbp|DFztlEXcOOJ>q9J;pDPuWEy4svfr>!IOEy3fHgc~(h2QBUGB?RTQ zGX#~f32d?)JvILNn|+x27u&OvMhBG@LyV?8!~v?-A~n*f@e=LHrJBY3dc%-M9Rvz9 z=XGx9xl(f?%@fNjnFZxV4&tTdqW{7j=C2Fa5g%%Tcb#fL?~f@6T_M6#T@1dxsDYBX z5#gOli6`EAXrJs`b-@iO^F!Vo)EjoPM4up zm9=v(lx+Zm!Dp<%_1RVdMov>5rTQ4nh3+p_NDDQ#l78x|WfSXOt9S!F$DttzHwmow ze)l{I|H*uov+L$TcLEwce#SHWFYs!=G)cTHzp;YIK*?(g;-nSCSD#HrQ`M|8rIgb# z`r%%#aPkdT@8>>W2u|k2C8!+XwcoR6V)?&3Ouy9)jcd?7Mp{?MAWdyywo|t%9?-d_ zmX=7qNK{>qmt}#ZXQ5kZnpgKK(0n6SM-o4`@a-~VJ6>2hwNg?dJw%HMWE%<*H!Bs@ zo$NR%*bJ!00W(fQ=C_&QJnk`%(|cif?W;7ZJ~HPKTb`tyrZ>^I{tV^P%F(|Ebad3d zdj!rj&Pb)P{ox?N_2E5^fBUN&w7Yo3&-sZKSvo}L<)0k5(!4*=aOfJhIwJ~yeq>HEk21U%)l4jByLv?YNG->Rp3 zRZo$;Vc$bqUx<2UL}9Ub2X{H!!%2=Uj*y9o730NJOV#Gq^x4L~h1+8>EA@0*h@Bx| zD?iYR-|5pxbx&#Gj8KXrnE-o|#k~y$j@W(4$(=qc=iZjNJkcIhw!DiZiyngD$06~i zbmh|A0$0^34uX$M{`;3d8A72~L{_)|#SHsT#wzOX+*~Si=*c-_WS#}T#`ldnAGgDI zbVbZofeSJLUwj@qR{Ob5W@eW)s#M=-_(ymy-A1k{UiRc;EgB0;^+pvlV}k7E3mwrp z{WLw^894KWD@4wc4>rQV)lC_e1@lb1q(!<(jds;Bm)jtDf9L6C`!}Hv7Dmgqil@}w!_ijSpN zPCesiAYl0>E#&uDP8ebcj38%}0gs;cBuc=xZY}XWiwD{LH)=wETew@t#m)oaooH5h z-35njz%i$YRRZDAF$NDzk}B0;rKHI$`I1f6q|Itf3AIur>#KJ#I!*+0x;H~2=GZOv zoN3e!dUPj~5;V!_2gr1R>`qCgIA3ll|L*<@G57%u&*%IIyzR0#Vf?+Y>wqNEy+~OL(N{o5lPb zbG==D+>WlG9DsJtOj=USNC8Hmx{Q*@Z9TfAR_Y`wzOqjCjV7%4l_+};cik?R_C{8t zFF6BBNJ_*R%?dVwItiuJu5B__odJayrKNa$L{*3NsW~_A zS#ffL3~3JxX99v+Gj!5s@zS1p@fS?WHl+8b8`kO*CorYYSDH#+fIa*;4yZc;+9beh zMB4@Bz>^k%WC-RzIQ3+;R_?6n7J4;>3o%NoG->s&cr*_PDL`L)kK~n)w+RzvnlTh@ zNI)#g6$Xe5VIbP7l37f1fHDHNgCj%4$)wLpPKjx81TJP+K@L90zu0+q*FI!!Im&L6o=Z2 z$~W-iE$C2BBstt?Aq;ML8Ut*mH0z4CV0OO%i<7BLgeqqdGzAxviOfh71<)JNw?AWl z2k$9hHyEEj4byI)xXrf`cP6&ybP>FX#$U7?$Q_m%p)(P17I9VFiHwnbKFKQ@gI&$n zO@6&)Hn_d;vu|hscuk42z&g)ICg`4Nmeun1yv}P8rBBPWUnCso#QKb>7uJlAcXnBM zjlYxn{tRln)Wme0{(N*1&a%=X1jW!9q zwq!u7*51{|a>+FYGx)T3cR$Zt9yW9nA^M)F(anP80DiwgpQ9fvgSz{ysb*PZ+*PF7 zTxjqc#J^>!@bLWP^Y~>$LqJYx`PGU-W%)h)eU76ez3fq+gOeXJhOzoQBE4VZe#H=* z6sCnIu{b}N4(pZoH2_Ulf2Pg+_?}eWWFyMmh+q*uad@zqn^_CnI5E@^zO*;Rt>xI& zLaLf9b(-A9Ll%9{`>g}&NCzKIt37olUem_Ql-(rGR_FXmWas&MfZQ@y?Vy#v$Q%Cr zkIvI=yWg%L3iDcc#$0r*`O72+!i2{;Z>%Sq&K!t7G{=ZM1w^@4f-M;={KPm*aOA8} ze!icJsLj(1TO&E!h^T#9So>f?`gHG{`(yF%byUmDF57b$TX)w-{9qxXETvqex*A0Q zk%pTfZSrgdA%-ggnV4{vKp~6p3Z@IxKFH-63JEW=SRA(MhO}{UEsv`P!p?5(Cgyb=!x%=JG3GAdYjWmZ>G?(b_VSRZ4#y* zKfnn(-+Na={&7e0bJCT7#b5iH9}k5c>QS ztm2BKg=sOjVa!5!U*)WF+=@QxgU;b?f9lBLBY%nxx+=;#-_;PB_@rpERLjBjHE{pu z64Z2uL}f_;`_kDa=-80>$>Cwt3Qv2{u(&~mhLEDxz7y}@Hcb9$1UxB=f9VhNPZAzC zJpLr^-KJm0DCttLcjf1W6?Ow@__2Asw=ZV~4~ZH$!jpE6`3w$?T!DQymysbngcGvJ)P}7{Vuj2Y*Qsi!QQwiEF z)cO?%Z0t@^N0n`~xeJdAELe{Drjga(YtF?h*Ks!Qi_>gWMgGp3;8}v;*XVQ;ta3!| z-SzhR`u%L!cJ$Ftrd}OM+bEx1y}tsS%(3#Vw&EP3ArJg8;^kf?9NGm=6LsL|3!Rb{ zQsn5G(9JF~$80ugPgn2u#cdjenKh)*PK*-9LVZ>$D8CV1tlr@SlWo?oAIdyLm39pUVq;*Tu2HO-3rAX4lewq`BclGh_+W~_@= zjKc*eiw)BY>AYE9dCzyA2ddkKDZv+0x@uf~#M*cwu}O$!G~`h`fl0IUvew^Uv8{Od z*&J@!b8UG%6E2!WtKJnOt#68PMmU*1j8}R$G#*#CtE%&M*X*i+U}( zO?%sDKi%RB+{+*O7HyYW=>cOdZ&K1*NgdXV&slbYMz}FH*>af)c!R0+B6jKZQoLxF z8zU9fo?~5B(XVyu(P(pP2T-0r?UbQk2oSw+)Ln$WeU1P;dSxd#`a`v@5a%1N(#M7Y zn_y@n5&iEkDl0=SIo@EYmCl^ZYYWN`th9b-{bZrysflb}?P;)*e8ZuBKzYRBDDB?0 zAk3mtJW)}6VIqiTe6iUUc`3wRAqnw9hGfEwhL;`A1v8Fw@!ps^y!E7z_9Kj6mcB<&bw z-pWxE-HBNN!bOGtsVphMsFve?`Q6v~vQmAoZYuxDI$2Bb{G8gJ;r-&4fz!~wQ4|`t z7j60F>P-tjmwLbvlDx&*hY-Hk+G0O+6eD}Su2@Bo)Bh0hTs;WF9F5c_Y``pLW3ob` zRjjf+W$AQ#cX7-Awv;?7>pk0B%>YrPlk9nH29q~}IhdK?9-ErQHLBn)n=Co}sf~5w z$gOjjuLkjs`!sS6GYCp4wCpA09M{m$beEX=0Pt~eBH5R`tqny7WK#CAaR1(sq zulEDys}m<&!7)+VY`)EhA^L8$vy3XoAx;{pZDf!-?JDE`IPygc#O!0q6Aq6to=c;H zZwf8-oKlORWcNyEnYW87=Zsg~uH6v4hmRQ^huTLo4pIt#s{dzemDNWGs2-_cM+IHwS}C4M5n-3oJP52#m!w8z~RJoG9ZWOI$Skl{%A#o(qj6Nh;q4icKidhL{Ox&p0gOkiTcrnaK&Qcpp8?Cijx+?s94^; z(O!uU1e4U@Cp;&0p#@?Nggy?3*KNCUw$>fAIzqsa8l$V_- z^5xgoN!)mI@4n-v0BG;ed1aAEjCVOhgA{t-VEL+-zTj+HN-Kt z(TOIYN(nr+v!J4MZfR$Oy^XZ^gv*~VQtQ%@m6NNJ+?S)FsUbwgZ)v69(OtohK5GM` zxiKiRFdc_lwo%BU`kNY>RqqimZX8k7&q<52E@NTXu41tQqtZI1VwGHHkwUe{Nz5|I z#JNgw#sqKv0n-`b9%bQ7ic%qN#=S465I6lyIi?!CPQO6w$f;nCNisXZ6eh8qStBpF z(+QMnT^*h*y=CNlU^M=906{>$zl_*Me%nb0(4x=k-m?Q!IhG^2-F@t6?n-Y&&cCS? zX{BlDkhEdyGgZ$d83N9CW?vlvn-LZ((r|CZBT60AyDQ02V_dw9NbEd6?|( z>x*BCkM9$=wVI!u=SdYZtE{(Z+$3oe`51cg#&+pk-oJ67L|$?0yv`(mYwOljS>M+! zc%M!+$uY1|Zo;Kpp3)kCU!=EE9p*gaq;e`nygt@`IxWaxN+Mr8aCFhT0)J`1=%sNA z^EDTk195n_=6+Wv`B_5R1xS$+VF_4OoQ4Bmj;l(^o@ud6extE)1L7AUbpteYlczBM z{XgMtmtK$35-XIJYJa3fQIuZ5WKbZdxqb!s_F^@}$RUghV+j4)QL@AkC&_&!z-7#5 z(%rPS68@vDx98JLwZqYWj?DQ>IfamiWS41c2zgOi7cOj=6IDAPfZ#b*Bi_C5b?3qc zH9=V$7t?(0v(lhF-9gPpQon+0+Qs1?l!8_WZqm_6;U(;~M_OJ#EJLtI`J< z1%u#To30J*1OdQe%o()E-*|)^#XM$(p#Yu^W{7{~;rxUF>S;(+L0c=)Tbu95m)ET7 zPO&`$wkg*ON9_N-l)U!(%@pX7xhn-^3;0_^)UeM0>BpL3OJ5Nkx~$i;r&7FDg;tpn zaGVd49vePJ10l3`fdn9mPhFWdN1O@x>dxR5`};9>?9%Cs&gYzTPJJEq-Ef#rPOLY+ zQ=KClLu}eB7%2y8ep8+2Ww9kQk?pmR1w^-FXt(R=yKAxdv$xeAw;dWr;DPh~`8!OX z{690_-Akr#*ySk><|_EUFBN_Hw~5LBvhd{mG0_U^Fv2GLM`~}r=+(0a`nn^TJwhg} z19kRGg^*Xz*casE<_f}P^E%VMJ=;kJe8aWRTS|Ei&km)cfyC~hd>8kRzmts)D0y(5 zx%S?2e=(eWE6w zel=fTv9DnJ&!591-QP2JF@)BMBSSE#G9_mD#+MdvchBq!9WSXcQ~n@(nYEIYAZSN< z?GWOI8pE5}-ImJc&W}{NuvTNm7f-$0RCac`e;C|0`sj6$K{yjLUz7p~*9xD$i6@JO zK&+Ed891pI|NhoLYwOK}qXN_x)=t-N`u3x+i-0VKpY!Q!2wD*wSLpDwqW4}xQ4gKZ z_n5_t+(cmlix0m{+N!vBL8TaY|nD!%kJomRD6agw;E zo-*5YbL^}sp>f)QO<<7zK$?Ebq^V7d`Q!~y-!jb9OnJReYigmO?nEicMg0CAz?|gA zGuef0FT5L~(x`lGjM9CF$otsM#C?nG`3+^8B_d3I^#Vo~gMc~V#aqOa@Sdm&*Ov~e zG8kHpBeh;`_5*^GgP_z#@Z4N0Q}>o#>UE>FT6l#y^Mci7v=_w?J;i?sYtzoYVN`x- ze@}JTC^`QI*!C!_qfhIApN^&y^6k$-I3g^<^`1W-eDRKXR+LUFga9N2RcXGwV$a0- zck(BzD-ZdTMC0;yJTkL2jyXEi>!(W7`ufHlX*L!0FMBpY%wjHQHU9ehiI}E!lPR>j zDBKo%R`WX{3_Fr$JI8+Y1Lq0FkOQY*emwzi5eiZtg0J^lG+fl;F(Yt}4}OXa{Lh2$ zPlaA%4^8lilc9J<@b3^Da(7CC^Jd^{wpk%L_x+X&_40I^D~aXneXr9jMO>cT)8cV& z7}%hxr63oY&Y+`ek!cs#JaNuBR-oS{Nd68>@B6wVfgzJJ;)`@?)oTSfQI2s&G zF@!0bN}a)@ECeVCJk~&4uYdhdPQadPQZ{OPeNQbA5AEi97Azd=SvHEK4PQ7OlGCu^tdhj~#DX4CmJl5g2n zA};3&M|CY)Cwhea>dVxWgU^h8)C_KO7W=7QPlFR^Cu|9OKl_*$FU?Mhc(Xa5rTrp@ zylZ|3n0yX!svRmkgOr2kcdX8lXr*iRpVhO!$j3T0+UcYqjF0AFy6FkHtmoh;NLxG z*b`KlV6ps=^tE`eA%OSY$`dt{j5k$z^m$JUNJc_jXU6F(P#bdz=N!b4N!}s*>fXcF zFRdouxJwbN#2+G{d=@~*lY#y^EXwe`GaMSe&hr!N%sJ(xm5<*dioy9dTq5T&%Kmtd!`o zyH%63Ih<=SURn5qyxidpKljZ5?*ME4;A;tRlo@XFhw|gz9uD5#Dt#v506vn;R8331 z!F^-d>=Uu-pSOc^xprJVBbw`Vd7AviRViHhMC{kUMIM``7Pe4wo#Nu26%nOvL;=Ys zm|(stXIaz_8j*IMVf(%Yvu9}`P%CChKG}vVE?6IBOOQeC$O-GfXk8dB$O|4D=i8sEPs#C@fbz>zs!P7AwmkK@}u|ktD!kqMdF@> z%OAVSA|8%Zh?SRVWSbmG_xCGYt2C=bgD3Mfnh5J|7_u4nFtPFoHCud=4?6YPHidI7 z7UaQU4?6Wt*|zpP9v)G_Ppr5WM(ZxC-p&POtkS}>6Iz>sy#2%2^C^~cR%yEjo$!*? zqx>Cb-ctGNUP>m}CINTvsS}PwG}C5JWopochnm-xL|AGOK%n7+D(~pdkd;AG7WLSv z0xKkbSWw_bEU=gi|M*XrwzZlF29E{r$qzm69u)B#qP4erSz6kw2hh*K*NPaGs4>ZW zQnt+cL)y1>*%P3B?k0A9)0{Q4sQr@3mb!rKoMEw>_T!!BIMHr<9A)d?5i=gdOT%*V zvK3*g{RMCd>x`&mIe19<#YKc}GY>*(U)fVbP;e6|;{lQJ_Wxt;t;6D2zJ2cyf&>BtcMopC z-Q9x?3>qM~yF-GzySq!!!3pjR?(Xg|IPcEh=iU4F+bohCUQwfeLU@S4`v9PNiYCF-wmel>6Xl*0*4LQzx*nVBDyh{gPGkN z!>d9;?zd(F-~~6Rc)=fQO)}UDT>a+wsGB$p|8hXsK-6@ z$cwydEmF2G713w_4UNzt+x9-j9rqi@u`LR|3J2+t`yVBLY|)HKkO+(NtycA^{EC}zVb zB=5z{vn8nE+1=151@1!9#bwJ*vVxt;rmR7p={}zba^dtsu?uYk;6PoF;OvDYp7hQmk2Q>)SDZRm_4uTZ2a{_mVjb5*0MXx*O}4 zbXlP|y=I!MaPTh9XD2}K{;5+8d7%SCf%8!LD9Z6%+^T970;x4E#A~tY;U&n@{}*-veHCgU_`nf0$PIC09rakhSt_ z-#6aUdO^f;I2H9*OTAtTRGelTaI17hh8h|Qw;*XA3|hmCqzprg4F!E*b1T?ma_XB` zEqrj6=SX4d&w8xIQr&(t;9BvjEqgZN`c-PBDK+X6>5c9aGk?oy1wy@1pSjcX4xrWj zJaKei1Pz6>p-<~=LgEqPQR!%l%BQXHfVM7`+{ML zm&ZH7qBUE-E}bl07grYxb&k0;+r0x zdj~kyOC_1UA|ic_8O;e&mXF`D=eT&Fve1{U^g+O-No%yXagZ?G_{a{&8vfO}GC52F zLDAEQtOH(BP8v;a^1S#%9>q|S0TDo&fKfN_%C_DWH};7q06aZ17OOklnZg5WpVkU> zOdiV>ALF0R{y^~J&Y((*(~sKMxkj5gSoJV#J!BN+g0!k^qiE)=Yhm|nqV4L8*W-7# z|D}PsEOAXykXRnORGEPW{**ZI+JL6qa229!S2kD{_wH#vYY(j z@ENbGBpN-I{g=s_42jkULWSY_L&27g<)QN=Er+||LB?b{F?Gx5@)gl^hjh2dWm#M^ z1RmkjgHc=`I?8q2)yevDJ0#*R7gtc|BDuZv1R-k_bt@coSgy8R7?r)?$meMya7vK9 z;NTnnjOft7CZpbk>f`6=x2qD@n3a_~!SBrN{fEIpgBrPt5qy<3kosaQrgOpg7YF+4 z_mFI7+z8v(`ta(0v^`-1FiTNwwy3n|=bT#`?iGow~2Yx!km`gn|=Nr|7MO(KcbAow(o$uX|6S z1sIVKb@}2w#+GYxHs5|cz}vc3t-50GTYD-VJ00FwvRIkSeAZYJ$Y^U}I_7N~N%fYK z^)2XpoI8$s*;dU?$6y$#&8--C+dq191KI1SgzLt4W+u?Cj=&6w@Q$(`t4b`yy^Ev4 zI+)G{*U6(*Owd|w43Vkg9dQ8b6p$+sa6iS#Q{_6!;1TBKhtvdQQl8`(ZwZ56KD#Xf zl>nd2rqdd&UhG;LJ)lqQ_mQbgwfxvSZ;uZ_nqdSg`45H(v&)<=$ZwH3v82tDX(1fS z9~O|yd3pJ~z28-}c4;``nZb;{ftVcS^J8kkzHsW}`TfU}&PwS@a5@)fSVe1D^9 z1}pp8_qG3*zdUW*d;K!Wb5xhZHVL$fP={v}Y8xXQ5JjK7H_Ew$v;hXX$$lqp*|^hU zK9Y9a!yUfSMUkPxi(Wa0JCcooqrB+h1YyPmQbyit4wO!glaSZ+qbcDZN9^1)v@MC; zfUJkJbv+A-)e}%@7!?bj*Y`cv`8jNGyErc>2J|9i7JLa`uNBXeyZ6?RNof^oN!JRG`X&)84lZm^Bj9~yE0_~wcIn~BVVX}@!a zdwUT*?fu((KL&US?M^1Q9IjDwOT@GE!2+6WJ#&u3Pk;m_K{#gjAp$~tXyY`8KIZH( zZf%ymbdBvY+NfRz!!fgbcD>UEXJw z?NGB=W#m1e3LDbLZ`1hI#F zxow-VRJ`>CBv}1%HldQ`6TejDdVm0L7YMr^#!5<#Rra3sN>%WWx~u#cPd5i1$E}|1 zBkOb*>iuzL)Gs~MZa4gVW4)}!!L`)5if%*HcnzUhVGEl~JxiPUBlII(u4PgrQD4`_WtP z$KZ56Lwc#cr&@GOrGF?(rm5P5yE!`|JfG@Uj06=s0zrOLI#ZIIvIgK(%X*Qo|E>Hk ztbH>iOl7HG5k|#HG`k34D)zKZ_`STlCql1^*UPj%RR7?UkOj^Zrv-TZMva zY?_5oUPOwyWFxucQX4egV^_1CZLv0p`)k9Q`PL7cao~< z`~Ar;ID6}Sry1g=ubtYOo!EOXqli8MTwqMQOu9`z^&Yp%;45v^y(Y3T2l4d1(EnV) z4oim5pY-5|xS!$#|6ogb=1FmayQn?gV%_{FU>e9Oq<$7h%)3%WS?r{8#2^s9kLmN- zm31slVvLmXgYg`&bSx3^Mt%*vETygr{SOk)4ABAbv%-}Y-{K^PbIl}jJKa=!L%@mU zj>+SyO`})M^+L1DVUx5w!&CAs7n@`n(6VYp%{!^0;#pw@62^wVG7Y)n+}$-}bgpy; zV|;klqb{UmW-ZvZ+xZ=)_kKPxBIIUlQ_J=8i@2Lwy!wBXAna8A39a4CHUArAKKb{q z|3t(Hg&gCMRdC=qO0jU=L1yzZz$@I>bh|D%dMpKQauED+HJBj1^$k{3SMPs|SNa>~ z`j@D5t(T7F*iJMuEMsS*wF^t~*iv25TO=@UbjI{Jvi1aTNj=Wx8nD4$ZKxqTM^yde ztnvoIBNkf5qjcl9-Ne{x?*PuhEcwc>teeoU>HjyIgsWS=Wc-Cx{`$Z2T)mIq|0$<( z&<*;V9S!;?wm9>@#TJ+R9b0^ia)j?};WcvUf5dkgbpQLtZyr05;D7ziEB;Hs`^UKR zBl#Z>)XMO{nsK zzi(PA=?GKTS{kzkEcUt>EfQN9!7be_lt9pR(f3wEtZT1%AcmS#Ux=;Ds+(>B_g=RR zH$~NK)13)+ZNAI|jPXaHlL?DQ?*ss-9Cd{2M4*&4o{-gY&%COb+iMhW>docU~ zfzSF>>*6}GzR*XOU;CPY*Z(0y-m=9%I`c8(0p!~C)*@YL-BdDw_$CmkQNsfV@=YkWfx}5jU6IYP*5%lqN>+riasL9oLkhTecIFn> zFXt6e+y)I@MXp)P{3U@jK1zOJf1Hjz4}7`=bpw zG7X9JHO4EX=;S|kzQsS=wyV$v$>+;E(ns5mJ)vbB-o!i=pnlxmgYvUL{ePe(|2uCT zh5z+3M785LLU}Ws0B&igea#?{9m~1l$TMiNa!s$P3)X{x*JMfJg{vX2O20TVnQV5B z2;nt+vR&=!z8WmSTJ3e)rM>G=ZCCHsmwo1vvoCL85Gw6au$y%tdascbft*o$$@qWJ zP&|14388q?a1nS$^0#_IhetyAk7<|WX^-*@-u+!nj|6>P%x_e3p*>KG89+96440@BM{^UZnzju%_|f6g&OfrJ30_bFWj6%-79yugE5&k@}22Zvm4e7333Vx5us` zhbqg*cC)qiz@gu3kvA()yCmSh9SO4{?S9(`Lj_#A&?MyJ0U@7oru$Z(Z90d}Orb*z ze#G3JrU#-3vT>5HfHkEZFbV6Od5R|rA>J`ADjK~G_no>a5am4!7kiS?N+;%42ptV4 zuvED$OkvTS*oZE}u++f1+tAv82l?rQ_!>O^LZ?EVmC4CyeTLW$;k%x9m-eW z4>_Ke!xBNOKsW6FN;CnVDa=3TV`QmU+y6bR$Knmn6?|NnJzWl}YS{9>$$55Y{e2a} zsE^X`N%~v2H&K{LJdu7js+02n=k+{VppTOdSyM0A_?C9RFew-t=)8O+exN%$0~B9G zBKYyrQd4njFTo>`?TI=327dE89;L@bk}c}YcfVU@wgLQStK3%Jf^kNkX)xNP<^IHV zKP7X=N9io=f99q;`}ZfPS6-sua}iJh5ANn~vs>1&9UiPNH6NQQfdOr(YLl;B;>W=d z@}+=;zR)-CW!EwCH*wOjlrD}Ll`UnzDs8ttf3xs0R_DE1uofUSR$qe%5K%EArI?8C z0%P0&-!d`(``J20$VKBT^huwIU9)Z#!gUq@`cdmmP;v07tqNE)wATtxMsRBPN?a=T zHd-fLH78tD*=WKT_j0On;o$u3;yWjYnTif;amAIIpAphWw>#~%^Jr!C8X>y-4=Lge z)f5u(!D4rc}I>AiviK(B-l_`)+@0ZQ5tpIFXHHR?$`r_N=Sp)N=sQ<7DRI`h(lsWhs99s&{GM#u+ zpMQxULS8XV4HtA1e!8DVub1cP*TFqDy>!?azlM%*K3Jf3C4m0Wb#~^6XcGWYA;8ty zSpKkA$i-+|-Z5D?4&nU;>9Ut1cYSJ5=0ri=%i7rRcpz(gA+>P1RB`3i3WMq$W-$MN zh3ICD5V^~Bm2*whI}T|n(M5Hw=&StNWiv5{s$;nULnU~mf;v~m1>Sp*yuN(vl-TQw zBac1alvr&aB%mkNvirxKg!A>R7aTSh^^BIP)|b?F9|`WgMbBz9^w!fh8(%mPQ=u=z z3Ed}baq_7Jjnenmxp|#bApXK=L@?b-I9Jh_!CO6^+aY1v?i>D5{6q={5X)b2PHo*c zhvXj{pK9AKa*|d!bJ5-94dO9a!!*$Szn8+<2YmT&s<<+#3vt77uA6gmGfV`D ztj1oUGYu`#99&ah$=bx*G3Pxb;O)TwG-&ZDau36F$1x(9wCT`fS2v6IGkmwacT4vI zz1*J!sRU_sT0Vlj%tIRL*yg-5icko(R8HoA@~j9MF*&Z@}L;-)yLulAs z|7cA6)k(Bfo~M@C;b+e*-zoh2z$#Z1K$ zJ0kbnjof;G^<;rlD%5K7PK7^6MR071ruw3=Gc5wdvf33xxMpwgofF^2sI}KK8l+;d zCGYp=8AYeW#qDpf!n*+SXWF*Ey+SHyehY#&4g#PzVHzuF-%%*XOeve9h})mYcKX~yam}VYpzD7BY4RE(9*Y2SXS5$ls1~l zM4#XinlW1QGIOAwp~Y zb*=B~9Mqb@w!yM{49N8#+&xp0SPg=9MV3T$f_sX1x_oRJjepIEX8f@Jwlc;=A6|U` zy4(wEidPUzIpHh5Omb}jIr4$Py3=+EKO79(KFN!foKhx-5{gr?0poizCHnkO8%{lE zLv|t6=3qEc(+_JOt7PSF&Yz$j&S9dMiPV#uBO6WJv6QQ+Se}<{-*4VH5OnH%yC8A_ z4Xcf>Tiz1nFWga4>Vs58r#C#}%cCwsiV(OZT}S$J-!0*d%r;mnyYVss$a@S&m<{%b z=wYi{e>M-{lnHq5B+K#7kkQjIl|SHqbqYbdA@KgOV(0Ory|d3eW!_3X3$=`qI4JDy zVSzq>=z*7dmGQ*ov+3CS)5G-zx9Eu8X2QbyJTuu=7BlajUxI7cO*-ochkEd&35SCh zNT<3ed;@*815VL^fwlwH%wpU^OW}PLYZnO(V#(>@(iL8sti?&p1?jM=MWMI|wdV>6 z{a7_4YA)Au>hxDx7gAC(B4TAHU?)V zVKKl8-^^$$4%#EsqBD};d(5(R8e4K0>y1VrX`|IS{knQH@J(+bHW&G8u!G~RPq%>y zw1CCg?gQ26D4)U}X061L`TBCzIrE>jyq8sH+?U{2*0I{rPOL$Rjb;a)av6|>YPGjZ zGdqEnFt60uh5|6wY342OZB^>lmGtJd5S9@<5c?v$zTtKL!n{p<3+h@;Z=_h(DLOJ{ zhv!tB1}5d#ba=pGR4@V6R$x+4<(%iLgXPapn>Bx>Q+BL4#pWeYOV_rXn(nSRjj2)k z+LsN4Eon(oDpyYrT(~qNR(+lmU4?3BXY1iE)=^wH8)NY^;iJ|*jAnA}XF)xmuaDo2HjR>Ggc+FEtTs}z#}wAt z3zJ`#+Z~BgwT;UGD`9`)9%1AqLxrr9vfRI2*e_j3pKzo zju4tlXwK77t7|qa#bzIM$Il7Pq3%Z=by8|w*dEa5c% zxa0$3jn;Kvr=5__PnVO;QpH!PjQ51=xQs|j!vS?L3sh3btR5%8nZ%oJ@`mAdc@&s#dN;jh1>mA#PIu%QW7X60tAlP7pl3f@BV zjdi_&dtU{Kz120?a+CJF z`oB-*Kj2a0L(@OIlf#oBd`PzEfz|l=>~3-aCip6()pv(e{Q{J@>vo2EaYzI{Lwl#< ze19~6`cSM|?;?FeFtye721W^gTJs(B5H8LaT_|XoYxV?NuOR9TsjY?47ULfsQ2FFy zXv4hG&P5bwZRvRzy5`H|n)eE_eLC1KtsqOLmpdSw%DslJk=-<{HyLO-$>!|ks-2wF zX!X$(4&0VdOj4Lw|LuqqW1d4|88N;|@@=ZsXT!|3Bx?C8uy{Mz*ti-GkzHEM6tWml#C}&SdpMZwdc;8&kTZ`RKkUd ziEi;N&b#-pzic5!yMNMlPLIN^p0&DffeTO^c{7u10o?pBiz$;ze|5G%J1aD1#%rIU zx{s9Vc?&EqJ1PPuZr2I8)tI&cJ>EfusqSl2Y==2G?#wA4S;plR7wDvOj(La3x4lX$ zg-ayt5vm=QVulJG8?#Tj)t8J+pT5@-z%)p3%V?9)!1>a)THL#IC6&8kGaLy~(V!XM zSyRV7yT8h4QoS=0cgOIqma{?3%#PN(e!l$Byll|1kFUjxxK=LHbUFI?d_DTu#TgZ8 zzmqonN8V^7O;XbBQhsV#a*fT*p~DWN9hh*rjc>ukJURqZh}pi7YXblm!0EoPVQ^RG zToc0|D##kTyllGO`oa)^HCT|udRCDt8|4Gtr&naZ>rQgDmJT9{%PK%NDVpQ2%>&eb z3v7=f-y7hr9kW^+OmB-;9!rWc1?*-qT$|S&&<$QONEw1l?{F^W;5tDqEl+y+{XIX_ zIzbVg$MD8}khZPgYKnIbIT^1z{}_%LTFju8u8pU}XQGl-y^NJ`W2qM$g?~xY3k&G63iuDQUfnD-z7l3rCgtf4EXV*czT_Vq~MAMz0(=TWiM91dd^1I z_UT6D{OS`BZGv2H<}dmM-KBiPK`e?b8+j~Hs*0;9s!qztTy zTF}|bzE5`#L@X22hIg2Om4sOANRthzp&x61Cr39!HA?~H#ZRrf6{x@>uBvHp>M4-> zY8wrGM%q}-#4y5vlx0)C+p|Die(?DE{<%tOZ=_}#ePzW7-XVd;kLah1L6JsahS;rYnb6G*ECVfsrC!YQAMjhfhV!n1RiMq zf>ZIQnHw+d^e1SiS^$3-heL!Ly2CjjvO&IqVHkgCZ=(XwD$NpF)@CP2Q!!y*^xG$` z0hB#LQ8ij>8vo0yZ(opugo8W<^x8xPROYW{SQ-ouW<1B`YZ02M$Q}DjgsAw&s&F78?_}6=Ze@Kk&61^hRi{!e&&$7~s>vOw%Zns% z8*?i1qcDM?Gy^$)57{-pSfV81K6+-eQ?1AXFoj%I+&@Ix`0`zrK*1`W8m8q_lk9y& zT{pWEynB7I2xtNN{uBAbNCmORPM{R_1SngbeAX;Y4Y(pcMtPYTg|V_gy>r^sx^jL+ zEr5Z}v3HZKL}kBcHf}D|y2yPWD92kcT9L6g(JM=H)%jwyxRc1~)ZK2#X` z6#Ov~r<{S_k+V%5%JbXa6yWA%hfj~{`^*jaQH75j8gnLqTe>UR@>0q&KT9)<%AtS;WM zQa-Eyxr0k|AN6s#{I!(>tV3SvwQ)&Af0b3DT~0)Qxfbrqhx6)SjoPS`Z1EHy+08Gd znc5GY?bxc1$Ra4Z%m`uG@Fx0lzEUstWaIu+&{@VNB<}6p=G3{KyltxXdMHcO#ZlId zoc7VJo6ruH<|Y%sDXKkx&77sLHb9mI_!gr`S2IwA3EZ9vrN1;2$GWd03-i>B2^{zf z*Zo#Jef01B;YkJD-zGI-SNAxtcUQ6M%oQXwpF~=J%ZQ2!>$6#Yii)w-5+A>woi@T} z;d~r<^VPnz%XRDt|9=pO{U^kxpV|Ln8M5EeiwrZ%l`S@08Sd4cYB<)kK`Sm|%w(J=<*>Z*I-A%_Aw2V*WC5raHRWxtnFz?df{zbz@`2kw^%{#pe&-bNW&vRP?GVwU! zANw>+_b3~;V-5F`lWqkhAz9(oe8g9Gr%AJ;?Q=}t8{u^Ed&Kco%Iz}uv^!=0<;;t< z?(a^)e!8T){m0aT`zH+i`iAQ2cfjIMGZ<-7)XhGhLkBG<{0JFZ9Wg1$7}VN`YZii} zn29xpajnB?pu^@`^#8s;3A44mYe_nr8BVvW$+&5!-R)a969WvHEk=M}eAHjJWFBk?5GI==&;(&bK|u z5enk_dcOrf{}*HPza=|M%>FM$?^Mf1++e-Cb<#3Q4zu<`hoKTD?Papd z0Z~7wRX+u-&8|Mou3aJR7(Vy(_7GL}ww!}SF?ZCIbpKDu4C@Z~cPk`0wXu)?iwg%G z60|T55mTmTFt^(|hWi0`p$fi~RIri^ldxs4Z!QL^7g830@18Rk(=xbD+;VR%%GqQo zg@RWvwUm0nUF>%CVKGzE87UQlFzOMo+a_|Qo8wkB-l}f8O2>AF`CqsUvn5{7e|GkZ zYdnuycB)aVwJNaX>I(cglAdqD1BZ>j2xL&sU;u>ggUwoXqc3PcgG0xI4bCT)_zzCK=$e@d~@7sA;Dv| zdSEbr@6)n!{rmjqCY&NS<#ijw!8;Ui?{BCWv=LFJh3wzxS1$__dvw??4;tlf%0++} zX}g4{#yjQwUnFBAKlIn}GBd}1|=m5U|oV2oQ!prz9%Zg_+5J2o%z7$F>}!!O{x zBmPyS`Qw{A`2jS`bA6Z(%Jj^@-A2%_PKJIP(d^*&(Qgyig;niakztRV8Im`tx|HJ< zshx>*V=Z_;yk+XVbm)3hxf-34prOLtoE!ipOF!o6v@AlsLti6KA-kkkJ#G9F$~vs? z$)4|cS?tngyzT^eWFhF z?lV`wi^WBj=2gSit^dJeN7xF1_Vp4>|u-m`jMY z*j}nbF*`PfajQg!h;#=Rs0UoRV2fRw3X7mdS8NuhAlKbwM%A|FZ{&ptg@fm&#PwOb3uhBc_n zIR(eZqBHFRM7#PlFk%yGx;}cRg=v$%Qt~e)2H?9iGCWt-mxkW7Est2xcM8@SN^BV` zA}(LhbGl9@!8IqA{qAS=`r#fvNz+bz=GKIBEK1M%;1u&D=~J6_Z2DtU<`YC8JXi8S zkohWBX%5Dg4a4ux8(o?X?HS+>>uNM@z`9RYy#x%+Jx0tcbzYCa0NqKQX@Y&wxX$sW zF*iK;Dv3N&UF_cVX=$pOqc$~XXtj2OkrLOs;O(H}M65R3RP2mD{24pg+_7z)-3(Kz^lVr(j6^K0%+lYqD0c(m?D@_M6~HQ!$5J!!!v zRgJeU;`_u2u>MAHE`$NI9Q^-`(_ecU{~H#BM!TiKp1ty|f&#_&-BqI`P@bI|Dvuv9rjDbL|M)p(WL zTFax!8x7T6e4|)*edEMsf*_SU% z%vz&`C#0`2#;E*vs=Um6Tkw})t@)nBZ4NHAI*hs36G5$D{n9tLx4@GNW2@_xME)=|Ad zRz5mlKKIcfsqhZ?6#ZfhJ^s$dt!W86HSCplYP4Ah@e!&F{{)W3DBPIy<}_b@Y&Z>Y zkvNu?)V0JP`SxW18^-qj&4sJpb`|O#N)J6RL7PL*SQ*CP-lsDV7uL92cYVcFGs|t6 zryTNXT`1_2%}q0;)v7>_EkCNMs+IfRbEL%7f+SbxmvfrL()l#{PAPbA{iJ>I^lfWO zWb>T*ZK5A&Xmz^vf@BJSuD+m!yh`hVc;)=9E(NNGzM?KT(9MElWlMF{S8cDb@{A%4 zJ9_u%X#VmkaLN2(&v}Vc`>IEvRwTmV)6YLv0GRhi$slg%KLAD_eoCd)&%Hx)*coouPDz z9U^abDO<5M5)*`w+{;Q8+Iul?4xhojnLx0zRwbHr%jUftK3~(hwPyZ+ZKnLwe&$ktGQXG=}r*RFnMv=$4APfd$q^)zVa zCG#lhAHk6`eATM#M$*i|GB?FNE0g+S1+kfqayDQ44Xgbe-pS7H(`m3r1suh4mk49) zPGjk9s3umCLI~!xAF$B$5W^5>6~lfkRu0_)%}a1D1VH=|1a)7)ALbSrzjP>-&@*4w zI3-xz{7_9JLnYVoGa`$o4aWBV7-Pmg;VZUWITVGBBaPH9g5p8*FlVs-!tFn|=~dLq zX|ZriD^^g$>@qJ`>27eg;JMzo z_4@92AccK*&jmoWD3GOa+0qLo3?$!n3(8#vCWpTXi>!}THWK%=`>CqPa!4O0R4N~G zhx5mSpd101kr-9!FRc`+Jc&5h2Qo1GAT3F_sT>0|Am+~N(8gPRmFF7_Qd2ohA^h9y4;$hk zmW5p1e~Zrq^-;uEu$;ZS2-W zQ*fh_Y5C^&grMBxK3DVK;M<$oCoKnUdkxsKkB4ds+-{BZZ$!5o#bBd(zFhDr)E6r- zT|8qRkdE$$0@$!5QTAR74b91Kek5|$X1}-BoywE4a0`*Bm*1S7dB@X~Us4-5yYxPi z(5{f_P&?X3>k7_frF?TXp>8r6wy_H)QuHZnV?=T&bO@z>LsC<^`&fegeLe2ja479^ zpL?@IUTR(ej3(h0&ggLHkfq^@QuT>tl)E3aC)0&ZQf46z! zE0QinkjN5QrEPFHVG_E8QxKI!FfRKNr@-Op#Z%b1vX=(v)1)Mo=b%=8&Uf+U^o-!E zC{bEiCBaPqW};FoFw37^6rWN`dnbwCer^g+Z2cmBf;(!Wsvr3YxMU^VfL$~%sq>ye zkIW^M!{);&)&_chex5t=I_`T3Gr1%oUb5ThNuG@W>>%ebKE`gZaLIyK>@w`6 z?cOp^@mzzz$agC0$y4(zM&^B3p6%D|Hn$#a-APhDr}ZHMkA07AtHs1wbw?F(w|1}7 zVUN@1ZL5Qb*4t{eM<8(ONhP>`k?JK*^W@;i1Di+vV!IB1P}Eg359BBM(DU@koR-AN zsNnb{_S4n`ZU$N8>*C}w>6j$g>Eq)~v`SREj|jVaxJ^W6h+~62SWIT9U8$5(hMA?M z&u~ECSxj(}Da37=9KVCX1gc72!s8lYp7)%@YMayUm~7O}hVY~z=E0xU>!Qllr-bZG zrFy6oz($)0`=#xBVPy1a7(3MCg#~j2v8%Ie&in2|8R>`(a{3 zw9p&^@x|O({!)>YPEhs235R=If$?g&)s= zXzqswIN;AkxZ#N2e@kAldy5;vxE3waq`{3{#?0(vQVJ-z<8^xeEfqV^Sf!{2;E@-aJO60oJM z_~ekK2D{$PZV8#Xh?!SOYI@MftT0g~w{aug?2ulO;G-Yo@+|i~8~CoI1&zL;049H| zQU@LiFzXj>K1ZKmroCSx)S;U_*_;n@^t;nM;eY8MFIGx{{MecQV#ujmv#Jy>5tg=M zr&hdO`c3Baae6`N0-5zp=IFMMt@Q?uqp!T!b7Q4(2StKA!aVk^X%#G=;hplYV1msy6ySz0QdcQ{UZ!9RyJt6MZK9EI2SaKst(lBv>6 zydvkfR7vNsQ!sx}TFuzad4X=NGgxH18lr?Qu0dEzq3M!f3|zxMSCJV0peqxGkGZDO z+%P0lf`_SRDDK%2wueWglMWInHKjY)UoOsvb55v=RbQs#Udr^lT2>*vF_NUndQTK^ z-Pe+Eg|sJ(pDOg8Ezg;Q zWgTff{K8AjyN;t=W>Aa(NH~A_ahHoXSQo!%WxIA@woU~z8Y*pNg^#VoJG^TkmqyT=6xb?Hqot`%dhR&IIA5&C(LIeZp#vr45Bu3rw0p zd9BM=Mo5XU56MiA4{nu;A=7zlF8&DB3YNlqDAqhb?R&Ke^gB&W>D zfBW>5@M-3uo6Mv>2d2VQmS%JxssQs)*X#zoA1{#GDvDSM9Jje!-r|Ma3;C==A`4C9 za-C__v$A~vfIK8qvbG}AmL9LuiAUrD_R3G!3|?nO3As1?qe`!h#8XzH(t5aHd z6BI~;;Pak&iKJbb?K{*R-WUzafX^5wheTUo@kLxm!ql^l9-G-+bi?7zDSvyq8ia}5 zs!^A_r*Y*eae$>C@3PDLqi1@S`P^Gc{kTD;q_`3 zUT*|KKgk2>4 z!Dh(31yWZpHsmI3T*WuH^sA_oqQX>v`a^B%*2AtI<%+l}D_y3Y>x^Kp7xyA|g`^Ja z34B9=U250Jp?2=CraN}9z@ZJ0gMdPLXtogC`>Ml3D3l7ca4EM1K57`7ddXWtnymLk zbE{t3rH1OAiH0)o7Q%Q#C8zD)HBsn_pN~L_r05fXHk5cTBId{lZbR09D9QOBSyfIR zY)eIzWhkm+m_0!Y0=Uj}hpY~EV)S*j;Px5`W5BLwOqf2ig{mb`(B+$P@A*#Hu?vSu zgf>`p*VqKJviE1Alf9%fppZ~c?>?8Oys;t6GbU?>^itdz5Hy0l0AwEG{+Ov%Xt3gN zU-+#rbJeP0U^G-oyG_rc^)78}m|ced4%l1o?qE!ro}j7t&9JB5Q?P72BQnCPo!Aa& zWG88$S7c-xG1FT~7Jg*6Gs{kGno-zYQNqRhL69ym45;1`${;b4E2my_=v;pUG4k?S z^52lQ?RcG=!QTa|&-l2Rvj zvcjyW9AHg1ZS$!R6t$~gekoN@ZfzDJ$W$EWiq==!YW{OrUQeCP1iQ~%4Ex&_M|MW* z{dt5EoPIgZ{puiNNu@%re=ScQ-B;?fs4#*VUD_(Mjyx2@-aR(1$Bo(TLRR^};Zj#h zqqe9QEq!)W!Sq4hi06wK=UF?EkF<2N__C#0xV>N*<{|Y(uXFoa+P(4`2qT{dQ_tC^ z?e%bJa&775BF_UyK$aRanJvKR(;n{Fw&zg6^f|IjFC44In4WIl4*o%ff=D{fV&1@T;*?Fi;{WCE@Iyl4UZm zmkUv4?_IbXiY{SJvT%eG4;e&RrAIJV_RBa?tND8!&H!(QX05uxumxZWfcN#R_Tz$+mgAMh=cs4`rF$Z}p-q!ln;cmFBayGXV)w*V2)nsuFzzYtheT#mU3Ptk&=~3bV>N0) zqEq@Nm^P8;-4()|Lq}Gt z%qZ#nA`^i#CNWq^$q7Tym%Qn>ui%MrwPR{)lY+--!9S*b_%A@hkAKssio7he6t>`V zPm=iZFQXN+wM#TYm^wl8(m(|$5e}n|w9$qOOj=SREJpMtLN(=lcdVDyZZcWc0M_oY z)$cF~=n5e^#>OUN&XDVC?dc+c3?(6Go@}&=E4?V6tchTi+x_&j2gjt$sfqk$sxe}F z_pI5*V@1cPj;rs2K1nj|>BuuBBKV%5?m1fadzTQ#eg7uUZ05E-j!ylN63jyuyldZv zJCCp`3in-_$K|O=l#BB3oXdU4ZQCvCBL@t65p}s%rSw-ry+N)3&iCa!U1bU#S5u4II@21wU+dYM5|cZ>TX5~V3)nL(Xwru0 zx-?1%LR6}!AnNv!CYWBD>~M??MkxENMM(Fj(ZgBiUP3;0hctSf7Fk)uKcCBXsO(st zefRqW({O<>%U$n5g85v-H4C@mHm*U2B3bZ_Al*;}4{gfESdK=#!Ms(iOJ{7)jDpvf zD9d#)q=A38T5*1p8ImfXm48^S9i6!eY}5Cd3%==O>^5OG67gs_ai+%d`1JhA`dx?# z41q%hoWUr^re}2&bSu$=g0^78+UU8gae{c5nUVF?+H-oUf^h-Ajuy&}v8;&KV)T^c zyS5RILdlo_wc?-{S9vK3H*-dfQ^c~&_|U{LFndaZX6PvCVj)9|;l$#?GK;LS5u}@e z2+3vOvz6_K{H;%$-(jObqXG9J-vHlh;HmML$V9X{X!VCj)H$M_CV}EwLWjgy#Da+G zwLH2+8trdOhA_8^c%2Jt5v*F~=NH9!%2Mam0=A^Yq93QR6>-l!{7j-g%4^%J=3V3r za`IiVwi4m-4Oeu+TE%9i-FDGJM(38%IkC8ui)!D-UIYAR3TjKk2uP}T#FGxnpBxG& z;;kf&xWK&mwJeh;?9Qv76e{}}Ds9{d6CLgCXfcq_8U0d?yikD&KFqs ztgL;`zTesVt~~}nX1{NbQN`?OHLL1*Xb6y3Y&yZm z1_PKj#Ki?L>QUP(j`@Vefi?;wW|Dh_Hj=U=S0dRxlvZWRfDG@nmGxgEwkyIV_fXn&`VuSrAS6 z8BN(Wf~eABEXt~E6KW4>8n#i_U0P;hz@pFla~^C@8)DX8EgwJVp|%T}pCn|Rl?$*} z-4x^Xz>MI+vO6DI*)(iEou@iNQFAzb>$*(Y0@o$Xu3w*XW6y~?B! z2Q>#KmsvH{Ig$^nFCQN`Vh?`Jb8s2^lZgY5%9L`2S=5lkmf_W>II}!wOUCO zGLlivA$B1m9YATw#GRp7xr7Dxbh=f763{vXb2!&eMMhTKO8uZ|R;M0@-};oNNYQv| zuxFI3K6gAxjhlMw*rXAB7c*F*yaP$)qGAShxuo8Ly;|r>;VetXr-sN^qug*$d3*hu zciHiirNKo1!??K$tM{--m8BBnL_qEZEge}nu+jX6Plyy?=Zu-W$gIwk?leIto49eq zv{ATdLJd+pMnf!-H+ruW#d5kwam-9GZs01^Mz*~cmUW*!n>t&=wc<%p@$qAzr`i3| z=ACs7;qv+0{OT>0A6vmESUu3@vcgxG3@Yu{rO3&1%pFM`8sTFVpc6G^#EzDvZqN`V zAnGs$-Y=TN!_W=~?U=~D_(}-M)z~V+ocBumlZJ9RZ`CEYF2i923aHZJ)uyJy(TZCI^x<}=&L#uInVGlymFt;1 z6M`*lq*0}nSCuIdSk(LAZ%Ug1945{00gM9%$=Z_r-%(51 z?R@PnTwEH8536j71{n{`BCM4)9MmQo)G)^smW^k4lADJR+!Z@%Jze7^t5w5kgD0H* zEQ|vrbukSZrFIeH4iX>VW=tw9qt|*JaXmgBeDSCtQ4XY}_TsK4NcNea45=lKpK?fC zXe|DMB6uKPK*Q5OIqi=w;yqO=idA1ZA0PM>$Wtx>B}Z~~Z_i55N6;R~JEn^wSvpvh z5yu<<(19Aa-oEGtEoY{){rC|ttN81#*mt-K*(aE+dhyu9VTkK;1Afk z4rWZ1D~%G6@xy>xr_z1(XkNvQarn8CqF`XBm#Wr4KN}%+sOOA^Pib4IXmdm=yqq%2 zRVI4mSP>~Y1@#?7;fQlInA)e&$Q}L|rFzFoT1USp?L*ge8kBxVbZdHEbguTN`|fl@ zpWW9%3AGl%y=W!Fibo3ET$PsQjY~4$STq%NUH9rGfQU|derbq12um&>e z(ol|E`buzssDi@~I3M-JuWB7X@M_$hTa_n#csPO-{#TB+_do^s=xzhRUIBCr?9Mw! z_fuRvkSs9^9}r&wC>UL;evE#x8V825@t{c)ZaGzBl)LVWtK2`sYC)MuHtd!B6~)Cu zgWuU@PcR?x0oH^wRUm7m{DmUFhP_hF zbk3frD)YY9`tYlgD5*nYV~Fu3sS+RUnQ9GDZp7;NYv$VH;tJ#sfF(26PvJI|INrFD zVuLhh_AtZyGZh}e?~;{vA)!_$z*VgTE2z_@Gx!OaPf^(e9#{bR&+{}_9y6ctr0OSz z9o|>7bdxizDw0pV>L-tHo(!bTqq@0uq<$6n2ZM{ne!WhjNCcy zLwGhL+lVQAqoH>y^uzmm{763ocpQg}8Su%eJ*=6_gao0UK5%AF2%ICf_M&p8ibgx&*OaykEY~quR`)rl}6Nmc|>Vw<-l_4Kihi^cQ>UnSKB0DfS?Hqu?FYW>EZ9M4(W!N&8T z^#QuZREZirKl~gR^QrnOWS$K)lw_7nHdCs^6RQFTeqp_+1awsH}|wriUW|;$On;` zc>fE1<2_`JN`YlzF9UPjwlUJyEz0tPPq#s=K~5;nE5bWm&BR;H_0-to@58qF-1F>; zp^Uq7L+gcv)-lq&@^{gXm#TxDM6b1R`5!)(_7IH(17}fICI}i<1jlWxDbHJk!*uKT zA&0VD2yAh6d#F>+aZfob#W{g*SB&hnbw-0#x?A4Go4<+JwGc!|v8mm&GBqVnD<|ly z3xn|>;;|=By4Ykc0Ss~1x^Md?(EZxI}SRKu%ktN5#(Z&tC0QMU|Nd~<3#K}*9` zTUB?n`^WC;@y_`AV)w5-!zBQ&t^@T)%g8!}5%sZcqLCt6X2(Vs{P0_h2sC1++Noil z+M-4c+r`_0)G&-r%DFAu$hq3Y`p(KYmwwtIMP=I!riR51t%)YOI{7)|2BpJWPg^NP zAVvsqc6!S?bw7ulQ* zzshU3&+ulwJ1E1oq~S(4OAHdWzIMnP*OEnkvH3w*An6hJH&4K?qc?oWG{v8^)XE4p z^vrZ(IfnaaSY7&DakVgk@$vYS3`~sMluCRY>x?TShs-iv53wHQI!kvXdiE;a3{+Dn z8hC0(6CvAaCK>^y3VhNL_0*7M%_WMAAq0fj+=1ioRdguQb3&Z!>x9WXFtfn5Z_4ze zT9(FcZ$dBEe@d{0D91^#1%MRT0;rd0G}WkPPBdJcLoAuN(LaYn!P$2(?)H9bXo8 zlV$Nxu?VYmW21h&1D=z{w^b?qfmJ83>n$Ep%dj{NtwLwL3vCKNSCtsE2yT#Av@ zgx~k?09yd5 zr$%W<&GvLz9oQ1&Y6*qV35A><=xQS$hml=e&$vwlI!CMV;3rh)RC%;? zO^aLkvq?4;-;yOO=PPmp%6H6%u2{oaXVpGW^^Km8BIO(Q81sqaQJdU@DW^l?E&3>2 ziE&u)C>weA?!OrwF#w?zor>i)5}X)wdo53Ol^80!TMC_Hk2;DH*CtV#zHdu`=0{wH zG3IXjB!qDv$!^&YI70mxmTa<#+~SRc58I-xFec}te4eXUaSmwvU>*H1u4}I?1Z`Da zB39>VWN$Z9m{%RMIVwMXP|Zwux;j&suTeEk`$esBuFx?_|YWgNfr45g1gR^Q=Slq{Uj zA&(Z5CX~FK)B<9efu&NozQ)tl3|9Abg_*nA? zhEbTn=UE70v1icqtsV1c3?uhfSXz>p>Cs-v52W>j7o_!l;5sZv9DDYUc1Ph^ zD~sWZUMO@&_Nz46xy|#7hhi3{p`+s0A!#NQYb+Hkng%Lm3GHkk0tqe?qkNOp(P)N) z;mNB#+-E$alBOdkIR8iLO+i$`ME&s={c{h0*=05(kFW7nXS6g=+?FpOMkW9u$Ujj@ zA`rq}LFm4Miu=R~e>dtQkp1&}Tb<3E8i8^6!6N8C#0lTF_QII}_qtMT>VII?M>sLX zGc*>|65&LmUx@x6?S~4G%~pR$8a>T49*CH0M(3zc1MAPWKjpywM;sr=rPPqo2bl-8 zW@1r4+&3u}D!vcP(|DqXUur%oPuZ0S#&i=Y&ptI*eE^R3!2TYHEYRhDrQ)!NX420xm1=8}47r zs>c7HfJ6S|1Kx#wAxFlKfxi7sZ2njBmNDT5__4sy478#@@SK?5Wa&;23vl)#CcQ61 zx&NgLO5IZ$EqCe1uz!{8*O?tN{Vw&Y%2_b{jT2h^Y$?oLRS5@9O1WUz!6rTxo`t2= zdCf3uZCR&M_a=G^DR*A2zro%-y4m%yW?3~C!C{NJNLjw#baL!b72_-#k!d4s0ByY)ia=T#{_#?l=-X}oNbO!_6`sYm>+!?! zHSXW_&0j)Mn%7HsL|sS}{PP%f*^;Z;3x|2LH^C-%MZ zZcyZ~I#nkQ5onm3FA>#x_(!MaC$P0n=%HO1XmqmLcL%?BznP!tD6OhB>#Es#CYlby z7scPsV%VWBQy#^-criSZ&Df^1)TX1Esk+)5at})2pj8UuiLEm4e}eJG9rFdV5!vZ_ zMdf$Mf`0!@bK)=Kb9EYbVk;{>h?bSrmt{Mirf!*SDMJJ|lmT;q$G4lPEqG09YwZQS ztHm_K`@h5dm~(N>@Pc@@s#M>#zoy7xpVh{>veQ64EN_R?z{BO!i-;W_Vytj5I>0e# zVl4}o!7XdT_MPdQF2B@j(1*}TZ5llEjB}*l2-uKIxHSHJcly@OCgHrM>e30W@i`qt zg9Xnk+>A_I9S}ULN{bQ*cvhADzoV)rmuKFQ*W^7~AGQD7>3KMtGsT7JxbDr(=j}>! zU5(-8kEM|`>kguQGJPFSNd~5LFYfnNNhe!ovbV@}ei zQ@DYyHrS7m6^|-j={Z(Km%@TGdAY6JtN}^k*!W;7dUPdis-kAaf9J(Ky}@)Z4`Fqk z@eH{Szv53X13Z--uJb|-d$(qV=q6tu)AgRbcFt5D%-&031Pg8(gM)SPWAjAe?snV7 zV_O4ib8rV{^*ZaN;Ezj8@#>ilcLqa5H2PAj40$`v>F4Hh#Dc!Bq1#g}BX#?By(7sq zAQ#jaZt0#;K&nT%^fw=NZ`B3u$2My4u3p>WXH%z9(^!Y!cmYvX_Gqn#HsD0-&kQhI z>#|fpn(NdHd~*sBQm2q67sl5=uX#YG=}uC9G`FF4*M|Tk7kI(bL3Z~G5RVCg!g519 zZ-hchapFwc@K#H+vZRjR&rpq8A|UdHzvdWh3pbWW{7edH|8^wOR%gd>GhHsTMQekd zx0eO?%~(5<(6elmAmPb=e#awPD_y4C_ku9eAr;iO<2bN0?wzvkQhDW4 zcJ~kgWtwt&S39e%A&{8rBwV!uT(qQQ_SJl7YjEnm4v<;GM-N~0p zyCcB21>8OF2SN~!n&)QxX&zeK@mQ&)FcgU;_1>k~sCun1q|8a8;m!{Xi7} zQ`U~+VP-mjpv}>qEz(F^dIxEY1$IeG1Kk_9kZBRpnEGA4mW;~(YOX=GxBhEuwhnVAQT9;($( z2cLR0J~~xx`I@%8Kgqi!-=MXxUS?7Tvr@N$T{fRtYi2R6j;DPgZk{l14%;?AEmpLe zd|UA8E%O{_Ku*`MS)re73-jlrkDGJoRV-`f&sE+ld#GIlzOrSxM4wL&U~K*|s76#> z;~w;6HTb@pUh8b?DIUiT?dXhj2MwRfMI>(JMNG+jAdPvF*B>KAb5yuQ!*iM`C%dtW^*%82l9AU&1eqeaFgYv> zVjZJcS%XcYMJo5OhF-~OLodqX$L$SS7WhoUJve3vg7piBvb3}^(2F% zj2wBLvGu{-?#2oCYI=&vMSQ?~hwc%EucN9?h}yAKUtFCG7roUi$Vi$?S8pl41xn;v zrT0AC=uYu6@u5N1qKX->iH_o;?Qmd_2`ctzi1DyGP>3Vbo_kTQ$sX~=Kpj509^u>( zPCx1yd3i4L(yN@7vs@(OnSyVzaR{ZE`;_$#ucObzjQ026`_Huy%~r6E?wf|bt!|Tg zMT}cCu;hl6IQ7Bbf|>fq?88^jXkrWW6Oj*Aw#ygEXr`T#k0n=VAIGA%sw|!3Lbf)H z(v%EBS*;)tc*@_VKiCsy|M+D_TP{^cyM6hU4ZCv8W8!Uoo5M;61_;h-s1LnAEhjF9 z3$6nyTX)c%lY<=pI4Gvm58E&M=Tgig+sra0FbI(`fN=pEJSZx>F5jfvAmJX6bcz%@m=e*@LM8YDwz;3UeaXx35<1 z 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

m?FW&xxAzmM!09on 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 DgS|!mo(WKNt_lC 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%0D@`eYZS%7m2q&MoMQx^W=H3x1-@3 zwM=)utS6u_&m*EBU}GqJDuN2~1y}tew(IR>#@~)JUQ>oq5oS;h;0TCMk+l2Tsmq*N3 zROn_lu)e7e%@wldT$jjNW?AtZuZo=yE{A?sLwyx_no@(!c^*A=n10dPl3!>!aC(*2 zC30i;xtVibjzu;S@>sHY;8-#yd3^M<&URua-v) zJ;?o8^kYOm$kn3_ZpGn$2znS50Dk1=_Q{87Df!}6w{l+x4y*?f-XV%r}*|4x9 z0%{FY!-WMH$CXsHz#o4tj5o6?)O6wlT2;^Ikf)va64E!bJD znD*3bwDaE&NS{tP{&3_1^?@tI|J3g2mM+@jedwA-fbT(Y&{q8*ok!NNQ}$9`uW+;&;g63LFpgp-^|PaByq@>iNq1V&>Wk z(iJv~d9#jGtO+_|7nWTk!!S7DUt|&iq$R-1tyw=_i&bZkbXOL4KfD=c@|#bb&bAHX z&hQ>zLv*D=^eeKXmmY&j=%TmS-q^KR1_z|oH{jUSPp>yNu`Wy1hYWn9TdTvhyH6e^ z#$3X`0a{IaR%c{cq%*{pGnKsI$Z?EY-wp67#GEkU5sGQ!LToT)(}slo(tqEG8llZ@ zS8gIAzqE?sFb&1(w}sd|%+z`>T~||L1peG1;K0?>ejT(bNL_Uhj<>6k!RLB|e+naY z&ag{)btw2d04_P?$>o~?A~Gz<$g@VYO-^sTahpw6qD~Yk&bGD}u3+KWn3w%L{n!@K z0~Ta3$nqj?c|W~uHuNeki7mhWh9O#gLglrR(9uOzbP3$BVt0!qH(K23hl;(B zsdd)X`*W2uvXRzu zOuXY2c;yB>BKu9~q#g2pTiG7v#x}?pxkS2u<`h3(_B$Y9XDE}W?JGgffPx>>JKo401y6f{b;V`gxT-^{P+9EP_R9L}0t zTi)o89eU=Yiltoq04?d?AJOu%15#a|1QN%79@6KC?&aF05LWTm7UZjUPC_Nyydb4T zXee6M0pquR5v52q=$t2}jjVb!yFqq^9zCwL^s4dB1nMdbbz8*LRb4lL^AJ%fwfE+$ zm3TD;a&OoHM~JyzB4!@8M6=U6i7`Gbuqcy?s>h(8!DW$`iX3r9R44EjUM4s?v3l>- zJ0mQXs~r(o9JJRpI~D3Q-}I*1By19n9Y;C(jJ>cg_#%a6XPj$#xyky@P&n(|;yaHg zjy=~#Dg7xp)wt+-S0Yt2mvg0_lj{ixNz2_ehPrE`%g8K%t=UHvUvkU(Ti@D+S+!6& z)DYYk%|i=*q}6k9*&UNl$HNw$$iZ;f+B+^wpMn9puVPqsRYf({IMxTdn2PP~vXDqS z8j8kc-F`Cm%M};IK^-$-%h8;1ov6I0n=TN31)X;=B%eFJ$TVz^s*TgC`>mbLY)B;t<;;-9`^V6fWSwLS) zu9@px$S0{sncq&ngD-Z}(q{^z&E|{nl`4rH$Cn?-AyWN7vssYRSWWos=EHD=^VO%K zPJK@=q5X!kiP9x&wGGC$m7jk~$A_!rIchON-{-NmR3G50eHM~1vLi>-L%$;^rD z(r;m=P*kHYKST6YDEmURzI~2n9}^*dM1AmhgrHZWaKGd;WBI!FPpuq6?d)$)8z^yw zjC#f;b77w>uL*Y0J*D6@O_VR%drex<7v=FUU zV{&}Fu0SEQnv7oko&+YH9W0=^=5s2FObu!lQP{gqpa@bMwQtahET7syhP}9Pz&szL zZW9jSqu6J3uTt=xc=KW-)qzAbYX+kWeTO}FIogAi>I1tj^VmF6{`bti}5jEyIjXsstw&w!@Q>G<#?n^%>_#ww+hVz zvDKL=+z({hnT#6IbieXh)0~^}BiX^}fqwg(DXF`Hn10Amgd`BGu|G@kzemH?x<*Bd z()%vAX;Fzr+^3dr>mg(##z?9wr(;~IrJ>qR7WUymb*XTOQDB0x@(#{Z*HffJu2Pp`sp}G4oF)i|&@q z?S`|h^HpDHmo`iXtXj959-WZbJgRk`@y1!;9H`&CeK^;I-&-bKi5d7nN%^R{vE^KP z*^{jb2}=?v_`8Y&oWzxHo1U(<-NVtd?gx^OwpQyeoJTz4IGy>H0}DwS^S$`aGDf<0 zD}pzx{K)UI_jn(zye=-kl!IVK`()-@fhe^YMnOrWr595HCrMF(2_qhTZy4&nAR+w- z%2XUXbjH1D7$|1m{j1pYIoh}>CE#3{5tniL&|3DsOD4hx&${k|9#J;?(PFi`W>!V< zj|cc;&DGb|=KB@J^$G+_;>Xk-j_7)c{PVCCOxK=_nMT;a^Em5}x3;_=J6ZxPI=xRK zwqZ5XdZkJmC5Z0Te8$5b9zp)`0s41#6O51nzMw?i;mHcBdfPV`XjE6>?^tnXIR!)k zQf3hzYVR-0Q`&xeHaL|HG!Fz4fnns+)Tf5FKdePO;ZN{bID{cz0!#2buqr;m%9bWh z>6tGX3J%2KO!OTB!)_MDJ%Al!dS{bFhlZFPLZxq-rJhZ>EN3qVSmXB+JzQ^t9Yfdd znkRJTN*whsENnwqcs+TqQ2rNdUmXxvvg{o~f&>fh5Fki!32q65;1=B7-F1NAPH=}H z!QI^@xH}B)&cNXC0lPQ5_uY5j+xPALXXw*2^yyQltGc@T_p6E|h*9u?ke8OsFJ{=M zf3vnX2!X%CHScGu43yVfGD@nT{Kg3ef$cKS++V+2$*mutN;%0pNs8EZT-`NIdS9q3 zOWC(q)%FQ#S0w*L#rDh0Wr&egvw($D;z9M7&M3EX_+qYH)X39B?g5K!a3Vit^RjZA zodz0p`7Ax&`Q~bSd*fucdNnT^>#eyU9`{7Yk~zJp9XQtLB5W9c?I%t$$+gi>C1}R5 zTuav8h@^GAHMYCLdI|J3g;-j>fcv2NPd(q(;V$zNZMbOoQSQk6+{rc4I8Ln5XGS`b z$O@oD}cL+#jw?T^nVNuzNJ+)mES8DhU1IycPur1!9tX%+1sp# z3Nb-TvA1#(9~D$nGZ+=SQd$!?hmI|FnXsxoO3UJuQ5h%>;M9>>>?CujkS{edH891g zpI!?+K}&o}`ubu^RkI)PXBa0AYx>c$9$_9}I+b2_qAF;da#&zaVKpwq$17u6wL=sw zqU4h@3R*ahf)sWbas&OJi^ybo`QNR3u}hB8iD_+g7~$h*m7y zAUQE+jMJuGP`$70CS{w0e1A1-p~};V^J8V!OI|06Pkwc}5&Te2wyl)}O17a1oo7te z3@b2=G!=?#83UgZ`N_w#bc`cH8U=_2>@$@YgYd`9s?7+`9NLIyuPBs#E%1ck)#uD+ z)u)1WWb||rIi|Zf0YO#ATedohz0qIHY&31_Vn+6q@ux)jTqr`Iu1F=6&Ctgr1`8d& z#<)drLWnvJAJf4u%o>JOAgm15&8vEV|#%m$d?EaAA^+Tf^ zS$K{DbR@$B*_UuBB*0!R?;lbUF}n_l_EVVHKIN){DVc_3a`!j#(PEA0{U6d;r9W6m zSerNYiJr;R+c-qp?5gdg)*cq`xd?C2GHFEzg|-x~>mEwWPV~*Ma!@k446S*bsoM~+ zYuXHi|Dbo!H*P8-U6PPSaX2^``C`wXQC1@}_^msF@VvDu|0<;~nV)_LVJ#&BkJ$h! zkwJx;V0s(3JXiO}9f=JLfqNe}KM-*^18WcEn*BCp-(OH)7;WMTt8OT6%_4EE*tO{; z2navt+7*m%|?>o)PA5@aGT#qyTuH3a*Mw7gtF(M zgVvj?*evt!M70jMgdfIIt~(HWeb8}Hrq%|q_g**aTLULz>9&kOT12JF(HQA)NGq*V zxvi*&$ZZ>s<@&$~9Yh`k2y`NBFKbhr2b9X zvMt;EQbw~Sx505?<ZcB-aSoUF1hL7e0|I<*YYE%h~+Vw>dypuS2~`yL(SZLD(jZ za$$hc9+jFcm#Wo!BSN|8xxQ&MQLTA*9(naP(AXwqT9u?1-T8z${pQ+#he@oonEy-& zZNgWJ1zx5|O3PP?Cs*iNU!z)<*?0vWH7p^sDE&BX_4>jUF7G1Ht-M&}pRS*rdYa!>iZI=?t=tNiQOJ-fN^)s>U(JxWR#bb z5QQQiwfh8*O4Y3N@u*5eb~{o!%nc602|+yU4hPZu^xDwSdvrQR+X;i)zHTd5$+VWP zwD=B+x=OG&=}4#O{e#=+0u|{G1_7?-WPsnPZMiq)Hkh zOF@%xa?>y=Ad`?nvX!XInPtEd!IHd&Mp}j0z(%*S?pZa}Q5{sXxziCl8m#F1x;clP z;faO2E&HEUCMWd(L{ef7A8nGY=sjk^JSLJ()c4k<|DWotTK{@}M^y$)Rjv3KB~LHvydBS|(A!BvYj3Zuz{q7DN*BdSoOoBdh7z zO!ETeYO9NMwhQ&SaN9(qj5!VowS0?c-|Yh{oGcOo*Ccb>UF?NG`5$vp(1!3{H#Hs9 za8`S=yI`sDSuD2`!mb3a%lDU*Mi2wo?=OwhB0hep=1Vq22FVr|N3_0Z)ILo~L+i7e z$cH=4DfVc+wo^&I9hOP|*!z9ZjqQckE!ayL>g%Z|`P2qQ5Ni(;`&22`xYL+IpJr%T zP`&he9d3?Z$#w&f#mrV2hh<_$ifW3Dbx{L^toN2Rl>wc|ak?2^|!}(bY1E>*w>_u)If4v(IDE)gGe=&K(p%Fpw-p@=?Z3cU+d*XF3MfHk!HYSl?ii>sI_c+<}3k1v-V z!~a8ICx-v{#beHYI=%EyXLB><>gHVdZ=QDUH@0#u_h(72;hu>??&rNW=o{SyirWe9I_~1sC4Me(RIFElzXi@9~E2 zS)&R1$)6J5+N<*Y9J(F6Eq82tA(|w;VrcLqm9V4>3eJ?FJQ;;^E^!)&;xewN6*E2+)nGOUjs$Tq?zxSsJVJ$y{mg*6M{F zCCv~7S7y;=E)IbFT0?nz@t{^W9R0@lnS>_h*xA1G190)vsooPFLD#WkBNdz9X)*c< z@>0E(3jLR)k^7YE9d%%}cKV+*_6^h{-at)&F0D?BGtEugw?p!`EYVH2WZ~gbaPdn? zJZTw)rH%q@HK|aiMKZCxe-nAeLOZxVWS4zMn?nCNfQdNN9)0W#!o;+s1H(ooV0vbD zdQxOhTFVC(gGI1Ep|Ne!p~}6=f!eZc;wBqu)TV?zq$%G3emSwRK6jzCj1v=Smniv6 zU)RQQSGB~?V!uj*;R38dl$vnS|Bft-#NjU9g5of-jHk7){J*3w?XR`C_Ww`$gO5CmhU7SUh`?O)BSI*WU%AJr$fC?w*o%BYi)RjQ!(e z+1wrms_kKPny@m&(%0n{j-yHQ9;0fnrl=N0(~Xghk_Epc9*id!8-Q19AjV6&f&K14 zqjr^agNuu~Il9^OC{wBLZP*Zk^{LTQ4m%UnB*_2WewUpVG_E*x3}hA2{S4 zuAnn8q6t}+DhN9Qx)5DVEn9l+QSi*@sv6&<(!gq$2OVwgX(fdXY34Ky=(pES|# zLfZayCH)#9Q*y57|lYEo`BcGYzTa}JlCwW#l7otwGEW93hO6%s_M~w`PNQy|4U`(Di+^u z(@^aV#`#uS2Lvpq`VZH}PCPiVk`8|+SgOG@HU;gFcluj8{R~=)g#+x(D?4!}0q3Mc zi8lq^i@@GZPaU3wWybUn#X>cNi-LElz{W(n6QB@&=zc61{iY*vVvh6W;vF5DO{8ME zXwR*5^?kSn1z~;}L;F}GnAQy>^??4c+?|q7LCrHrZT7Y{Fu3a%G%m(T4aSLVe&)@vxaVL53lRm&e zLZIPu3d3fQQYhGfZ8p4q02eA%B8T{ZX-* z5}^`lDi-cqJb6RM9W~TwYQADEe?NMiI;HkE5i(Cz7A4Og$18#}FM{%)w3iCz`GfXK z4*T?zikTbZvg@Bh-)dHDr_{~M1A;x##w)(P9y%rx>_$>;KxVHQgvbzF9<^b7|KI9{ z{d}_M(5>XHT7&ji1ap|0X*vHXbTFG{2#LrXEZYpQ4a~x(6NGPFV2Yr~GDKNFw4W!| zRL&f**+1zRtk$UgYLUwX9h_3wsB>49+NorrU!~7Gpa(vtlhk;EP5uU%S-TY)a3A%1 zvTv@*(MA6!z5Tt?&G8A;h9cny0{)9B3-h^-6UAC6i8e+SSRu#3Jzujfbj?CHLd|;g z!~p3sOp#ABEuu#&jl(hE4^Qkb8q%`e9aY!GL)pbnrY~qUZ}^QQl^l7rg7D?1b+nkU z5m{nqRlkx@O9w6dp6QKKy4EGqDGhlEROkW ztI#MLULMuI^$i#IDfbDC74lBywEs%c%Y3u#PKTXU@Y+#vtXdB8JL2S?Zu1CUe(Q^} z#Baf9E$u_Z6E+*oTA;k?21=IVz=3@2zgK)U=OA)6zrS_3g1KR6^`VtqkhF`?u@l3j zL90ikHMEl5ga*7-(h4WP2S?>nRGDPP#%U>gMBp+mncBfw9tMuPB9N5E)yJGKUwt=} z;fy*XroWdMWQ~x@rHDU>R&(Agg-9M*qrfRfW%RPEFy=nQg+5hMLlx1I#pEtZqVu4*_g6sZC zWs%dL&8_|8&czFL!XL4qyy&?IS~%BWN^uu33MuZs@=`1~l85c~5}{{$cKHZdWg+3* zqU=0Opl^OcI!_t>Of7d`{j;?WoFetUsa-T`3S#b3TnT$}8%4vQGtG52*KCrd%6HY~-*HxL>{D##9}fKpF@nS^*qt^>P+DZk`yaXO@S5 zRt*XpM0f3&G`~*vEV_TyIsR5(;+<2I_2%QE!I2IZwSn7YamAhBug-A)Qt1kOf+oNI zED2Wqg+%xT$es5vdD2_6*;gaPZhWTmk$sgXdb2OYv4TD)q&)c`wvRpt@{(vc6 zCj|DxlHbV0bTiDLHW?kY^LCa8fR;j{(#~wV9?0NoXCFJgz*v7+QA+5eWIX+E^z+?O9ktuon+7>N(KV`V^i_?A7F9k$FcdH-nF2i z>v6lKke&}Mz{RxT5e&>24Fg;Gy4vPSAUipJd{XE~>@M+XDMz1KG7 zp&ntoTvtVP+Atc2-2MBxKHTo}%8#&Jl6rlM0X_SxE^`pR*Mm{JobDjcimM14zhP3N zINUAcY3ozEM7srP{v}-s)1uCo&&(E?iX;Z$XcVJ^1 zyY#k!ka0~*+Ym()drGQn$2Uaqq_jd_zQScvv6wVov!`q8y-m6>;1p})E@e>FnF@|; zg=Bz9OZ6;s7-8<9Q*Etz!>QHa0oOSEg+XEJ!Q_JvA>xI_DGR=Rt^)V;wL-9Dz9`vj$vtwh-dY3+KrNhds zM$!UNAeJG9>&4nuLyau|f2=9N=IaxiMVoreu$sw45U~wPHd-be}m)xRAd; zFRsvbTp4$u!vE|tfb4+!WX);fw!d21jZS-@o4!##1XR#i9blo+ZIeX^Vmzd2dpmiO z5727}oLm4$doA9WQPus zME_e8IThswY?oM5Q+Hz=Nv>np)znga2x6>fT$cc{y>;R`-|3Sy;wsl1e;Ptc?LNQ2 zKV8z_zHU=LSoYYCXA?f57KLkYr+f<@+|(YYyMnBc71IkvBCl2Ths>SA75TA6+V?5i zI$TI@&<4PRFRTYsr$Y zhb6wT82G%Fn`(V%jB%Pu0oE>sP?><2DjlS*pEgVsxfy|#1)s3F)6S=NfyYh0=SL7A z+=ilWx2!=aoHs`VI=Rn9hv*e#oxusP;$7YvH6S-TP%zVAeM{oQM|=GY+u`%WhMmnk zZEA+%BWLNxUB`X3CBRoFoEfjc(nftgOvfPx-j4e4%0c|P78eMEVJ^41zImj1C!4NH z2%|9$JC#DkNs5`3Gq}4d3~_}TPzsO>j>ZianAUkX*U%oY=<8s3Ja>fnTa`sSXT`<9 z_99efW3EJ;xq^S`&$37Qr%F;kgm-Cf7%%GnjK7_i~%B$+rWi zFircLdxy+2VM}vvgFK%fzI&_?eE(ZT6W?RS9_zK+AeZ9MeFJs{0(ckdY;X6fDwQd0 z>TXlOgJpV==bkl)-+VXq-oiccW+)(|^4mAEwYI$hx!v#cT>s|fD{p0Q&BuPZb=lov|xmx+QG%i%zQH@{96^ZMPmL!WxZX+KI z>Ffu2B3FOWyL*kT+|^PlG&(td2g4Zs8^c)F;AHw@4R!`~J_y{O9|aZZVPfd6-sQ6- zrnl}7aX?FHoH+ygF>(56i|wxkRILHJGM;vQy37M6K(&6zs$fsrY5mS5VJbdj*XccgCDA>EVqqoMX9IGD!B zzzGJfs`H;|M;FPoP*o{QnHDhj;NiB;h@>v6q>Lzn@R> zu^}hFD-UKI(N-aKi#$tY;bn}g^V)sZ?k}ow6Ga~tetxxWz{c9WIw(prNs&VcUi_G> zIHcA1T?AUM_V!fl+D36H)#mp3;RxW`ys%r~rXwUR*z&R`l`8jq|7g1G{0b=f?hJ1d zF3(m9%)$%6m@+4_^OgM|_Tv77+3hXjPRAcV7QPuLr3D32#Ug#WO5(QC z_0&vT6RYh(y+pxgiMrGeudx=RvbevNnGLQz^Q6R&S_enYMQ%36 z)tq)p!t!Hdk4c_+>~`1{VxC4mw65do?0c@8HFqb-|GQM)tvkHs<@s^@T<#Zg4J~jqzu7(S`mK%NZSsd_Li&evqU;de zTt!rfetRE>pu4xAb+wgIOkPrWJ?}orce{8EsiX2jzX>Crj_@~OJoNLVft6r|-2C@n z`QBVaRjvH|O(+Jg5oe$O(TJ`XZ_mYhf|YFA=0_*^#jC7O->d(?2flKi^-Vj{@x#x$ zg)vF6DfEU}kB=KJ~WTWge@8d<48-!6)D%W1-yumz(bd+E8TZMY4nAr>w-=Db zwtc0y`z-Uo``eCn5QVbbC0Q$SaKnb9wn>G|=|VLAm9Ln~S=h*F4U3KS8S?cowd>}O*p6v%v&|i$-=Tecl~7D=ncZrS3p0qnSR zLP31ntgGNcaF=mCyNfej8l%BC5L4w$7fYBp{-7;zUFsAsBi*g#MN>xA=bYNknL?zg z8hkBd&)m||%Odtc*$t&H2F6Sk99v>`5+-(4!1;>Yp+t_P?QPTR!$eAuQ!Y~_`Bx6r zA=wR3#A7kbdh*o8qnGL1c>L^`%)`y^8fNBQTC&_pq@k0|obhj%?c__rQ6)8p^-5Oz z0<)%tV{i)u01Ox6uONd&hET zs#O|<0^los57zu@cHj;D>jr`MyXXM@4K{)x*TK2IBpMg&u2vd763P#cI#j>iiQkPvir1fD@bDP|=>E_TJ zE%yTxN_ipo24x5u3^M19Viy@K;z5`On_ zDc}03YOA2VZ^NKqFrhP%lh5Xc!f*{DdGv}ZLiH^R^Bv^8idUcJ;E>SwF zqX2rqc-IO+?)K$_C4inJU}J^;Q>?!k@zuaK@DJJ6*^n>j?V1@! zUUA0dDT&qvG!+XaAJ?oQFru$jW`AiI}A9N`;+H*fVrkNW3p zc^7XFYBy7^b-dtHmz)i-Ol)H(k0yT**cpBh=ZI=X@Mc~c$l_?4K%V6bX4-+aPWVAV z>1LcpO?#_qiB%!_u2(ulY_>h}-4I=_ke>5L^jQIaVT`sfFn!X|C$it)>shgeOZu^N zMR5pws#b3Cv1#cNdXmRDSxqEBD2Tr?W-B-)N?Kh|tcltr$u-#xT<>v|RV|7U{(P2) zP=xq{(09u24(CUDj()z3pTvGqu~LTWjON;F_E|^!%3v2h+}kmz6_!#&L@sV?YwSZh z(6WdLa%_IjF$Ps&@0{}SUTaNNN=m(S<4O{gttS`G>BOgy1dT9TmEmF)b?;j&4r_dA zSy0Ko)z$u}@io2g`IYtUElUTaSdGJDJ^gNVuJ7spcUY~yrN|pAz5gt&B7nx5zfbpW!33ad2b>A!h&@g?t&%-Qg)0oN>gXmPP?wk3yQCW2 z{q8$_i(uhV7B|w=F!tmlWnn0%wQz;e^Zh!Lcd$yr0pouAy1AxgV}^&?QQfUq--cox z$aeWDQ-w^SB8Qd|q|8gDN_!`wB?kQ(#NXJq84jWeGIn2oA>A2-w3|tFGB4v zxu7mO6}Eh1hD;14K51&A=2XDAFzVqc3Az57^laxVXFDu6N{r)T6_Rgg%eqOxNTvad zi&u%w3M#yvlECtjZzdkhHS|TEL9p`ZE4vvdz?vmNNFI%Sn$HOuY&Lgng}5;Lw`hF+ zlLI0al6|3Fgyy}L6j`gG<&bkn=7rFLtM@-*Tu;)yRgp3`{0Q)*bF5J$r$TCi>!Riw zd-0206ruO|GHq8Ai%NkT*oHn8|SF^LsL=qjP z5hdSNByr>no@H`Fe=(T&Mj^ZB6{98UkZe6eIKUTH=Bbs#i|s`B#$2H5J~(*Z*O8dC z)r<)0@NRuAgg?I~_I21fq?`j~=570;i&qXXoA>&9H{7e1#sN{wrH!0fnK7%WxVdz1 z_AYRo;~by6Q~*g)hb|M`4*?pBaJZ8vuUhAD9-K^fRvESsFe@eQUNf$Y!I_j%I#==B z4ZdhNuZKyJ{itLD11obv84{u*!<-OpzUNCTDTpZ_@MTMP*6 zI$l+GR?DV}?(h5Pa84l$jv(pq1b%u= zmf?(^L<5LpkHU-=&&co=VN>Y#w+rRWVEcSwINQ|E>bR$Zbg519(nWYTbg|*<4c&2l zh?Oz)EhVdG@1aS)WgfZqkY9g6A5ITP2^UF9VY83XaW2;aCiOI~mb>q{N--Bb``*&#)$0m1I(-_sN6G7( z|70*?ekdoYUg#xL->111_jvq$X)5-#;#(-W3~tcxGlwVu zerBGx8rxyfg11#=(bvv-#uUaIg@fCWvv`K4%S4FRz?tI&X*AoC`@(krrpq37>+^+4 zSeskaN#m+yxkq$)?JJF3e~z|#B@=)<6gX{N@K zusb54H15(pZ7*I^OlGa;haJU$oE0O0&xPpWvUy*9{hH?t6Gnak6^1Ivz%|wkxC0S#y(8 zGQM#t9|z==7;}??!+WA1MJ8r1=K#>1^_E)*7E7fcgyz!;7jY_r^{J&4C5w(^VBG(` zoymsBc9d;CXX()h@WhYC=a=bzVaFzkB=<9+KU1O4 z|D;};YAfUb8xJR4$yX0NtmU#23gn97q;swY}mDZ~T?NoXW8D zd5p(mfBWtL9wEG3sAN;mzjk5q&D!cb>{P31MswGo%dg{&-&o20_`^jcNycV{#J(c) zLt&m{p`%H_61)XBFDOd*tnMAury_DcUafL?A+<#=O}-l*F8+hOYx_&Yn@8LA(hxT2 zE8;I~!{TfVDyygAH7QcAYsVg0bV2Sc&5XJMs}m|;6}qT@#G2@(k0XRZt}^Z`OO#E> z6WB{&lDQViH}4XK=elERFh=j0jFS)8ak2#bW;4H_pQL_4cNRy-v)hK6Lk47p;;G4` zHfi4Dq~b?cATA&?{RApC0ucq!7&Qi znD^$ZLV3f7AO2YrVsjf3wD9#tDY#h+TsDn5_dnlzWi8K=OEl`UXKAt35z$aGaYxC; z_$02s&+LR^jp?+?kB1&zsa=&Xr)eEv@XDBBK}DXQH=SRh>7x~{(Nbx*SCPZZcQbar zE53GdvEXn&ckv3Z!#ORQxOPau0U`({@9uZY-Y8%bD2;#Dx$=2G`vd>V-wfr@SZ6^% zJPb_HGWjOa_GFt6oS-|(4i=l?CBbA4wF1MClI^fs?WH&PQgKk^t|q-Csk)PPPT?j~ zO0|vEnz3z!JYD&&8g^#+wMxc-fPH(@RMd!q+NQE^HT3921se+=sd$g)_dF z9rvN?(cG-KEWhU_LvB{2>tm`}XSwdA+%u{>9+3GV+r;h^-^4z1p}(K`PzF4d7aq%E zO-7D%BdiFN<`X)riP<9YuB**L5+Ko5Biu#m5mvdz<#^`-Cfp)IRx|1ZUy!MRw!YR1 z`f7ZkPMJkj(>mQt$%_wHeppo);>FVCS%vDogIyZU3zK;xrD<_P9 zDQn`H(}u1Sygnu1IK*3&p1-R}DF>0n@ADw!h`OT~l(bXZNtVqe^K@z)LM3NlSQ z34$x+%v7b9cer~pY{1FIfS{95MbwRP=xM^0EesbLb{n6%q*w#Eb{u?X(gfQ9Q-s2V zPD6jQU82={+KjLp<_gMsptYU0oXWSlx6EKSRGwlID6xPeWIW1Y1i1Dcfy#-dyf4Oto^sC(@=u5sV zl~IZFbgIVH8tXPTL_a)hl}y!C!`zFQ$TLh^5 zSkIrn76?Wu#E(2Fmfjvj&Rkg{zP8%ckh7rtyXYtua4)#BV2bo3KfK|&26vwJY1 zA4!RxkIFWF7f!4aQc=*`&r~}n0qZ!-w!?~eyf$ckk+Yxet!WCnN@*_cqSqevIPojp zPe?ue+B6CYNLN6U5}SJ8Q7wvE*3&v;Qc;_&Ve5wxJSBLF(F|PsT;z$6Z&B074M;mY z4R>4Odf^A->YA{;b$rdqc76o#39B|3&--ay`K+4rNZE7I(|p^;sM%TC_K00J{?+^0 z_3vW3N;C}F7)Qmz$tY-*bwqGB92-n?$|fW>WQ5O;O_7$?xln!58S*ns$^j~gbs!l6 zZD^2^?E7?h+kw{f&)J~T`PTDVEWG7;fqj_Dbm@HJ{D}xAmzLuyJ;aSE`1*?8B3$2} z6+H2({OqAIoN+_x1MJgxSo4L_$xUWb2bwru7zg_hWHn?(vo4<_eG23k0$S7MXJGJ_ z>V~Gg$*lA7SUVBbwd8#+;4hK|R(n1w;P)HLHM_v};)|6Vf*7XnsOv;Ct{PQ7?rA<; zxj}<)l6xCpPz+7iu7`D-doN1H^V@3aTx zdq-4LY8|_QT)-=;mEq8Bjgd{CJeL6KzC43Ewv|B=*%}+KJe$_nZZm!9{aza!#b`)NA~!P@jv68dv@F8LtEj8= zyF63-BCEcTa*Ho-UDUf%)!mGM=j7BTFIcx^H&ewQ%-wa{uL?-57T;*$#G^wrp6c%Y zsXCC7>k$oFu@`S$N;!SSnYBZ#@oB$r7-}=bt^>QG7kE8u{F84^M?Hhqa8u65UR~~g z`t#H3?umN&Ix@e+=wDD?VGfM3^tGjCQQ=Xr`dDUl*|gPi8al6EG1H_s+qhELZNOn# zd_t6Pga4MaLCfxgyzw<#RqhxGbdV@EOW|p+0^NRn!HjTax0dWYJ|mn35p6 zzwT0h%L%pk55yNEmp16!mEXyoW*3qxDO%w%Xlg2jJJb`-i^GtQ_1{G^{`MhG=(lLb zJghdVn>-FT{|U+^`~B~b;Y+YL1Z~&e}l-5OWr^UcRo>49(g+S82+b8JZa1z z0nB0{NIuACg&>Nx%>tu8;itRbdEd+*s=5b3!_#*olY$#4$LxI2S>m*UU=>96YO0o% zeTcFYE%kaD-*ue#>hHF&i}QwHk%W!=1St z789s00v+nlQ_*g&o2A6Wwe>}MR>KqBHwb&X>rBOttS5OoCI1#I^Sn|DV)ovsU3_OOK*~GM@1%v5eZQ9DBy^*9VPNydseP|<2 z-oRw97Gqw?YO}2#&+oKgY7r=Uh&^R%$6uQsrkKnvc2Pi@%2Tj!V8k-&VRD~Q8(e&0 zdvzoHaqb?jbNnrf*t=W}aZqtZnrlIC*9!}SeU+O&{{J0UUjG#H9s*I9B=h4RQh|O@ zSZOq0$;1>L0xfHuIf_CGIBNRYi(f=k8sY+*8w#@x?I2!0=yTGRt%UzQ(DPr=RoVw# zZOXo+Nnz;5U}j9(qlBA62UC=`LQtvnSXNYyPEt~reAc4koKw-6naOWI1=#83ms+HH zpLYx{W7Tg2qcttK{M>KyS#X+Ed4!wGaAsQ!kb+N=7Y@jw`0p`)3ktnWSbAyTD+R39 z19-%ipS*KE`3Hvez6|#XM=eQTX7HyB07lPVcszsRkx)mtJEJH1>K!oLSGZ7DUi=t* zeCR(Ed|UyreDkERh{zMT;rh_$7$IvVuL>G5 zJ%)YfV7uhdwCz!ImADIeB>nEGx*oX9F0R1Zn2x+@A1NxcRMYW$g}YZ;77Y)rl5bkr z_1pxl>dPz;rw^#EL-j*^{s8SBEbJ(`hZkCEG9Ry&%C-vJ2x}` zXNbT3d~(pxt>mRzgLWvsxsX+9{(DtSwm01vf(2%zojsG*DpVycQ1OL(W)@y@l@3+A zQ@invoFQ)JMrbLhoPIi6y-Zz46TrFAgM^ve?2xm!{mx9Kpo{F<4uYmC7567H`ERls zAYr)|#_YY$D?mE3lb`)RFjObbPb8o0d05%hFH}#)ujusYnDK&f^W!XEM0=mZMX@x> zgw5sky^Z=J9t5+E$NMF*c6uf3XKRm4%T~nS(Nz1SM@bFt*E@DR$4&Z{R$5OzKQ*1! zhT~FTO4{B!NvV<_p8mmzN@b3!#Pl3z&7Rhj8DS{Ey{i3f5^BA#&Yrn~*z(-Ns7g_u z1#LDyNveGJG~;npmCpfw!F}J6-9AXF_jT`e)q|w$<^LN7*QKDsqpmtBjTq4VQ?`!Z zf*Az=9?W25v3Rzk9Ghv#1>C&K@*f~4t>1|AJiZ9RR;#P4KSGE@<-+2| z!eEY-uACsC1(61L6pGHt4Bo5U!!K#U!L_eaRVfFxR{BoFG&1Gmq?QU^o*K5lLQ@@LknkkN>W z?=Lb!4#!ukb{J>*(!~7z2ahwdx$!O90_-4gjIP4;GGjp{Kb0%%Fp&^A6TXKZyM|)-n-Sd@H5hYWp z1A8FR`ZntlLO&%7j4CpVfllyIWBIKEyxS8eDg2Cj4^c&;CjV~Y2Lw!~$sexRpMyOFw^T`sNaMt5Rvafg&&w~6sZfkpzm)9dFGqhM80>toZ$~N(M1o$NBC7kj@I&08TP5AtoGS0EN-GB^ozZee zW_w$~#`V69^I)9FWwgn_t$KWx<&u2}@8FBevag=L4P`+yl!ZdilHnb{;aJKEAd zN&DmwBJKQC~kY9iMrOawt~)X@T(R+4GOjAd$$09MLbP_+KI# zV!bLWH>)d9s*X=a>Nnji<^4~s5>lRC1m;>ebL$^OI@K?)p*-IxdqT&P1kY^AztqX-)?K*~1kA zNHMDqq5qGyuMVqf+ujxt>5^_ilm-FmmQuRAQ)1JwX_RhMx}`xnH{B(*$xU~6ZMr_> zoO?X?e)o6#pZ&~duC-T;HRfFJm}|V_B>}ojSu=M%#-e97dD#_Q31^{+BLB_ExKpP^ z`D9IvRaQN|)NX;X>s7Mj-Da{wf1F~4aP*L9J=9!`H-BaGCeby<fYkDQh?!Zemplh?u2+Twxpy1MUoEcUNDA&Kew zl6|V87hXi1K^PVb@eU*MnVY4&fgeds)z`GLdjxzMM=q{UM>O5LTR+d^w@Hj#r!pi< z<~QD6w1{7O8I0XHc^|9VBfA}CmOm&HIZ5j#NbW!jXHWmaBm9YgNlP!pFXiSq?h$ZK z`4QtkDQ9zss`|jTbW3gd^oO9|-w5N}LsNo3LDNKEgX zk>&qlsFp2n-D6v?l=%+in28KA|MFSm#l}{cmrk4phI9lnRVq^&emGU#fUJ^+!sLCo z%0g`RLuZBS5z|GsQVY)PJr_}=`JIM>-S`?lk0JG+)0%xkpyV<$dTi>83HMja+wE@ZfmaPBH@bj<={; zx2uYB`3EhI&)~Qi`hU^l{(WcgSG;|QUokK#uKp-S^0%5z_pV9%US03gaQ1_168OpG z(gc1UIDAnVAHr}ONSx&UC~g+%UsMeX&;Kb`wAmP9T2R^s$E8u%+vec|Yi?=V-l<}j zWLa2M`IJCHsj3XrFsw7H6Vf`6RcNxvbqID+^R+h^x9QUc-n-sDANJ{JPf8PE;ZJF& zEbS4{+B3I{mc0WKpS-`gUg*8+u_{vUU){T2ulfbO_D^Gl@pzZH@;efc z?SId;q+LgTh!t>-wXHgTaijm@o>NfbV+6w|m0?O>%bLB@r616+9cpX4B_{cOP@l(Y zc#no3zeRpsyPC$wcqg-}KIw#-<~6%N3SJ_Rw6qcOk0denbZeFRQF+E$Rkjmz0kd?>DV0F6|GUHiii|boF&5SlC}dhxf{z2~y9eKCD%xdQ?~$ z6i>tfQkd}{ipd2DsKZOSsjxcFUP6Ebe<^xq@xNnS&aUp?8|CqCX1kiuule&gS%o$~ zEc8;UCphmA&q$xS2^UN`RyaM&$IBP|Li<=K4QGkXnSvDAc1e>*OwTet6eL(*m%8O@ zde;~~IS>x=_HFwp;Ury3DC?f~S$zT{IVYt?7Q> zD0o3H0&Hr6kAh!n56Pf@cj&46Zf79Cfd4&};%l6s(4p!;<5z?|A69x_k49=a>oc;- z`d@IXnEue}d82wbg-+p;@`S1ho$tt?*{XH2aMsE!WHw66Ic91%9|Lbi{vFr*o`Y8* zXKWpr8==n&iey7b<{HX6F`xrBRm5w%%aBAYFzp5xEGg|I_`%w{l2x@y5|=kc zdL#l|B(p$&`O&u4Jc^O9p8o9zH$0V&__zVK3ygESc`@rKfF}|n_oKv9I4h(MeNUfb zaR>4N^e!6Xy8^t#0G*(!AiZFYJ$8I*4=h69lN3e(s-r zt~wu)#Hr9JtMi1VKNU+{;gUq_BV%A%k`{rDlGE5)q1-LBRU1~}J=&5{dh|xPGH{A?_S0Z!!S@{CY0|LrW9YXp#DKP`ZTrx5h%7k^n(>S)1eBt) z?MhazcpOZrrNh_6Te>{JFftn@L;4hLVq9=Uq42kv}$}` zY3f@e;-2agOSRMl@{J!Hz9vS>e5zDA?4dYVgpX{Le2Ba_n-Ni zw8y4s9XW`}S`jpMb4J;2Po8Yh6v!GYNhW*5K7aEfB9F>(R(-R!7m)wkwVxDI`IYsv z|91F?KhK$X*!9MVccz7Ef{RQ&kS>l`zGwYrs(DxQuj&X_VWj9nvW?_#UNk~izMiqW z{;|8iy9n#=1{jW%oSWYG!C**A5Wr%^M+C_+L2x}n)u(pp0Y2R{dWOg8+4|Div$Lxq zeH?z8H`dH^hAh*r^G@CuzlT!ZCkgFqO%kdROKSF{5PwWroav?mzU+!V>HhU>;>jG0V1TwEFB?YY2W67mB$Lgu=>aP)Mz!A&XeeQZpWa z)g!HQluwPVgp&ZS`?KussQ_0m<;3NkTLQNcw+~aqrf2sXQrp?vC$qhfRqZc}mY1LQ zX;ZKlVe$}fufMg22orzrp6!@GG@0B9zwkQfitpuXqiq6KUFc-=OkR49T>e~re$prE z9sEa4lb;G-fN4Qz`^~h-fac8Ps>3%lyS36x@id}uF{v`UVe-`aMI9|o(}PIdENhZ^ zg^Ku22H`i5p@Wk1>8$ZHmnaRVquPRuccPGQ1rx1%pPvXZR$m{$_~K%~#>k@yPxuie zwb78GGq2-hM=TH!>&cuB6yYpD*bQY{V8~u=bm1#%Wdol-fr%jZhgq|E_gYqO4y}4Y z=($HYGY+_z?~56_>xX`#)cjGOjju7j>geI}=$IMW?IHSHb%7AOhG^7j#j*>ucz%} zG_27`X#rF%`U)+)jJy44D{_d%UV>HECAaj>*Kk}$ElVw?*CQ3l)}6<5>l};UsajwX zv18e}*@XpjF?<`&9p8<}_}GG;WT6wqime(|OTI$U;5_?N;-V&rm8a1q$lKxLL)%+` zc8Z4CeWbbnpb!l-!Rk);4!)Y8(b&e`Lv{)Gz(}s*eMcEFX0`9ML0?bIxHjQMr*Mn* z9Mcrd`{_+?+ptX7nYfn1$Dr4kk@9^ZP7(@@7do%)(&eqS54In1nAqfZ0hHcE{eEg( zPznj6Rh_rEz7~68i1DIh(6m8)Qm&C}Kb-vKXEei6e64f*U`+ksuXx9o&E${Jci!IO zs+9yK!p$!n3gur_*_7Xo6te==j~HKNtciw5k1{RNjqXlaOmDz6$WPvth36f4nOLHu z>EjK^?YI1JpYv|HdAhxtcVrH`*ZedkYpygD2tIVysQ%8nJp{>LyDCySRwJRHb^B%_ zYjQw%m>!?)F(VK_Q{M{kpJvV;z>Uf)?xAy~7z5Wp1&cjT<;L8!Qewx`p4KhfD;ILO z*{8V_%aov*&DjOt=6#J$eWM6u3sp#f=z(Uq$G3Ka)siVlS%WZl&-B>>8Ibdr!%Gud z(VsPCEi+9fl0+aWl|9!!%xJz_UfybQ9dhn|dL_^=cZ-^j9+m zq{E}y(t+g zorPYP8kK2FMw&+x!rPdGgsNY*4UgpO3uh{8uc-G_fVzaUiV`k{AL?)+)HFSs6d!~A zw+zl6DH*X9<2l+ZBNbl3@DG4sUz*@*!9F+)LtYCYOdQ5*BkVEf+8}+0B=KZZb1CP| zl%6xyjZa(jG8FcrH|J`8lwqr$iI?AjuFEq!VyHQcV5X$}AO%{m(i3-5xDlSLa6z4cMAtFc*k5m{SpVjgY*x@OLEk@VZrkqgG+2kC^39~T z;+H2Y6lCrO=WadgDaDrTd~AL(Xm_HC5h&j8Zu7Wziarte92JZjU`rt;^DMY5FQ(c3 zgh*8ByK2+T&m}%MY-wQK&L42w!(tjRjgUSP%a477Kta6)`GC|RvxNNtwtG~A;;p)O z=7hQKlgSvY$KjUm$_&qhFB`a6>BO*ODWc;tqrS2(7&Ddg67G>Q0)L8I_(21)*?y#% zQ+q|wLQypRbQYaUR2uj!qrsOfa`_aM^jqR;ygqv)$Qz!P>S3P2&DQ3r&+pVB@PtF5 zb0cip&&RWIN!l94NnAse&^OU;QU+BLzRMp@Vp*bv{eb0<@OSXL!T!Kd8#&4_kV7~9 zUKKBQLRWT^O?sg;;?1LMW?qi;E3o5T>)KGif;u~?R@fHbFlj@ZEqifqZc2Kpkr$J+ z63}j)m%B}y2+o`(o7^s7sgPjsn6JNAb-a2?%5@B%3%126U{_*`wMt@bjzvBhb{r?l zqqX72K*xSkHJ0UZHi3)9C-X#yPr>n@ym-z4v&#(UKd{KcvvRbTyKfCVt2-`U+P$JC zYc*j%+all#oPAgCg6wr^xGFhX?{oISIv($6Q&MOwSInEd`@qHEHO^5+r3ENKIw#$2jg52$O5(bWgZOxx=Ic(C3VdzY^Z~k(@%}G;GORC)NaB1UC@8C z3kxF#-#}_tOjaArGzOl{f^>3@xSLk!f~>)Qq18!gtzbvb-Ju5jn1v;LJXq%I_G*4_ zE;l}MIFwG(B#QkM0A&!rK6BI!}RDemB+YF!beFP7rJ{>Eym5g4`U@5Co5g2iX|lxcJbfjufZB& z0yXH;xCrQbPVBJ8IezL%EvM{YiFAGuHlHbv0~}Cb>sS1|!X-)2H8YcBOtciY$mvJW zJDMR7@y_J_{s!;;2eSN;CA>x*ZNi9{wGU=dxzD}PaZtkntwj15n=&4@hx7iC>)rp8 zA6}$`<>Va9^i|yf?Hz~zf+P!klx<(XZ8Lj2vj-Z2A!3=J4(DAe@kcugRJ0O{t?oB> z{;Qhnk4!#Rmocq=)OLMaXY_-cTEMsl=yt@gtOS{SRhD8o^wO?)&D7N~T2+LseF0g=cdI=}} zv^?G+TPj}SBry#PPauc`>I~SE|)3zHV6EG8b9gWxABOfaA1w zd$RGf{uW%Mwz)R;FV?SxnfVMtYeOt?m0h=N+)nn_4tR_RZT7q#p>6~DgM3N`&P)X~ zi$qi$!#c}Izw6J}6G=yo$ofCN0^Z~M2#px`3$tdZoN>&)sJxD^b&z;bn+a3-K8rH5 zSh*!PrZ*Wq**udJ=%p7{p8{HfD9eZ#IwgGDMg&h237b>71+Cr%im@wnXcaDD}BI)jq-Xg1Gn9nV$zHa{Ze%{l5xJB(bRyfH3&3cQGD6Z@-7+G70=vM zTd{3>G1sFsCVTlE0lT|V7}}=zc?p9v)2X4Y)A-rf>GMg>T24YGZ!gCU5eZc18E%Q} zsE8m_C;4*u>93`A)hi)hQ7Ino#HRAWbyUR+GuBh2LZ4oc7;b$zUBN!RHnB`KR+uo4 zkM`M`W5OD&lTJ`6!X*G2MLAHFJO=c#?RLgw?~1|m1^H@v7AxUuflr^IJu#2|PWGyJ z{bi|Bm)YtKHZPpjMFjm(N(3XzSQ~yGYW&z&zoV#gJVu4wf z!||cZ)|z2aqIj%|1cx|Skwd)3id0+U^x7n7Ki!>?PjM-412#iVq(m; zNl@(%Qb{t4RZ{^1Sw<_tGi=HE=;3S6>ue8kiG-**I9D@lJjpXL%enS`kWl%6aah)w znczBD z2*q7r+IWWaJW~Jq^KjmxSH|tSWN)l9F1GF0)OcOA`u9Ovtw>kay0&>P#|&^@#|tmI zA5oxuR}ejD>3Ztfq=3rSxf@utx=k65T;rXA{-{2R7KE-uva*02K#BW}Smu$+~ms32jT z$4gnV=GY?4oVj1|4&T7bl{UdD?d+XXoc3kt>5Mr;?4I`%toEsQ87^M4=&OiX498Ya z%!}=x@M6r8AU5W_vp`*9#)RV9o_F(gc*tWT9y>AdKRb`F5;03L^YChJXaM59ANNvl zuk{AAyqs5b<8`rCKfgn6IWnR_-^P@#huBwqP#L$FuD@X*45HB*{mq+z61TT=^VapZrMUq5R_p6Xaa}Ab7TBW)7LS%E*1% z1%aYwDj^q^vmq^g_k`yKXB!cQHfB9gHsP?fU)o0h3b`420Tl93lSolovZ43JudtZ1 zOLhn%@X9}9%H)1|fn?Zq=&$hkYi`dMrEoqP>toD|xtcR}1dQURKJ+Y58sQOi&RWnF zv~8i;t)%&*A_nTCHgt0De2chN)R`q0G}h~@DD`6Xc6H2KKV~iRa++)Zs*+|n60rkZ z;`;PuI(mCpU`hM4$Bcs-XcKw{a~Act9=o?=7-g5OPM0Xiam}jrkVEyS(D*Q9SflJ0 z;zVFv7F*`7w=44vwA|?5Giu?3=%T4z-{LrsDg}Ipr{Q0ri{wgaB??tf4zB9-!P{u+ zzbHNa#@*xcnHRDS6$+JJZ((;C6y)Rr7QotS_J5v!=A!+gY4>P>6+(eGcbK%08t3sA zERTHMO@qv~Hi<3@v?B#b@9{_S^*80hKo|WJVc{#S*x8CM%sBqbzn?coz`BFL?20A8z=?v`>ph z_WG4YoPBI9CTPrQ8|Q*S>ny7fE>YA?(`~Tm9o1Y>rPJ*E&?W4a`KIp<&! zt#6l9qpP=adVkWjD&UzI3VGW}W|G`ra7)aH&;7xvY0nq*Ky zc7t-=8P@sB#t)Mo(thT_sd*9Uu$(hNAMNXrg^z|EtGC{K0@=1xI+;;Yn7nI+;D@h)2wzItR6b!W|^b zY+0H6!ozAZ=fo;f=r<@iSi-UJM&JJ?`}#z#Iv7{@~joS`9@?JSCy*f?!b{88xJsCb< z?OTd|p2Kbwo71A~=nr9;AHDhCld+Uim;!m;nMchC)R|OPpNwr{<vbXFd_cEJ9hG-%kw7 zb&Z7bj4aCz>`~{jHveLmoMF*+Dv5#nJueq}JfU2%Q_HwWqU8zsuzo|XE^irh35A*Lm(vb5XAAor zecfLHmRHJg@h!L?Ld;+d+g7}jX7rVM0nXFwAM<|I;A^H! zD>)VpvIO*o#g+?L2os$P*ts-8Qx^!4r!j z6N23Oye7n_7xMSrq+Y;~Ki zx8&*i#LOVc@P%mF(Q%&8Tm8uRmOMg6^diFhWe2OCUmz6ZCGtLnX(U+T6e#Nx6bfK$&LlHcI{@MEYdBUhd zCT6whkSqdf2&B=@_KPV9?RMzGabiq#dHZ$w=^De{ch+?`Y~Cz^-aB65sk@!ajINrs zsilF{)=Zw$(yP*#mmOGT%`yQ^U{3bDkix_2`D)L_t#Hy)%Fjt;5j=P?e5Ehszn+6a zJDR#wZRYlpE2Cug4ND~$8!vf^rTn;=a2$1Lx9XKfUGj2|739~m(g!3(lVgMbtqrM> zO%FMjE6P&(zp_FY=@8lku^TR5Uihj#v8Bm^Yr#`KDBTpes3}UyhO1O6$1I#n6#g1- zlJHc9#?eL>7GKK_uNdpjzptF)xS*Stjs+b251MK`Jb1-d#3yymZ-e0^j5yVz{G1~m z+waiR(Mv9bz3)QHD>RMs>lrR%Qz0+v9KOUP>a8LHa)-8V0MGy%TaziviIqe(yJZzv z{Tkzua+;|{!Ap*c+lJd``4I%L9(PC=3+>|H<351YZdfn%<~U3|9x+*T)D5P>|C0;* z*}UV?`mN0IE+~fa4@H)rWsVX2ve4#`E1vMbAp|SHbv&dQ5-YYeP38u&x~vFDBNsvQBO->hjCQ1KU5z= z6cwizf@Bf?{f$mqC%)u>`9N)8=G}tt*DIXhs2PJm0@XFG#8PdWtd)(p>L!+NkyG9L z(M}&+=crOn2SS}Yqhyt43V@1LF15?lsYE5GYD~alQ>5!lRq9t%%#jL9RVzo}bGYL} zBlcGZEEaQqcf3mfYT@L6*u3q%e(=s`i}obWzYOAfZx96U*IJDAUBvp>LRu1m_<`u@ z->QEk^A^!fhc8Uql0Pfx5$|iSkUtkiK{z7+W*_GZ{b$+yfGdn)`=$|hJYct6x>$H& zp`EU^Tw3$g04>k!aZ~1IU0teAq1Vh)Lm;aU;ivqE z?z;vCz?8{`P9XTqqw2yTN7>cN=&Jd2J0E0wisOdkB4QPQk*flOI$1}Z~39z9a=jloF^*iS)%!>`rt_H~zSlD7btJpCCCh0%Mo95vdB9)4K!SO3niML(h}FNvF8HH4c0{ z{hUYuvsF_aLMrLcggK9nv-7n{N&ngK397w5aecteHt(MQc%dz$ZKD8So;kM{y_hHj zUHZD2_SLN6hZ_#XhkVVFxymCt#XE3s(?8co{1-cwy)LL8(tqFGzsd)URV8oaS2xz=F;Lczjt>|M;KAl3qmPJWEArBED?wF(>6%-w!#$idBm>o0 zoH~=ur?}DDHu3Sx&+(*mOsUhQJ4--Jz{OJ>Ts2K4^{8f| z5gsa|81NVWo~hH+)1ucPYEUJ&k)&qL?B;7ERcpf!!sDS%WbL0uNDn;wEX$4$W3+?+?`J7^Cgp{IB-%R@t|p*z~M( z1)28O`jir(GL;JGdT2ApT{eC0dX*Aqz%rw7oGO)84>aa08;XBG9B#JDTiSokZFv0% zHYD_M>+{bGrh`Tr-&O`l;LBSgZD4IB7=W2e9d zxaW|9l)L1++Y_XH9m2`7*T#GWC`_#k`b^GRv;NLQP_w!pqMkW7j5+{o@qC5}I5+aW z)WQlMWlmb#sQ7@BZj#gAhp2T?p-p|84u1T;X1i(xKx?gNcFEoyxR=*FE90E*e&C5~ znwT>^@yu>Dxt$z;@l^2+=cqJDR*IQ`G4BGHEjI@=_Any*Z<3|2u^+1U!=Um( z(oFwq-g+y9@1NtyVaurh^|^*W@%!8`gx}|_H%Mk)ri%I=spuwD;>dG>-o6o7@kzm- zQ!>2Tj&jvVae6ZhT$Jb|f>-5Bd1+(BJN{m$@ien9bmpvLzQbpw?2B0X&aOIiohL6d zYDy)#kVU@S*(P9SKwSO8$Z%Y@sL&XYU$}dA?7`}##B<4xx;r!{UT3fBH(y!-By3E% zu)NwFRoSe`+O?m)G7X@6Vt9w6V4WUBLkZF}zl~>(8ZRo~cHxrTZ}lSmN7r{T4}1_e z#Y}#c-u5e~p3QpT9^GmPy2ZV87sb#{z!&j*E;JP8W?rN17>7xFMGzRcK}=>zOv2#& z0tt6ckDZg@t!MIoO?rOlEFlr@F1|{EYV)d@Sy&X7@r8ePt}pM5sp=?bv9v@RftRJW zZ78ECvb6Q81$9nF_cKHA_xB~l4#$`~0rjjwHZ@jx|z;c{dX7TiIe`IJyft zDsLAi_3rDZQ7f)&K;$Aha}1|TE!N1 zB|*HvZQEH>uC8#Qo#cI?*5ozRGFNcU1YK|W_o3-uH;LDN6Jq7(0E@i)1)1Gdu%0eG z=iQCmDFiuH!Z!qaNwlcQr)A+`@@dfSW`T#gPDVGysDmJ))D#0d@E3rxNTVMhL_~z_ z$2O&Ve(nQF|46{*molL$!o|!XHDn2SYQr#?F=cW)`xZ;Ay35z?#oid^d&4fADdJtd zW^N<9=G{1Pje<6kO_s`vu!1~o|MVk%Th>#_2v(PcP>ty2lPCt0vytBQglg%AqYqpj zT16$zL~HH_`vr9F3r|@gI7Np+s`T;Qx~s2cZs@Qh(+E{ZC=1)gXN(6pf!`To??Mz` zlX2|pO6gfcuJLY<<^H80>;lmE5O4@;Z9e}~sS-IpVUn{4WW#t?cOJ zsncX*I_@H$7{xv;ep03zJEID!J=UO(qpEuelGBi`#HrD z*RjyrEBjZ77q7@+gydkNZh6R)vG)Bdo9?HJb@_r0xT%e0B7!v)V;%74jDWn|)hbo- zHwkzHgH=N_>lO5~Z3x0rgO%o%H!ioI6Ra~%=6cdLcDZeNs&Wj+@h8+Zsk*jP81}3b zv+PqpI6LyXCV4XAxcSpv>jmj59hTkO{vlt+RrOhRqrwz}6>#-{Lu_dHu}T#3%=~3#QrUXTry0&q5@%h`Prx0! zoLu$7R6!D&TCGX{tx@_$|MtQ2M4S~6NdFY`6ud#XH)Qn@o5^^x%=TMQR(9bxM)Q^> zF{EImDN)Bo`}67|-WhDl6H~2shH@(IymhU3B8WKr0?YHp^Vm!4S$Y(5u z$Y=FO;B2{1p|i@A_6|u8T#%kjn@^~^5LX!!L|mk7o$M6$M@L+UPDj-JtkLo4Q0YMI z4`vg{|K*C*NSg82TO#p4N=?W{}ga=_mofHw8nO1dEKo=WF1#sOxr zPna1LOLS0MfAWY+-mT}6Z7*3J;z>li9_17;POzGQyXbvhp6Hr&vD=dwazwl7P=W1m z_y(L?c(`>q=Yyt>_E^w7<$=C8fotW*WBFO1@T3M?SxH}akdWGj5FNGWcI0pw^9EJ- z?4`mAE_Fm2Jm|zY6c%-qdPrEKPQu6Q5D#{Y8GZ(pMOLR~17g2Gt3%=*- zzV3v5MI6SpMIL$kg${+2CkzKH1y)loK(p`K=wvRBaEjhaIr}kPL*`$<_ab$}YTx~S zHW@Jv@2Sz85vk;h#LRkdtLHM~ywJnE6sX|h}l#(vO$3C{nz z8Lf@5Idj|%USiU~*9&JifmpbC1v6j9O?WB%AlULItl`;{l=uJkmBBwkNlt_IdgtI9n5XL2wWirYiz|OHV+M zhF#9x@s`&;vS7KMsNqg&$E*#)*_SEJJn}k3T3g<{3PF=7Uy{e}C;M$x8LNC|;}4tt zUwl}~KHmMwyYOkw|GILH`xs#T=Lc;V?w06m$e%!WJ|e6wM#|h3hTAcu=yXuWLhj2Y zyk**w=td>OTc#5(_n8##*(dEvbvPpJ@i)(#W_Kvn&)LagTCR~7mhy@2VYk&^k0;A~ zjHCO=Z?A&@3FWmoyy7W$-d!l-rSsB7P9*S4pRX#gf7Kv zUFwBfzzx?)v7D5Dg7XUL^<>ZsD2r+m&q+-0{t|Xy*Vau4;&nV*K&#ik2Q~h>Ikonn zSOxPKf?-|$t564;0>+cp*C=-+-+1~kUullAza`HNdm@^+_j5g-11VZ%go5H)hpfAl zK+%~23D+n-Y(TlYxNT5Q2WM4T{-69rTjyXLZF}ap;G$PmRFV`{G(_~gnNtVQO<&6I ziu;LjxE&#a>@V%PBB6vHsa3WgPCb(+24Wke~+b5bMSJIkP7}z5f6Dxn5`dX#x00NlA9U z!rgF%hblU$?1O|Rh>=f*GW^8!o;<^DsK|+#Rs<2GJp<^_w%cF7CTWN|5MNmkdlEMz z5t|ZO`frxe`8%Ce+R2jO8`*2dlu|K2WTd2>0)%z((TOF!{3#WJdUc0-VY3k~cJ|WN zIVBQS50k~QX=Y1Byogh-#+oywsmPt3pd-i$eP3seTT<3~Ocfa5)o|5l@EWR1PL^=q zjvaX#ld#X~d(=p?4eOp1ZT*+RLtd+Bzg3^ut2+8S6=QOq-nr&}K41`bs*;XPzNv`c zt~r}IwewZZ zh-nwS#UHc4AWvRKAC6T;z9oN2c_AsdU;FNY>w@FKt`|=4X#~!APOJ|@3D|Sx7FNVX ziOEX42(yY$8wp!y&VP`^@XKGe!_Y~2R5kOe7;7~hA1m*y+n$|P`Z%-AcR^%N<^;MD z?19Klp4-3#{(6DX$;)X1F|s~sg8>cGX}YJ{UP$V1O8c-QyBIj`B=CAP6(Nu326{mM z!AFn3ty8xj^V_&2%2yMU`;&UG0>=I8$949jMfWoWk`1K_PeBqTA={-Ct)dsH#c+j9 zQX++CYl4w)INmR2X2A%(dGgJXIKV;Xn&_XtPE^pyGwo9|ctdzln7c^1svtcL4MLv? zAP~BOaiKS^=qhUZ!JmxnLg_(e1nVx6QUxBVML%CCyICYXQ>Q^=6Mm(;B_+}D9A`W! z45^G7Ov&3B+lAXht`VPf?~p`+U-eaaqAdgr!7^Ir{U-LB3Kyo=-WO^OwnHtw1g|FXd%vVZ{Z*u&n6%#Y$f{o=I zG~mVIzxYH(z_{krY^VG;MV=<@9E#lbJbK(pn^7c*F$_&LZ71d^guQ1@S*D4a z6K#75*xAcL!1gLf!C)H5s}`h?n9W*hUN_Bvto@!!?Jm_W#x*Cu(E%PnJwHPEYR)k} z-)oMR*OuC3h5O9sr$5K52(>xT*eb$wuUZ$PRl8<=;eXV4*?I8@Xu7KW*UR=dG8e25 zUqz6Y7=!;h593eL-_5PepPO{cjZIyK`fQW0{zn7&TJ@*W^^=uZeou-&g4ZG(Xca(s zalBWCXTNU*2|C!b`O#8bJXh8fw9?g|lg z3c4P7^J5e_TD~y@c?Flvu75EW7(DDNW2EDrbM7w7EK&aKedL+qB@A$GXupiUQ54;4 z2vuT#Q`{A;POFVpR?^M>ll2_z0a}YgumwsLjk!T{6xM4OUGEdPsre;W*diu5Andte z!63i&B22m;jak>#W3Hi2Cj0sN90iRivEgM?C{oSD6j)JR=UpdQ)kQa>U@`Gbt7oc= z!)5-{dI<5Az^e0|n84yC+PLLRqIwp|oVTg&9NF{K?i87giG(w^OSm(U{+C8E-8aGN zd!{pItGm00Yk~^Ho+Qfk#UHcIF6f1)>seDl9!)s=>DKFf^A*8$U{HrVf@e2qWh{xn0VHKwO?o#-lIx^?9qzs#JKe9hC?;|XD#`|yCBc3iIB zlqloylzuT0B&}4G=8|7so?!acfTXGA#&Y(`p`xvhn|7S~sOs36?E2=YDx`;vWsaM0 z9>TL12?98LPjjZqf9K%FnkYM0HI(PS=;(aE$_4ngn$J;?iVJ3=fCcKd5>J8+(hx6Pv`y(Z3&Kwi@AphdG- zhi2`?iKG-Whvs?UCC*Q%bG~DMH!Z*mo66 zzq(XSb=*j}wYu_|9hpDb5#l%j2?!5r-|P-N=C!)<0|rs$@!^9SAXXb*5(fULG+$g| zacp=l$CL9mYVVY`=e6%j`KE`YuclLnoM$fS?n(j4;&qqPDL9+iH@jeW-um1AQ-8nP zjs{&G2cf$!qq_UXb`wQ|9+wLk)K!RKcbx=>dUrpZldMhUd-a4PP6*G|K@F z@uM~LyO{vk5_a9Xp}u+f9ab}GePf`j7#)f;g_w0N^Z`j;t7eCsR+t$%DaTzP;-`v0 z@L3){Rz)3p&Zz0xi#o5=nG&y5_ZOdWe>BP7{am1fMH&KR;QmSZX;PX9;qgIrwCk4e z4o$QjVWi0BSe$f;`4R&0+nVzm-L#y6fg-wV;jkZs!uVd#ZuL9k)V-#R`=1&NetrwH zU*h}3Zc1}_?#XB8Cu7gE&)7tW)tgaRxQ`^dSX{M-z63&w8C;%9?_*=9wji%3j-PhF zB0qRWUFT2LqdSNrUdd^{npWppK1OnewfA8={EP!iVpr6T%sbA)NJKlUk+)Y(dy++W zn;=;9?qK~rU^9gs&8*hT{mRIa8M9yN&`heGYW}%ud$FwK0J|HaW|=n^fS^1ferY5w zP_|L1C{Q<*J;^OsIp@rbf}iVQUn7LnPytM`ROLPK!%cULRCgb(FKO<>BC#Z-?w8-S zdV^(ee(PlRV95|Ves9vbG~S{fGsynon^y1TDdJ?_X%De|!@B?Z3eie%==KOce8cM|SOHbA(c$t4dOFWGw_s6s34gRbmQVlw33OAa(+zF& z_p@;CI)hz@J=r@jm5u7hGaDT`bg{Z|2s(3!Jx5~ZmgR%`_QL`mPKL6mD08KFnn%#o zYu4p_)(H=a%b4E~L@@x8q8sK0Dp4HqHL+oF}`HlacE+j$4wd*KD7(zC>I? zQBJu=_Pq2$dZ_ajPC~&t{gpQ(jletE4@4EFcMkLAUJ}kIuDT&NC=U;-JC6V5-dW^@ z$Z@;{w=j~mO?RLA2ckD}MaCXiMprq2tXEyyn=Tam7f%828}p|*HR-=5RW;E_J2uK6 zQ%7Vg0V;xUN{+70$Y^YIJb1+Pl1LK|EZsmDdk7EbKv| z`9ps!vli8yRGp_u%d}NN^_*+$HGX?k>UI26uP&H}`qII;Xy>{bTK_?!MOQs=ao5zdk!w z}L%AC~+&$fQ{ptemreJ zsxf-3<*Zpu8La2CIV??#A-<6#-*K@JkxlMv^CWFxwT%F)uq7;FO{DFx7W@n}eQ;z* z>2v+|`qct2B5#H35MIiBfLFozTsw05)Ir}yS1Q896vNa3>+sq_XpjAb^^b$bW1CJi z_a@Jkv^7ht*Btm!b9QksHxUwfCVPiHg7w)4jov>O_Ijbk%;B}1r5vWV`*C;uD^bA# zloysk&6MkM|E){~UCl``^X!(HW@NnW57q85*-)=@GU$Nu_=er1tGKH*T)Nul+<|(P;%ywd_EIwzVdG~E zh?sYO++|Z)50Buje0m`hV6LNxV&%Cb@}>_mMt+E}9Jx2}0ivccu2>DWszkSHOqz+# zw{)X>l^@P5<2cGmEKT5FnFb6W!WUnQj`2pVV_)VH$HSG68=$H;M%p*^FRTO#9?8yy z1CJv-(ti{UT;G|sWD5iJ2DV-<`Ifr|9-S72z)8Ag)@8Qm6qyF2!5Si(iKX!7G7ge)t8Z%0xTNUf+vWGW1IDE4N64KTtTs$>wWeJRz5VM9Bjtv5 z*INJAw<#w$DYE%CnU*B1=DlyVCJ6%3LcecS$~2V31NDrx0H~-+e~qj6izY1=nqR-V z$*ewMD2wEDC>57H5_q54Z5Qv283=xev6(yGJoSw3+`1UKx8KXW$YA&X2B2!g%aual zFQ7S8O`_{$Er$R@wv~eTw^c~_)OWK~1BPb0H4)5^s{OoYeB{kI#hxglmzVH`>Y4+lZoj*zCLj0TE9&>g}{O4OwNvAs?0786RpGIOr*9ZA^_aV7*Sz#suWX8?J_ zNn^s;m1NTnH$T!a%=eJC@U(7WQtK^CHGL)3cC>h5)U+}Km^f>H6g_Dh;mOmd<6{@Zr}F0fWxYbhuO%ELX61Qf(>w2?=Q zz`x?uo@t4#anx!FTedZAse9+z(x=>+b&&fHQS!&;vyZ|=&Z5S>JF4kXGT&-ph`5m+ z#mcT(1meaWkZ2i0p4cUuS=&CNBZ(C*X3iNhC+!ok49|ezFB=<675KF>m`e*myV4j} zR<~`#tQ+3KXmKD^_^tupb@+v4+4lKoaR@2v|GmmLEd9{6Yjnk7mmS5QtXwIX?dOqf zd1x5}4FgKK*S>~Ru%U?L>{!n7BpT#nKXeLk%LAs&euPR;m0Og@)2<{%R21Isw0buP zdFIYmOP|2iiEEud7;jUKUKLn9M}QwHaz_K+6i|KGIPz6Vrr3exy-utPPTw0yr+a4o zsvo22f0eqQd7w0rWc*XHW2vX#=A@~gm|+k&;4Jz48nreof4tw+E^h;=FB91Ln-=SE^w%Pp| z<8w28UG+OWXoHhpTVJM@hMj4ma%uB^>{@EgmmWUbfP@C^KO93!rzFTYLjK~B>x%n7 ze6>;5#N%)G_AI$I+d_;;`YgW+$~r)e5e953Q-Qu94hP;jV$qI8Gpg0ER1C4Z+Z)cJ`-ivJ%s+dR3>+k! zR~&0RBr>f+^V$A;CyPJEfb;8Hw3rme@zF}c{SKcJ{&=b6F?qrR_E+08kqMS2{cX&~ zxZB{9Gdn9V-twMiwbU*^Z%@d{IxqX7F=A52baP3!(_B&0Cj6>GU zKV97F1fXX&n4$19=?3UCTl{o;reMuwn9IIP+#rY+Clg|^WmTDN^A^G^c^QO;NxOiP zW(~+hu2$rwH&2?72?XuNv7Es?vH_|O(SBCe)W|p4HNZmAtgHuHnb_VXCrrS94;^AY z@w)}Om^RtAauxrd+&l7Q0tVy%GK_ZKiZ-O8?oU%83Y3rZ<}d{r4ovRf)4wxhILdJX zi6e_0;144D4G?T2N2#*&v0peI2X2ekP9GYlV`@GveHois6%{^EaLaP-SkYeD__(4J z6U^&*jqaPo>m?~N&8V9<6ASZu{S6oGJAtY$GJ)1Eb?@VUyEeriU4tt8=1!4>yw8>0 zQKYEupChh|8uR5_O6-AGuC(s`vaxA|=uV<)jn!E;`OE!dFKMvGb;h0Jb|iTL!U~?R)J958jd43cAIDCW4|9Hx zHMYmpPe0{t%pNE2;t^?k*R#be6dnILH~#b`&>2pTeZ0lo zDL{qtmVe;pGB;rK_5d#@*&DN37qGEBn_SVG|`NWCGqP~ z#A|wg-_i!x`(B>a59HH$inr9F*fy08KJHHwTT1?U^^saB-VfgD`C5&XPZLcz*z%U> z-d|519$hyk7pz-hdA-O$yGv= zKjA1lz&JG5->`g}AyS!>P!BB1(-;nltsPdqrn8wj#eT(vjD=*iPx{|Kh2>u2h+sQF ztowb)nqh@3hVxsNOvO->pA01jYxZ)kQ*M&Zc;nNSD@D5>U-0z+>}Qmdux-fC0%#*L zU7JZU;gzW&J}4mdTEP+e^Yq7$wVmePn)DDzy9^1>d}{N9mn8md&NgJ}>rdf!DVCYD zY=VY`xcl9_R*bckkCLn1ODJYhkHAokso3Wx)Z5&m4}J9rcv-Wbsz>}oX~Ros?R35N zTUcF7b6P{r=*Et&32#`!EOfjW<~>$*dRi7pJpB7dM`>mnE@nJ5-kW*Ff{^F$Yh>{g zvI^c$K8*Uf9u7x4$w_b{_Bd0YIST z3vpzWiH}O8dc;sgZqbZqYDxwr6BdcuuzzTNG7=FjI_MVbe6v@QV8v?nXWMQwL63*s zgIN1`@ATr;5X_>UW#JcO{CFBRIo%uf-u-l!gnjyZibtPv0TWK#38&bDgA)xz_%3rU zEvny^bVpH$@?o22H4VmA7m%pGWch$HDn5Qw3?_}5!*aXS_GUYeIeOKzpMlvtl^N7% zd0zm152Gw^JT7nfASwgiMP*w!Fdrqm(}tH9*9jlr^%ly42^6iz$PPjNU@6`i&;cnHi&bo?^fopGrQF%8>0{TxN_cbK3jq52GNX(W>B1Z3B;U% z`$XAsr&Nc%8HP(Y`@NhrQeB%b4U?kMA=oE|kM70Sm}^bYgY`wki=ypU-B808r1@o{ zhr~N+Dk9Dqqgg5HdwokHdjeL}w)kx1&Clqv4*=oJuEd5$iZzQrA(l*20kZlBMeV(7 zuLy;_R?1uH*$t#2NPCPP&iTqn)ru}rjwE+i2ZsjBJ+F-+2Q21F#dQgp?j>3g?04JZ zJM^B?J)n1>Yk8p8cO11FX>1tH)}PCB;L`9hXaCZ;cHEIY^Wp{IJ?X;T_VjGf{yn;K z6+9X{*4|4}FH_CYhdp3zk)$wK!Du{A=pwE)&)sduped~Uk2BeG=`(@pznl#W~B@K{svj8+vHSgZA(gR07$fG^AtL53`FXPm;Awwa( zH`qOzZcEnfq4CHW)RYlM^+@|eWIpfDa>wn~%mR^|0jl>sy6W;_&pVY5qW;?A%gyU$ zd=zz0={?%+Xyf)w0Z8>E#u3!bImHuNk{qx*Fcy*Th@oqmzdp zo(2|dN8BLTtQSs!=<*NIW)F31HI9YLUjmGmy<)Q4Wy-I{M}j4xW|b||jNY_|5`fDK z0t#7sXi?B^!cRl}aCi31VGRN_3VH#d2#-QMF(F!r;W)%!l*w4E4tK^U<^-pu2mDQl zc7j(?@WQVWn|8#(Dijzw`2{4)neY=?WMS6+pj&k|_AK(Q z6c?h9l2A|JgcaLKksf{)D|Ts&Cr~3B8~O8vWzGt_D98NcKEdf@a5!CCRmJ-UeE!yk-ivOIt1wNax$-_k&ka*}J>XK;DK`%F+N?p%BI z++Je}>taxKby;APE-%z5ZC7KIcOWv6edHT2(-Ke@8>p7Q&)vt=N9N1Ouji1a1TIMM z=~5u>0f385sut+t6KwL^QP{o;vFM#wtkA`SCjas@D>9g-eF3jci02koq~Fo$$<8j9 zXha!yxe@L0S1!d@;VLlh&crNupu}OsqDKPm{@N^J8YNhcBe}=oe%H2A0Q0>reOnqc+%v;G;|?_A^ZX%n(YVt zeNa!GoZZpm_K1$V+!_@xH0Io7b`Dp3kl%hh>Phzc?;6p_Ym<+@8s(@KvY_G z=%r8ONsxbxw)x#d;ozt-o2`L}(blgJmx6SjZQU#_`Pljy)-euX zh&-H^wgmAm6n5Dw$)7#KoJuc5)@7BBQ&!KOXqXawS-UEaen=?u8cW41ewE%AnP_E zLZAAJ|Hnz*%b@xT$2yH7^2kI(Kt81#`CT1~-9Kd`MQ6X$9^BrF#)jp0Hu3i;X74%2 z(@0X*$R`Z+P8}W6)&V&HHoMfQlcsXdTPGG~^vSLuQxM7qpKhPo&2Cpk?@M&Ti?2b+ zX^{~KB`uPmY|NS)?Ak`Z7N5&OQx9C5$Xc&&x->K^k*Dc%?YCT-C@s?BMR@6uk)OlR zt+OxkE7#iZv`?rUe|P`yC_F^cZc4EB|2zVlVfmh~&JPH}T?p9mC=4P>$#SwkQdYBr zggwP@sZ@Cedo6MxsFcHaX6i1qQkN_))=5QXaSL%KWzpakDejRXMJKHZ#EvA+Tq=b7 zCp<*WIunN|J?iE-AJ_9R^RFLY#Kv)a=sEL09*TtFXY zb;fPn$?%ppklG}laH7SoTmISQEU4J`{n#d_)Dl#`yI=#2OZ*5dbkuiotGD0%UMgRX z%&Q#)eNU4PA6_Rc$^9!eXZZ@nJ;J^lu+lI zu~UM%qK1fR+{bWl>zfbj$`tkVoGEZp45|+?TPS8da!jNnelie+5k32>E`eOWBGbAUQV8v3PWm$-qKzdDADOgq>-6>3`&^!t-O6TZXFtUsC! z0W`=d(p`b*oXm9JALiLVAz$}7s4&{zPEUK(shXIof>03gKgbDe&L{G{<1P2;cNDo6 z<;}%}a^;u!;{OHY#j#Ds)?+l@bQ88=K&~LyLFxuxVhv81TkqMgF{q9GLY)G5ITOi7 z9Mbblo9_9Gx+0j=eRM%HRC3J|nxlP(bK(}_V5~sm)l(?#8!fIL( z`-02RM|H{)w#>Jf`%`0^>b;=eqbMO?E<1aV7NJ|e)ena-6Ps>r7z`v-d*sunq;u|W zykVStV4+!>+RE}>l1Al?rXV~^2(jEcW_-^^_tnlRzjX4rP^fKTi2wQZ;|P^F<9mVm z0%EzE+?no|+#hI5CA#0m!1qGtj$=`WNuXD5(@)(EP4)E>4@)!~La|dAI^zNePAEkc z5DhE)2a8DUn0qs)H_|^H7uW9>GS|oaPEOO0!m>`uYc#b+w_qD3=6kKI<;%)idt=ph zf_ROMC1!ii|Jqi_Uw7($4E(p;Yt7ONkH`P~T2@5uWg^P}RJiMTNRD{wSqLot)@AXN zib~Au0FPG-v3G*eKRSFfjgnkf# zMeH?2N#SF3R7>6LKS#-qi;Qbek&TS$~cK8yW0`N&2!!-GT?=q|9ITtD|B}7|G5G?{G1om32x>U zm98!eHy0)RaY#%S{ile*=O6%6SFX)J>)cK^9FciDluT4>bv9Hp^LaHbbcm^`p7dF^ z^i!}8a#IDdmt1s&vHxXs?vH!3eon4xPqotbRFhj#Mi^EO__BD-l{>|WIQ5@q-SCC1 zeBfb!fDk*Jho5KZSL2ZhmW+>cfWq(cmU^7^fX(t&+M&S8LX{3iZ$~m$)$%Wo9=DEi1>ykFvx4b1xY#%1`-oCyRBGj%i7z%9n0?0m9?A5A(FZERWcGZuI>l zO!d;V68@FeXp>(GG&9|-H%>gVogZc1!1SYxWF&)RV5ga#^yUj*G)w;~=>)1(uo=ei z>ksQ1(I{G9sSK9;C?|!V`TUsl=i=`GnsX8oCe=A{><3Ddt;aiuM-l@^7&{L(5n*Ni zO@8cN(eCUuAUv+X6I}YEoT+h{+rqDYK@U8Wv2_L9M>YW@kkTLn4>d|$v!`BLOsZpuP`U1?|yV7{Gnw^ z5?or|(y#UidxCv=4rOfH1MXc`p_va*RtG+$Y^z`5{HkZZ`t>|#QHsL3Rao({B}7>n z^d+xk+pi>*8012uW~fJd^X}nKv(Nb6>{J9V{9?wMS8qD$jN*$JLU+va94j3h?_2JCVv2y<$VUQI9nIMQV5j z#kjwv7)+TR3}8M;3j%%#AAuQ-`^OcFst_qttnPTH@(C8awlj-{_j>4x0K`gRH=*SN z6G7X3-@m72m)H^{Xyjvko_y93Eb*500|*Lys^IHOdS@+u6}JZ|MBr3tj2*Jw<#E>k z>?02(SbrilBT zPhv(TY4EC{ASgRN`Dg%ZA&C2A!0EpfJi(A5>65EYPoWgU#;XY7HMCu$s#rDPKZe4q zHS^8|W?2@OQm|ttw5sxz+w8-%xY^pU0O8g;wz8}uLP(Q}jSIFGWV@AXI4ubcL5DxT zWdrY)TkwbzmZj8;jj&T^Nor88rM3z8_n>hsv8;n{v-lKs2X3Oamy`NNsq4E-H_w;|#fr^#6CBKz_Ik8%(fPl1?(oR##%v1+;Y=m&EqC1`Z>8ewdag=HQ z{y+4*=7a0lQKrg7;Er_9?yrtVj@^^kb-Lb>^O0=ZfTR6;wV`>;B<1O^5(eQ$P5cAx9tZ!S!IU~>q>lhxSx>j-(lQ!W6%EybLh z2arWHPq4rVM>w(LZu{0all`Gl4@ITuw%ZTlD5rUgtTe&0a~Pq%)w!H~VlW9S3#*vE zuQy^Vyafjjm`a03*O4_@ellIaD17HGu8P15oKRCL4I#fR(ZmD<@eiUz5N4qu{fi}I zmY79bvYAVi+T8Dmx8!>}sH;8WsAfr;)@5h`Hn_KN#8D9td)4$$73trviL;US7D%cQ zL2-v!H@lmcdzD4#yz8yjdz;4owrFX)JIyr?tMk7y;chcb8{@^RVMx0*7sQE~zn_PW z&s|*zy6CSnPB{8oj#< zzQnEG)63MPEFf@^I`YuY)$D3Yd`vOi=B205E>{Hqk3weeP= z@0uoV3cjohd@rG{EY{wGgdfLDt#{J0TCmhwhE`8-JLuipyHgc^W+d%Z(Gu-Is(rJi zsh&7$IJq!%8MS`O4Luw#U#h@MO!u-@cr*{c6AFWv_hlN@{Pacu)+n*BQp^5c@EE1! zfU0>-YCyRY5`NbocodB)-(jxcUd95+RY`8FGdyY+k>Y0AMJsWesahgGqhv>JRl0@^ zG>jostQ}=URX*2EOPsxSdCb1HonSYgjAb9)g(xg;G`Fp;W8+@NxKTK>wVryM&#zn0 zkRukBKRru0x(m&F7r5E2Gql>l4mW5bn?(!H9s=4$-oe`0T27s_6WenrQCL5_?RVa# znvPfMm3f8nNn&fmfG>=V$#%`5dpay>@L?__?36_F_x&x>mAa(`5A zB;E0Zql3HAPFmMxAr6+Fl+;!e^wm!Lp1#~FrG2n5l#?- zlIOFizJ1Fk|H+<6`QuMl5_^Db_Pd?%tz7eb?>xM0&G7!He&uhBO^0sXcD1a6JyY*? zzWpryCck0$NY>}^y5e^_?81^W;u$lJ+gqC4x>FWA$dIXex_U3WpQuD3(swVAefE!f zgzjt=qYvFJqg#>%_&z2jv1ddWPp0oyIciqB-cpN&=`G8T82U}csDnjM`RU(2F~mN- zzD4%`+5a%tG-Ut%^M7NjvT$&?`PfA&u_bzlifXlNeoEVo3Rcpa4D36X{{~h^XvfOi ztjyA27bT5S@;vo!j)DRLX092???0da)e+)45kAzIHxT1_W#IOM%7?G;B8L7aF5K|P zcQ|9~h}x9rH}Ns81M`TIsTpQmgyEG>Kn>kZE5x-)qj#!*BHPhzOXVU!f=3#C_dI%< zA3Dim3c#-ArQw87@4d01Ie`IgO_qsy@rZHTN&-VBiL=2QpGx#tMgNK>Y;OauVB*YS zaOPzI2;M9IsDboEH8Kl-&&j`xDX+p`0Git;|0N(&CGvtp^k@Un?Mn>S(L5kTp-toO z;RjoE0Ut=n|3%^D~bW+Lz8HDQ@9^B@ZGEGqQ@v^>pG z^+g?*{kAMeloikLAUt)D#1_-rg?IN?N-+b?_s?C%mzXp!BvOpQmhxrcfosDWq3mKb zp-nbg-i8Y`HHReOpeoN+xXDrW!*4p%`q>a#;%|;+2MFr-$I!xcY-ccB`WA2cIxpgR zoYaMR$}k5-*Z94#iOpEuEBvf!@EPGb(f~l8@e_o*58OXV=2sG^Ix>2APwzgE1wLW2 zOi-sr`Dr%&ya3nQMH7Bx+`2hPo?A%bt z$tFjwy~IdRBV%~$$b+$cL=WFVJRQ?9(XnZU)W}9xp7BC9i?`?MnwX}ZT~kkXeiCN9 z(somXz*`K#3;o;?q|+rqRYwLo#=XMF79d-qiG+xG5(W8y!*^kCpwVsv=Omb00tBa~NlZ4)VnoVC5@y0Hy3=@nT&_8w%5gPGz zGdZpNIrE;_Y^ruIFaP)4To3;DaN=ECWgZsh!JL z!KegJYEiz<`u^;#TfXJxRWbICeJ=k^CNK0IFY_-2hnfUdA1+Wcnh-rp+@geujkVVv z7);mXQviR}Q$>v=xZ9-Q)ylb5oIA{{*t`^yh0c&wx4$fKN4!1=(3`L_a{Ek^gN9T) zzM%)_g@lhJxHlAfdS^~7degS#pM~D2;X!{m^Ot&}0?zC6h;)(qR}%8n7n*E4YMn0D zcYNb99*Hdnc{aiGF?C}l>Ybhp{|5`f_)YfU^vaQ4*l;!HW+Z=K>^F~eHo|{3=8b%f zz7Sw2>A&_cP0s+1pFJ4Vz7VOMX>h0ya|9>tc^3#1HE|~#os8!nakM}9+6Zy~;7e** zUQ|tXxQ_H|k1dw+e{JoM`gP8O>v^)qIwH+b4%3+t)i-SR!3#6keQs?q|6|vF`|l-& zfT^Tn;_=`3rkO;Ge2>!g-%CuamIxVFkV-Fv6K&`xU9#jFlo?YgHXr9;XkGkXBa_z^ z)}Nx9T3~TJwUk#IMy^dicF}fg;rGw;GnW59Pn~2RahE^p>118F`zHy)3-(2DmErqI z`6B<|m;Ky_%IDRzVK;L0p+Qh(#9e4lv$uw^eTz@;s$C-~Crk((UTcEHfF@COo-=Jg#T@V| z-3z*FNLk>EM9D3KX2!X@Bw`{s5dfP}cQdCDfy#}8S^A%&7c4z0!pm{aqFkIKU9#}z zOq-=z_8!e!M&IGpie_Cn34GTQ%6bSsGXxm6PYv%1BaUv=;EI(6$+JsUTk}*V*ndb- z+nEZq9K5kymZ0D=8|~mI9-KBIjPmXrs1s>};1;RV!f%8l^8jh&ky2|Ih$Q%n*d1+%c#g@{wX4D~w>!hSt zWg0}Dy5j;6?5!fXuqgO8tqiT_9@vAoJQFaDh-b=S%2Zr%(;FUqtGYy^W#SqWk3N#? z2qL3w(r=x*aF}~~JvWSYFN!R0jXTkaOJV0%jaJw-cYZbN-0;!7?HBF>`+vJBV9+G+ zasNfo|2k>9bN1+K@+&Nx<+$m1;4N%3;tta{fvTxPe*ySjq?K{5>ha$OPDD{%?_<#a z22?-~Y)DXZdqmdhHG~p?_Fp&s)s$wjzm@=T;G&fed2Ko!azA0Rp!gt*B;wiiE4bR& zaVuExE;yLY6cD>G6ljMtWIOTab66UlAX>G~=DInH+Esf?nP=H4 zng?cnd=%=LqwCyLe}AqeC$9132Z8!Msi8nFTsxY4UpMMr%4RaVP`)}ZYuqhXqH68U ziq#G|lDvaVq z7y}+wUr}C}8SN4CpzbZ03NIYvA`GCL!R8Qgq5EV2R$ss~ex>h5=P(vJluSVzH7Oa* zDFt$X^s7fT9RDaSbeD#A7AaK|nH3)~%X%l#wEs}&G2f^UGejKIJo+*Q(jPT`z-SAq zuI^{OB7G`W6gnoR#_%1zgpdw@^z2=9rPL0~xl?qnrCF8hy_+71fE&Aq8;<^di*xJr z%?bG&XXVpzRcpu@-23h7W5K)Bek){;vMP0o=KPR|ycUh%eRh#(O|s2o>11MMEpN;T zp2V`vqFs{w5>^lE@Gl~1Q2x0d>4j+ot5a#SZtJe3Sz~v#kYTxfR3cv01;^+L#iJh? zXvJs41Ug?U>Y9pMN>bFLA4>YiU27OPL@V@$6gg*}lODR>B@c~UTF>)2NkB_LY>%pV zE|^c>o6F^s>lNfdkklT6N9kKvT1ngWh7U(iOj3Zgva`v0=;AVElx5S` zA*m=PC2+pr_|=nPRgP2&1^I)kD&#q$-Ezw^_$#Pl$Lr|Tf~ER4a8C2dN1Cam*B^ZDnGeA!R>^c{0*PI=AfegrMF>tP_Txc53)DUz zV-0A9_e33%GuMNIeslLZ{r}<7T=bi5{KJIOQCw#kNcR`7Kqtj!MWE%~CHnqH29BTP!|;@OE{|4e_$OU)?P1&VB-P)V z30J;G|BjB~5-6e_b1(AeAt|7$l{W9vOk`T+7dQ0vq#Jdl!%~h3jM3vy6i+*R!m^Y| znXh}!shxBONez(16&DYS?|>5iXXYHT_Gd1u>i<=E&)(MCAZ#opd4ISy6cJ?zHo-{j zl?kt7`UzLQSqitgSlPyP^cgk!gi~~DA+*i)h32X1sn)BCIsEr0K%9Q%5XvwoBLyWz zjN1SacB^9a`BlPR@tergUF6$Z7b3j7AI@^m`z-9|oAvLSt{A>OAEv#|@!mDIVmm=n z>)QMH@sbUTTe)`YsTDjI-~au@hzi2S1#inWZ^@6@F4V6zzHq_4#=g1AXDh2;nMbON z;Nq0nP>a%5Q?;e{U=CR~8n*S0C#{yRS#pniCBH6PtslSkdx3m4?c7LirWNv54n1YE zw8|EbpXKCM?}>TVc6@s_B{pjgM&Wtg$3>@+`Kz&PIChP6H7~4z2(_py zAGOsuGBMM+>^DVr??!3*1mzgHXF6ThYpq#xY{Rv`mT~y1 zM#iaK4dx#oyS7h7u7*VB+jQnRf2MDVGOscRoO_FfwacxeO_V-CRp);5xBhdu|>gs`ueZdQL?-koZBGx>vgx8Hspd&;f;OGb{A`Qf9~LYcH%NC%c-MYkW!v8fJ zY7?s9VIrXuJ`7BX)f>l580+gbk-9FvQPcu`OTsz_?elK;DRL>K;laTiJ649-iBMo#5(bsRXa50 zsXR2pp!Qf}mA0Ae&f>I?>Hg2K6eY&Rt=~r-q$Q;FoT{~GDAF9;o&n1P$K-cJ%DpeS zH&(an#`Ov+z{CRsL(J8UU&k|WQkz`&aH_cKcQ_7NzSvZe%D1Ie3eCZ9zG%32MQXsQ zK<2co5Aw;mF+QEHxyl7#tjaclIqb!hRKu~4?M|T`S%(V=vVB}1N5_(i(Ub*d7b^V2 zt;AC8SXA+@>jB;jN#Pb^V8Op4?mKH^){G@cd(VEcHTJsPAUP+P8^t`RVAOJmTZLpC z%F*zor2ZA|7$1J-T}*Fzn;OeH^?FFWS9>nwg{{0Yut?Za8mF+V<|uCB=+KoC44|+= zB4blb+}Ba=Yib-EBTsl8+f`b*f*Cc|>I0hc!krlT{f(4&M($G8WvVes&eRI>RGJV; zvOWb`6pc7pCj85XPbvCx&Gj111jvYph^fkhaY__zg0F>cFNKDlu~SnelPscuTCy)z1z4Y<0Xr0=6{EJ@IY_LRvB3Z_08x{p-qr z=0Y-ihPZIC6iUvY_!S>3dz!tYJa5RR9kdB@fZ-3i*Qynu8EVrUYQ!n=r)B9>tG-fa z3blpqB@^w_o7iyR4bDK~Lcp!5?IL`zfF#B5 z6&jf&3BnX%YLB2a2<2RQLTwM1DXB=ceZDvS)Sr7ys*Nn?dOBR`<``9FJ@`VQ5tqq$ zsk_vZ))KUbGkmr9qiwTQ;MAc%IFG}Crzoxr|C)bo2V(LAd+@q#MXwZ<;C7q*p?8Cx++!s zq?$Ey0%>M);k3!C3bo$tV^w?{-6wvLRNXc!dXTo6@$M|7{B{%*`z6HZ z_nze05p_m_B3^v7n2!w!g3h#re28sv%-qV)e2=?FIa;WoX!T>Xd#}yNLZsyf52Con zE@;RyySLbhQv5CM(-77-{TH`GdsZK;Rc6a(X@QB4pgsQN4GPIG;)lk9-ZRk>*afWb zl*gTfzCE?{E%?6*6m>`)e67XkKV|#wTsXL|^{1%QwDYE{8R*(!*)Qhh4nC8a4aBm9 z_g21fQvV=+L`V3TRYuE_O`|CypVeP86F}$^IBPh}N!T9pGK%Qb=V}ZXnzkO|uPLqu zJUjA#`gg}h9XiT_T1l=4VR?UQ^ub2vetH=ZJ(h+&ggl`ZUB`{|d#Gv&D^@r3=-{Vqm)c4uxe{ zYZS+l(CC6&Emy;crL~9;-<4C2N(x=L#juyZg}`rd}-i>xG}z1UsIKj7E_pmP1+(f(5&wsZPU7 zpsCg(ZyKq0`r%GOMW{i zt{8(Q;VDk*H3QTN+xj#PBRf-P(o4?rHp)GE$!@Ak8Pi3j{>f*l?owRu**kyk3QX~3 zF}tP9{4CWmzoDHH>?OFZ-gJjhxehNSB?6!r8u)YNY;0wIvpqLG6{AZWjZ-i7NaE&A zuL*lRx)sYMb8M{R(5UT;1^uP#9u%wljd>uGfXFj-oh^rmP7a-<65%*Er1s(`chJse zH9+tR$x}qC{KuV5=|2_-mw|#c=$Z1M&@9{Y=mzprgB`}&*BPIdpVj<0TB?NO191w$ z9t}M2y`Ft|{k3rv$;CXvqhZHRa_|V-{N{RGUs#F1(+RZq?fWlAU zXQ+Qf-*L(wyK0&DTxD#6V9UPhrAK>4Y03UaKoW0hKj7qgFdD>k{4ry(q;$q9lfhbZ zkRmQ+aesChAQv`nEg(>deNi}hVDo+znQsM}<0tIV(|QFyr{t+$hq(UH4Nd&#C;gNFPDxu8s-;a*o&8 zLRFgb@BYf8rrns5iBk8MzT=21znl=xdiH`w5g*O_6CeR=nxEguBV*`|&uH-3G-Is0 z#|1XF>t+*id3;`(n4hHXH)MUq>x&j>&XwBUhNmc(etB{x45IVU{k95Cgj>Slkxv*8 zEV`>k!*j;CUAF5V2N~QwBWCOb0~;#s0<%a_?~IbQiowhGO;(dd3Y}SSK5StRd0o=2UC{HRFPYh%n#R_cM7QqfIvD zhSzU$yPg(pnz)8ohF6(o5FN6rE-OoDGYSL%(;h1i8{B_|)T?ivtjH3ptC=$OXb4!K z)+miqv-A%){$*D2K_>e0Xk9~i8IkB9L15R{M@^dtt20+qW_kP(ekv7L=2fS~iA^Aq z=TaYJ8J75lkow!R-dt^Ks@;{l#Or`PW|~~60KwB}c0N}*3izZUZ~CNa8J%3jzYv4@ z`PJ^dC+pEU?*xR&a85sTyf-eW-qY`4=T|=MOWSRXz?ZGkrU%HDq@`urn3){^i=rp3 zoh&62R-bo?xKXfNWUcrkF(b*5alE@qMAqu%ki484T?JO4`rdDaR_mDfJ;j4TjNcW3 z+Kb+708jmtT~+e(D={CTh>PL!zQ~qNOQojcI)LRqeBXyCClz|=25}i+ct=q1 z>TwR3I5BsdkhdNw`%pQ8P#+Y2H4;*8|AgN9h_+EwK2*IS+v1Tq&``&-QHB z#n#UaSsYLoExcWRXYo++1P&><|39j}0xFJY>Gz)mLI?zcJA~jY5C|@d26x%TA-KDH zkU;Pti@U?(?iSn@cXt-I#o^`N``-P&cTS(vGgaL^H9dW*tERhttFLO)a6P=2~%VIhwz6)=51$Lm5veVm6#sRcAF3Ib0_Vp26;)FUn1NtEXE1!KG0y#Z`Zc!FCXknShWAOLVjovfjJR9y z!cUxm#o;w9CuHp(3p1&mr367T%319~CX@6Cu6=1NHDJ?%TwhNWRbHZG4|ZnPV`_^v zi9tfyCUx1DRXt3gV1o9S=l8`SdsaQs2h0~uJ;~b{vV3dr+zw)nFx?}Ty$~ovn5^7` zHPr+}fF%~Y=EBe@6Aku*3=U0>lCOrR7R!B1qxjZtrQj|yZES2+I5E^v|J4}714qkA zmE%K3Gm(*tym%j@XLl#vEIifM)`R*Pj%09I3WRIg!57rn!64Zw16?)}ns<9#1yPnwQi zFu}&9Lnlpw|2A?7062pO|6Pr+a%qug7jbUfc6&{Oz)wc6zTepp)+|B7 ze}kgi;}pfYxfB*svpQO_@ERmdUvIvfL3Wwze%ijZ)s zq|>ix58n=SoXuEa^Vox?f$PZXvw2IyxiGo#j@dz&~8O`+kV~)D6VL5D~;8;`soch=pyT6yi zS^GL=I@&vf4TR9@nIj$f=(7HJNEyTix^M?hoB66S3(mA4*Dj-4GsHE5=45NG(D44M z-gKzUpI*t5yh2}M{Fxm7ih?N0r>&w@n8GDKQPJ;2{Pz`fe?<^0x`HY`Q^YK%%E9eu zP}4)*y*;z>^@F~kqO55^Au1q9j`mXCDO|r-Q6pucml@`Eur9ypwy)O4kSh0mCMz^K z>%=a-xXLx7m@`wI7Pi^0aIbbHGuZ6RLRi1D9SRj$#MzXA9I2jMn``>kX}+ZdNROA+ zGS7dJ{Pl`wQ=>xPu*q_{?1Veji}^^OOQ&^(J5qPA&S||#Vblo|ff*?sZo!qhO42^? zVEM-_y2SR6-`;VZ4y-}m$%{^-M1IP7vXG$Cc=aZyK1}kj(W?B%?zmZ=+i|rTtXEubpIMpEkl+cZHiFq*!uhMv*%K#`0LBNR7U@G7?Y5@oGzQghJ{{}c_8$JPW% zeTIfm$IMX04#3%@jeDu;1;C1bX@%6$c#;a(n$pv*vU&B|pX*kzi;okeY#P2&}z~Ahv_)>UU@2F{=?Y9mm z({vqYPiw)xFJWevYN^loMv4vqf3F7*zy%GK2T zzk^V0mV})jP@a&Y^e?98n|WOeEa(!B^Wu2UzbWwf4DFk0RvBAR)0F$QDFRzQy;DM> z|D9m1D6zrw*}vED3kuqi3i0HJ5Bqq><7UlSs`rr?_7oFo_|p>lm@m=h0WIxHD;rKx zFrfoXPYIYvQyZ7l##)84vCzxKTCqU%K8jDi-}xP$UUPtC-|d5pmzww~;1QU+w$YFX zwnMsSlUVNb`ZCeq-YWVMP~g7W%UNhEx6=3Ibn6{fnCiYvlVLX5@XO1rbCl(bO>Bwz z1G1!C6B+};{&*|upeY2)CGf!^A}4y?Ei|KC$~8u+>5Uq*tncd#_=&{sEUs=XtOz2t z0!#jLc09oeiY??l6DTaO5Bm=4YIM-{Lre>53-_5iZ09tgV|T|+a^b5~QJh3T z%+*J(b*MjoN1g<2OC9<5&^MYdE}kE3o*qBYwbWs44^o}kZZ5($?06Q+9$q~v`tOKM ze2VVaaQ^Ag>R9o{{m?u{*GH3u)J5`Y)^g6AJ}^ikAn4=Exy$cROU+PcMK1Cst;)8r zKFd{L`=EjovC}w^YSZTz&95^LI{umbTZwb4_oo;V7!HM;>oGo$r{qSeE(WOrC56rx z41qyDGE^d7zhFMPRg1WarKeV#Piu5wBxez;#~*97_y5%{fAVxlKXDS z=+y7rhpIyM^?vq3BVBhyA540XsOa_$$OUL$zvsdDnH!#~AENfGEZ_(UMGc83z|l!* z%g^q4SAV8k*{>#t*m^*R^2dVM-`CHw^*s;lEJV$X&}$3{nm_IP1$sr{+lW}vD;AJ@ zc(fPR-%?M8Y+&>J)7Iat>v8w|6KgIH@lmiX zW6M^#6B}oe-+aMS6j|L@PRXeVGUQHAzSq8SXVI&fmk zMY6TD%ah|U?r>GO6MOs=?Z&_hMJ?#t*Hd3wrX)-BTV1B?=)3*cBsNhq(0qxc&h>q@ z&|WrN=TyE=7D#C)-)Is9rHQ?4xxA^Kb$$`3cgCEgmzgp$9cstf)K#iuJjTTy;T1so z+ho!8jV$}`{qKuZRW||81=;pCgIdXb^+g)^gg>mb%xpu2ho24Mz;HetE1>9(T{x~T zl}CjcRm9f3=*LxAW})_Zl2Y#oG3udym*DU; znwF`@sL(92UP5PGFbGz1`HvqRYsHtGrFrlNshN)!8VSX^KYX#-38^%eZx_35Oz>vXPNLKA*_TzABzUUkFy*FC5eJtM8?DN* z@J?bYhW)Hwt*@k60r>q*GeApr)WdN!1*ALB1r9WZaWA%mv}JD&z$d816spV zBjp6%DEv&7*OndoI4o7!l!_=NlgnK4Txj=h32_&v%$^T*xbup*xhdkM05V74yT%nB zDX*wb1Ky+Z`YnsrkJ8;kR zeL|k%ULL|E@aKaCNRuzK@Mfr%t3FdVBl*uJ!b#F}BkUIWfW6;0fGlB)QKE@=B7eg8 zwoGfy%o!HC=L))E3;b%JudCYB!LUAYGF0 znq3s#?|W@)$!CcHnsYY}2~nf7EZ;99o`AK*Nx+kJYO*H9mYd1Hp+HgGD8j@({qOL# zDW3m^ui0Bdn{qB(mQARk(2flgTU-uw(Z}d=n*tlzz{=0h-p~;B>0a@bkp4Gi_~YsJo#l6srq2b;_gnt^=?xlkw=853(;)W@ z`uh7t`^Yt$#vrHtF68IBY$Ov!pQGZni)o>Y>6iWDmqFE+dDWL5)t8!@_6WDe!EC2;{GS=iM^O}&*T9F%iG*NB8@fD0FSA*9ril7Z=N`OWr+C%k@j!rmI zX42bC>y-WQ76kKE%4WS4L{~vki!)m?*F{hD9^)lkOAf_X?%F<#bt)FzYu>LYj5=x- z-#-U|>wF^Wu6H+V+kBJE`Q}jSu84fZkDxc}hiRsmXP$^f!TVL>*(2lf{0b>*fO(V&PZBf3;8Ghvbsx1my9KG$d&#wpnp-&;(IA`{n z5F2?5|MjQNOpE9p6y@w6^KE)hIeR94QlZZRlSzoiX-&_onepaDBiTj&Lg72%#7lp) zv3Ix)T#upoY_0u8Jl|Rsr7aDf7uM-4?{$s#jat^uk3N{0S2USY(HXpHSCk&Cmg(+; zqdyRTKM2dcLV`)POwvX`V$W!4D2K}kp+{fH9NsDifxx0~U>Em{eSf{7Zb7g4KhzWd zE@evF#SwgYAX9~A27zSF=QrUQac;;Z3D~O02C#yqQB7s(mJ>jFD#~D21#wN62`gpY z$sxRM4F*(GfI59&Sd`haKIZUH&5(I;m5i)AZyam1ZnCCys)xqUJLs45)17$PAm%TH zPvdc8J97NPV!z690gRC!casPU05RXEVno@%ZT$yBRoQhVa<3XI7jIe8`Xnk(y7JuG~Q{xYi{Bv<=0;h{Hy@Fsg~yb<2_k z+%T&8HeZRH_FE^|N8&3|c@NcR+Txg^&fQMu(=he@SsodMo1&J+rWJV)T}mwm?OJGc zFC_;p884cGInW;FPkE($)zW6dgMvIBGY)xK{`S#2g0ffRV7VgmytlWe{|)pD%Mc?> zoGJpe)+L@x2!O<-%;ODP=%!Rx$?RG1xq(jI6*AqgCy>LYY<`YxD*_3 z686E<$_$Vc4RF}He5uD&5r~fuM6b#?WnpH*uq*;=5fy%k&{P3aqt=SR(yOCv{M1%r zsnc`rCNc*NGjvm7mLYZ5;I%aQ6p z`CIF2XO=r@z4qNh!~E67q&16qjVI0>@s=d|IATJYCeB^*E(}FDKe*B(;Hs?+^RIml?C&bBlI_&t#5SD<7S zGwj6=RadsY+e4HpEX-jNJq$H`4(IP$_*93ROcRG?(QXYoO7tZ4FAXTV#%)SG$!&x` z*jP3G)Qd~n>VPd0cdZWdH4wdb2y)~Z<#|FV4E5aN$!ziM02fSJNDoohp_IjDS>-?P=in+}=N(9b86W1!;{=p=X@5}Z^L#a``pl3yp z>VV~O2G&i-AE1>4z6Cwlm9+w#tJ7v(Qyutw#z~8;N7KVuRGu%(&fMnD8-c~ZA^+Qt z+D7QmG@!<(7wKU!%`;TJy|eEKM5cRWXC4~9&xNHCj{p8dM{qy$6lsJ&f)}6rO}55# zf6Zj{!9r|dV@`I&Z*m5p(B+OVa(sZyci+O-nSp&nh&PN8g)467I>BIWO0KJI5InY~T>gcFpzSHX)1{W{LR zF1sj-zx*11FyKzB37s&+u$PE6?3i1LQn-gg^=ToxDurk~FDg*?_wWyl*DE*|pJyC5 z~ld2IZye{!lkg#jsP&jJ66@p>cCGp<2C&GGH+NCDiRYZia>mP6S^Y{E%B{g^N1!G%Co^Y` zVC03K7~qG`SlyLcmu?bho-fvAG1G$|<&4gO2)L%ADl^y#FH@~Q`~7e2UjBE^ic%8S zXI}d;BTjnIV0<)IJD=noQdAcDk?{#jF2TTSEFNOqx>CbB8Ks)tc)=+GzPvX>laVg) zNnX#l0~Q?w|e>hZv4O)jYR-K~6kR4DnWccbv6n6D`V5vq|;W;5kT3pQ%bwO%PSE{BtMX29Ag3w3z!{)mQQp1#s>PHB=jRUi(<@uoMg z1bQ5@{EJWzKSVVYlWeF0Gj@*Ueva(C(T(ZF%;^{1YFvsB!LgXPZ|^zzldzD!19cmn zW4lPJ-;J8*zv$B707wXBm|=e5K!{N<q5NyB zs$=6nijn^d>T=WuN5tD>!+*m+I?I4ig^xq|H4VDhaASR(d!IspjrqEG+`NL3efsx& z>Ex_ve8I(Mo*`B_CETgie)Cnk)ghp`b(u{v4C5dY)X0r2EG?c0me(Cdd}E#cGR@gL`F*1wWaB+TsQ}#oc2coi z%WZ4i6J@bmLLo;cq|15JxLRrBw&u!V!m_QQU*o;Kp4H=xzki*2mb?!)Sls*5>xKjB z`GR?uA#)W7hqkNU7w!`#?4m9Z)>|1|<6E`$Cg4Pwl#EK1_t0LmrB)HAmLEOGHTDcn zOkckrOrJ$vSL;XS4mM zZ^&5eZka4GMA+!)Ewg1nfAp@6PLL8FnY$(S~<&6k0RId2%Fy_bOdQ}8YW@MF<9k_&x zo2edXP#B#q-5r$9`e$4pbqbPps`6|LXRohrX!~P}K|$h^iIj*6@%j9)-w7y7yT!A?YIzDh&NR+106x<{Skz#G zUhR`7eU@pl&pT39fIQeUI=7tw!L~@Db=4f5(v@f(l4U<(kS#WxH+?lmN}E3V-j07W z_v$7_99-Ox(>`k>1Ig28uSsJ3v%v9JZcoNG#p1acC-HKtMoLW^93((CTJ^Bkh@3es zxLkJ=VQ|*yJ9|)j@BZjJ-ZSxJVXxw)%zw&d6={3&m5+t0l3o5YKz-#6j2v1=>c z$qKA0M(NJ&hsr(EvS7D>nNz9@Sp-EQol4#v);g>O;s}WCk)+wUoZl&I5Jq#ey{=zC zVJg3={8;);L1(Wt?DMe+Ht$Y}=4zPt`R``SN}3s-FK%Tfy(0@O#h5|{rfW#R#78WX z`VEx!>Nu%+e;Anx(h+dql#`1(@63c#Z@@wm%mT!E)L@>)=^6{0HBsE-GAXy|(R#|+ z$OX8pY~y=`#$^3bR96wr7)vk`zvw$7si@pXf6^$%hARXM0+T#{Ce4wcV6IafSrxHZ zW$tRkXO`P)oVxA%AwIH=r(l;+Oe{&YxKmUuQlEH#;F$6m^`R*rQ`#iAk{rg9LU?}fkxxD**4r8>~ooTx9*Qe2^xyPCW2{y^A_zHeE194G9tx0h`DXLZ(EPp3_iJVo@KmFQV)qv0IFyfip zPQn6wdoX&Dw8oa{@ZcO|222bG`5uDyWOlvOUFR?7XD*QNJW97)seHg~dPJqaVtCnA zh!VOO`;vsgp1pz-vsxzkv$~0i`k0Ga*wj#mSH!Uz?I<&zjL^?}(ym|=v1+~md_fnI zwga5~Yz)4$*Hls@(SsGf;cVR3qMuFoJ7NSwykAT_L2j83@S#2#GB;S$tfk(}(SyxN zm-s1_0JRzz-h%ls*n(-P5Pu!VmQdkuY8aoZk{}JG>I8JP0nzC(}`H)j}xdKpVi^eUMOTC zMNy1KG{MrwrSeKQ=NpB(F0a?Lgim?diHn0vAQS-qR467SH{Mu;n{adWR>M-N$z+bM zzWn0zx6CK)^V<^ir^={Bp4htMP%a-!83vyhtx``}Oeu%rlKCg31S?rMk|c>F7VJAf z;Ew}MU5lXw%z|<#pv)L>V8r_+M;X$a7~k2-NQU~b_}Blp=ZdT-plHrkGqzfzCTcJ=*7pZoPx&5gK6!*|(7dvO8LSg=6VDVvNV!*SevaDNYmAxS75iw7oHXf%Mu~yq2pZD!eT?)=&!41WJP#k+$E z{mGYJff5P4>zs3&C34R8k&9K%Q+($qP%|y~KsiyQjxRdJ4Q;k_Q`H?$u~m7o2q0R) zT(vs*jiBR`3V9fL+-i~@tjkwheaKPFGj>nE(>HnmNUeC`TDGi9>ILx3tyUIq6T@Az z#=ehIawDs(MAHq4I1+L5%ThOG?DSwgFv2d;WU40Nw_^$$O7pN*L-60$y8hXtOC)45 zH;9xmK;`Wi%Cj$S&S_kpMb&LI~rh`kj$u8-rJsuzJIo~_WXXJ*vi%76av~+taRF>ACCCHm`sOw zgq*!id^>BWyx9VY2xqP^#le9LLVY$svI2Y+;1Ay$Q0A4`hHxGj6g~VOW9$KKr8h=pbeAKJoabvHabA=iu2heXR%}}=#uz&-t?)j8!_C&L=l3?-(Xz7JVa3*55)X++ z$HF1UCXDvNYa4)tsFikl3n}c0R6jZhh4dBu7(0b)(9+!c3_xe8T_#tB)VY6v=`mtf zYnDnuEFVFlmWI#G72CJysOL$pM(Xck%;b{ioH;Gf#rD@BV)@vS`+1;LX-68jm^C#ISVqa=KV4Sv3|@SW4)1gt|l?<60q$ht?$ zowCCw;M~_7hB{5Z_rU))%6X!w8q0}{X7uHXhDC96wZz3F_q|n0i`>Cqy1KeFzpjOm zvud+pgu}xtWwiyV*78j@>O*ELwS`}zoWNDh%%q}`0r)4{YGTntg1DIU)u|nEZPsSP z%z8b(hmtl;I|QefS3)#NNNV_{=i9L|W9HfocRP~39r4NJtkN8B6Fu)gh$lPFYKzQ| zL$lo0S~|2z=VmF2thp{^4;Qx?HlbLM)NcvVx`2`>w;Y3426SpWcoJdB+ z93=)_)-QK%vX6+mbMp<^Q;&mMy^4B=r=~q4XTPmB268+S`3?=+`^c$;#483|`1LLu z_eHiE+G9zh~WJf%s-07di1xp*XV*(u=Hi-Y&07o9w>4d!ednNWMG-X z`~dCwVjsOqEViR5*XO1c9ueUj$nY|3~WNSCP3&n^~L1yS3 zSSC&r?7UvR~}Q1SrBgNM8+2+wZ5%vhd(r<8AC zsOA8$S62HEG*j~V5ANRonX0&2}&qwkE9QKyg6HlQuq9qGvEQ!#xzK5GHHGa`@ zpUAelhS3QS97j7LZg+(NHy+CVdLseLD5T;xj0s6+r|!Nb*oO=pF8;L2F0gYc$xiU= z29*c$9BpT(fP<~f81hZtF3>xmgU*BR2O;~GZ*C(F!$PZ+&Eoq=w_ComF|OTZ4TT@d zacoJT0T@Ix-y)f11Wb#1a;x9VTYoKiUEvu1O@2$6=;yBYV3DZ|dw<6>M!dUPxoCHru`1;!dL$pMl&9yiFha+?*}Q z{s%w5_s_q6;Vw3&!$Ad(rIN5JnM&C2dq(-8YY22aajC3eO+sO2&gG1F&CGoy2|Id- z{z_B)K!XE6+TpyYRMbyB?TTn1e>2VB#=8zY6fPWk3dkK#tSGvVJlCMXwLI>%`SY*m z89OkRs3VW<;qQ-#cdtC4YnJOwx?alwA{c-A!a=If+iErv1DRDTb|C$e2T!We8KkxA z+u4tHY)&aDiGbYiewW<&<0d1*=+Eu6?rM3JP_4RA$ms76n&pN>)f06n%-T!j5mhev z)i#SNy%#jO&0&ai3|pHuuD=-(UfH=BX!S{OTQ5CQRF$HyxJYjydEo32loEdkfR4{4 z8TebKB9TPP02-ghSB~$;CP-gI0YHw-8XI@D?AMuL-Y(!OQhz<7tS#eP{<)|>H+X3} zM2yGK$V4ik+vml1PLP~?ZWIp76 z5Rc4%><4qZirbZknhTAdjiPdI`H=5fQK`xexz1*C&Fkj9^f#mFkFK}^jQY}o_;qUW zPFe)1T*l%2u9Y&!ed@O5%XMIQph;){Cxyl^*a>?5K<2T&su=q`nob~0y1~nrA)db-i zM6EXawYC}D?aQ?9qeFr+pHsXwdL-Y&Iw9r??sxiW*tcL+6vf)a3B zZG$YkUhUxF?37TW^j5;iq8uI=#&M9H^{ifVSKMoBh46zk zb2xE4SuFAwr<`EZo46T&*dquU#gBh&AZec%zGMctu?RV9lr-#TqItI=U6`TP29!L- z*xIz+qOM88zfhb5B^4JC7XV2C^%VH~H9E`klQm7YuH5$!R|hWT39_k!bnLRwM5WpN zMm3lGm8LkQWZvqsuVOjX4<7<$U=1M&06(C?JGG6eII-NxhY$XY-i}u0YMvdGNsEv;OabGsf*+tvX~;&@uNwvrdvt-RQOVvKzM z2ZyKcIN}8dMSq>dJ3!al?bi};)#=9)Zt%R&Pa)RenEpwsXl9(-8*b@pFG*GtC|dnQ z@0BkOBCG5Pmj$lQ@}MTUYX`+fb}Z?2~&T53PnRp#WEl@8hCczAGfAKl&W z)TG$`hTJmlD67t>8|Dk@hXVCGzP6V{7&7aPpnZ1j5_L2#3{QOK~jiF+x0`hxM`UF)qs!SB*9wy^frg+T0hDR{0? z(y1+)nS44!H7H5F_j~o%OE}Tq3|8N->J37wr9HrFPT7K6>7B!kXXHKb?eg&J^|6k& zpjBzTi5O|-=n7M}CH1x9N6)muFAW4HI+&7y-d1{`*t(meW{)CxM>ypdr+5%q{8kpvpgfwa?7yL=S(gST-aTBA0Gt_b%jfZvCz43YztJ1%}7QWAf_Lc zDRNZA-`R$!n5f%w=7Kk_jj#^0m}SI&SBcUD zr)Nf9h4JsIVJdZZ((>H^4C!O~=)F>v-MG`41b7ev5u;LqCFZKB8Lx{rEfA{pvExIng4cNb`vU@^;Dz?#s?*94RO@qtufg{^;?PCyvQAi zx6T3NJ~|W|@Q=(uoy#~$cQb-Dwk*ZBQPgUZ?u?x`0?KIpUd=!Df*YNL*X$qD&N3Y3 za}1|)DLzNdRZ89(yp4$ArgaV#T*5WToZ_ui9Iue;!Nz-V{jpWzT|J_sU)S{u=hGpB zZ&NETZK8!qbhmgN=C?N^1A-d$(D{s!$MQ{fp*WiRg|j6rV@$TaITEo@OX0N*JYdVs z8PPa?6Q9yDfyJ&wB}RerUELGubJ9584s;rv)lwZ%^faQV?jeM!^XQ7CA60L5E$r$Y1QXqmNghe$!6J$M$#SelwJw*M&GqZW?$zwjHdqRuS$& zRdD6YeN79oy2B26{>Fsk0`9SKtI}2uY&ICYx8eP8ehR4n3g>>RH`%)ojQHoYrN6C7 zl%S}FuGQxobo4OQzbFRf;D7o@tE1yeVXoJ4@g_P%2;CC&&z z*L|Mf-CIVPus`Ql`XpBjMHoyiumD7_rw~Q&b8T{u@4V|KTo0JtqFed;_M)?v6KCru z5Z>+gYqf1G1zQ#Fx!3%VKI*+a4mc7L5Glrkzy*2RiYJ>z&-X}5EIgO5!n7ieT5Smcm>jBlIZ39 znO%Z&xe9>Rm&!(}8IQc+mX8^#>9TGUmKwUAA6?GnXe5phhb`!t&YH~zUPZ*}RatqQ zkF@kS6fHW#5=uVyuI?s(%~sl}q}po}U@zP!DrrP|SrzyOlU$y;&L@FfFA{Qrmj{Yb z79d@qMdl>?hVK&C{TC&7eUqam0Xm5kA45c*YdF3#&bOm%@4Y zuV2t_cwq6z(Eo0}&;<-Dlf27;kZixh*B|WPev5-@(QQl}5Ao~aGeSo17KJ^D zDD=m;?w=(}PZoP72c)ZrhktUJEuyxPMVqs4k_lgcoLgV&`D(0kLIAF_U&>sr<)6Ez6^ zEIgcl5!yiE5s=WK)U0$!HHqr;SG%lVYU#I_Qcs6+em1BHk7y+XSQ0-~sUos^c`jC0M1c(P38_@E>kYX&)0Eza3n)a5Lo42{+d(*-0f zrX!G{UKOSipF_^6DgNLBp5Qv3nF6i!Cuc&u=kv);gfKxjoW8HQE9a_COWEk?qf#y?Ad{y ztP!M4tyF@tocE!Uyvp+4ykW&c^~Yk~+lBYIHxV6PSYQ@=cn6hceQc}sA7e;H;ve0| zMhU|l|ku(5Y0~au^zE_}t6kyUvZg5Yp6yI_<39Fj>y|oTW zXThWdXEAzMn4zZKSODb?6V5rXD#ZQaoReJdX!wEu-`byV;HY2$$8 z3ad12QD%GGiwa~zMJX1m5%~9oa`%$iBTMDen{SOi+grcRkvkZA+;;#O@(wLOXyn`!!!~YC zPUwZvZ#^i);pZ)W4MXQmm7=m5r%bt(K{Rlmunsos8!%3nWMjPm-MZQ|^Q-5Ceuma8 zE1Jih$H`-ARIZ{SuZ*A~@Mt;6uidLBAggffLQ_DVI+a!7Q!he20? z(o(uBQ3`J}-fEr-;$xiRwe`KD!Cy!qVV|ndk@M>emC|`IEg1VZMY2k}U?821&dzH- zDCKg%V3c!)*zM1bo20tvPq6inM(!Tc7X@o{jYu!9CE`D3_K8(3a~m|TS_fyGf-=VO z;0a2Ra2qd?8L@m9V?&c@wMpOx@tR$Z!`G@<(Zq~OA+WA}+S`^9qP-{F!9Dxaikcxa z(PB4*1%CXh;e~`_5+m&QpLpH~OuklX;Q@o!gf6l?%pnuNs|&{@-kW^Xdg?|SLz7;x;nosn zJ1{w|nZ;2Ta(VQJ;_GqEI|3rnok7a@(t($&p*Yl~fq0`~52&IHcy|Z~Lc~@K&MZ21 z)Us3c$Qd4);ZfT8I8L@cBgGo=W+mGe)e}QZkKbsaCFli0=R0t4u`ZkUo^6QpC`N{C zuIR4&`)Ts_v08LYwa^V`_k<>vHM>PfGJxBylLK_(3dY{o!pW_8@sNL7e@=%jFQ1Phm1t;EE}2_?{txx_Pby9y-olr620)unGmlj>7E(9-2b2u{TdPSEI%YsX`tJU$Ip7pP5= z=}x@vKx^(b6UQ5J(pgdRzX)C(N4XcV`eB7Oz3VI{dquxL^XHxReW>0_%vVn`9_>L! zJSi~FHzVn}B%hfjBZ^O+=Qp3NWS(z3{LGct`6ZzRQFEOA5%?M_@7DzSu^Axj6-L%3+8xQ(bB-S*wii~4l zTWPfqnf#WMTh{>hHm1H zc`apB`7;(<3ab>=)vuy3Ael>5O6Vvwv56$+zJj>cG(CeqqWN84h<+=U%xl^QCXXW1 z5kNHvW0Bp$XMQ*A@KLeGq53|VIgi3iU3PLUU|Tz;W)zzd4Mr{sYd`Lr3>rv*Vy?U7 z7xxIEt1p_xm|KBu0Sv~$(QhhP z^~0Q82=s+X69*e`ue0I)i16<+)6&cdscfyQb;$Cc?+l4+^m~${&8nM zPSGSv33lG+O6dD5^M$394Ns0Z0-6WLsb1&gLfyYyJ4jXw@>2H9j3w(w+QWtnPa$-9%FddICCW3g^wh?#5agS-G#%v7EQ%;*) zpl;XLT2ytlOIEmddc^<}Q$MqPgt2QFpcJXD)lGb0B|}2?7N0qaT4%?Mew|HPK*-UF z{R&<-HmKi|e56u}mD7pw74CGi3f8TOj{fe#RBoc&MmTPWvj0}a_hrVp2&Wxeqi7$8ckHfz zb)6!m!ae0O>aA71x60o5eYP>62X#0Fm`a%{vUitj483SSI90;Grzk%`weD(31()~O!FUU{dGs;ldy@CqRNi&_A5f!2)jISLV6 zo+xIj4Z4vUX=H6Ub#q+$o|$oC*Zqsxo9_L?y_8&DtzF_DOkVi5HEPzmYn5^%xcggo zK`*<*ASyjWXv%le!u8(RZri??b$LmJ{w*TBGrI}yd~72f4pFXAGeR5^j`^lt%Hg+X z{nMn~iBZz(*%a5VkD^C0hB^}Z8poWoIg(Y5;*LJoVapquDpRChFFi-Nxs?TOBgaorH*EEqoIZ) zOF&QoFETZ@o(igk*YDOzz1re-C=ql!r|K&rbsJ+Z=D7}Cum0++ZGI6UyWytzOS25N2uS{+-zus_@yN7fOQCEEhob|x1tr_1ZFwyh3t1+deg7)XC|LB;RWj4~) zuK%LY#@McIXAyEIG^Kdr;lF^-8ok3TYEbXvNuFOOI!O$Xe&#*6+mY0Ui)i-m`H3>7 zUG{GVI!!^k$aTHYju_mpRb9i>%$<}_8w5cK3LJj&Jk@}MdM0M`arj!7ChDhpldg}R zXB9*V^2RsD*)4?aG&m0l9rnj35ojxK2BaBVc!G}2ZwPZ(#1EZn6;-_Q=C*OfBo4{U z97?vb0r>7Vgzh4&y?GJJqzx0TOmLd6`mM>2!^)` z(lS@{xWtqq;62~)xofI_YQ7P;?tvA;2V!c@2TqcqRMCFsK;Dyq>``RSK#1h}fjigU zN0B*wV%UK$%-?hinu8TL?F!8yd3{-Gb20|aX+gCw!W2H^cnoNB#MZoABVIm;*8z~` zx@0>x|1(Plp6%jD$}Q5GXBTI^jy-HgnHGaX!h~pC*q~5_DiI=_5^!?6lstD~+&; z>+vByeyL6NwyRg)*|o(Z|K#OldX0;;bXw1P)!RL=V$#&`aH&J2A7HZ7p^SUlW3p@D zb^b)U+LLe9>D$yAQk~&x->?8FDFBe|qwS>?D_}XYtby*>?B;-hL#u2bv4`u7EjL=` zWoMj+7%n}yYUFK{zP@f;Grn$pMA{NB{oW>=Ii17rJ9ZMmH>DLWgdBN-B%;i9ZV4(Q z{0J(3JXiy+(k|^rJ)0X}{#^-1roFr+7?Tv2>X6iZ@t>MkG%VycPS1Z0#B%HORiVS* zI5tVH>@G)aO#`4v(v9Vsnje_}3m{q~`0$F>;q0|hge`t04l4hD42SdyARH)o}Snn+4M1x_w{19%`7-8*X+bx-|?rH=1jCcy58z>C~wVCbIi_rP6`>Oxp*XfE--L35Ye4M zZtHh)KdwusjmN7@W6{AM6jf%2;)t6 zuLLu(zI9qmY(H~(pQU*^a+P?97D2mgSEyQ5p_YC;vZyzn7Q5P%ugZv?&%nc4wFyQU zR4s5YZW-9MN~F69sFtK>in8P9E#BCDjqE`h-q>NWWbe-pk!p$d%3pSAvt?Z~neIac zNZJf`sfX`QpbE#?$Md_NM%C->bwnzky3eT(xZpbB7$p71Ek-u&`U`|b#CkF3!gAQm zvWE!1iNO(~1(tD%6|H`qTbK>B$FX}-u9;wPVTQ4Wp_%32-LdeNqPiBIU*bR_qx{lP zxV`NRRV0&qz6zs$rM}WC%87ofi|;Y&wrmctEVK6Hp-jDF@2Oj0q-}VXw7|Pc6*ikX zl54=GS;iaH5U(64*X#`Z1X!RXVJK6}gCq|kJvW};PV1JF*=2UHJO1{te4%auT>wK} z&l@zXh!1BTf6A|%QwEQ$3gPc=zXvOC=5xrH-FyHfY?eJp4vfDjCqs6)e8^iqzWD8B z?D=`;r6DJpNzylU|13hb2th|xtj8MNsWWYNv2f}Bq%o+X@9#4UcV))A``hC+|BuD z=G?RyqO?nXDunrTHFCK?9%?@x55fv55QSE3-6e~Eh>nC&UpAm>_U!aEE!Y?R@v2B|L_{pn z0U{ek=gTeK!5n1PQ$rkc*43NCQ3rWyv-V0j(wAX$n%Ul}J1O4Y`t-y|j-(MSFd7z2 zIxG2pA9sV%TjV6n%fu5WNm=P%U%5Y>-N?FLZ&!4odUifXNg8KI1zsVQJttcyVj@Ms;a^E{pizAaWpF8`};*(ntmjCfjqtkXY5kl zL(+{_>4xTJ))r?KU}R9BHVWecZ=*1TuQkl>|rnO0>k)p?vB)OOH#y`JqMit?leF(Niw zKW~kBs>nUj18l`qO}PsDE-sbj#@l7yn~d2)*>jkT$LXB`-o4?tLE=)Vt1msl?G?2q zjx>hLJcghBpXI#cx58v>9{A&vG&IIxiL2BaP0`~WkL(moOX}n<3SSlaRZ3(OK^e<0 zO;1%`dsWBMNp|B@c0M~i!8K(? z7|LqM3b^{vQZ5!P2hxm4Ot>}ly_TR1Df~3DHa?Uh0!d>z7=~8_R_B?tuanS*w?9 zw_z!oz@mZANVnt&wI9b%BE*&eMF)HTdyI#yY6N+QE}sdG~Oa^peZ8+QJ8f9Y-g(3jc_EUPTww~K;G)123Upkr5kVw4P~&WoQZ-g>7lm&7Z# z+lynf1RT)oP<}umw)(L0OSYf9NAn6sdfi`>iLW2gedNPX2Op4M(eR#~VVIL1jFayH zcc`y$3Yi&_s}D0i->kkz%NP?@6FHYdPyGr5>+koLXm9Xt4OxX%5OlDY005tn11UCo zwt$pkP<9EEkX0hwGoWI{iIpaXCF+K~vd7JxWom+z+r>;H@{~tfI^h(5Y#RC*&>hDQ zAfA~fp*?=~R~}}bjbPjiTa9r7_O-Xa$>5=|8WD9o0RA-l#|?X_D2C|a zmTEyj$3?qISPC5h%uZlHm&U-ap$Eq%)TUnetgGZKWyGn_EfMho@{%M%*R`T?ox-i3 zRoI`PzJ?UF4k?xFGnk@ut+46O?@LmiP|rOIT8kCP6n79Zb8&!;xZj7REDI|5%in(! z@>SxWVC9eifH?#i<`j$w@fNM0e%|+(mx;YoPr=^MD7z(jnrEv`As|1d*U5IcU|ap3 z1Nf$}RNS=w;TuPGQ;##urcgyEor(CTTi`_i12#hl*wNkX8l-y(xmN9p|#wV@n4yk=g2I$x6xnvxG%f zVJp!MxDNqR*MEqchc9M~t>UT{bpekY`qKvDz7c?LDHuz5b1#SK9|XQeFlF`IbvFnP zM`Fg6-LjUbZ*j^Z2oak5i39Pw7=!J4bo{! zP@_F#ESXufZB4dXyNba96P?fEVmILCF~mm>K%H?qlV@rbN=hTN3a9pb%a3u2uxOwa z(=E0bsPuPc5*6$o zaij@d+WkCMf?Eh-|2eM)xq8tCV3S~fNH?u&IPRC_}VC1$v!4i?U)qqawzhcVIt-5%lgMirSe%|d(l{T!9&08T3!M4og9)`>@tOJoV zqc2`Buq5pHV)UN8ie0<>#9mO;LQJ+rGfuB*_?#&zS^)J`Zb;m@6)>wIPRernYOn?t zYgg}LZ;;-S=^Vq>;||RV#8V3-#o7*dC6?nI>p5iYEv>vVqieVA{_}VB`hiSr6)KUWOUhd zs0y4U97fx`X(LY=mMWUqfi7#KJiU|y|8PY~3klQntoJYsH(b8F-l609u95e!=r@vu z9VszweK9KSO^$NQWyBXIxljC7EOYHDAo}6wB3)DQYDl;a0Ft6H{EM7xaKIW6XyYQd zuhBnA-O2f<75Zwg7N(21Ynp^JF)O-j0Zbxj%rLRb_O`RR*Kz4}gSZ3e~-fl@Y#=J%iqlMmuV z24Y_@@mfea@TrsA|H)EZBgr%*%~~CO&QQAAedXmw^^=Z8MF;yb>V&7`o>wA>D;CGy_W>)*=7iKs?D#I*_^Sp8cxz%-nECf<@hH&f?m-e>ur!7^px-ubu6Ef1v z)_HH^zOgDHucX)}FAl}(=rH}&3aVaCmAl>PS*b#vInOsAVfv1nmKkVP4q z0YQBSNw*)B28z^5CtT==Ln$i+YZ~zuRw*S?M5Qs+HcB(tYA;8ip}m3qB2rYtHeBlR zjsDsvgLa&lvLhg{^>R*bQAW6xpEr@HzO2unk736tB!%O?uP$&jav;6n66em{WxGAM zz(WU}DU_`~Br116cv33w&VobxNy+gs^qo^fds}zkVD7+mX%H;+on*1pO?`09`W`qp z%qo?SRa8ShlWUzI5;AbT9uJF@`j&Z5qI7!~K{HdRaGoQ_lx>xI7)FI*+9#qyF=@N- zH>axrk>i%yd58dG+c5lQQp*K$up*LV(I{rfj)AKT24GY8~r81`xsB zF=z^EiE;kG9q*-7sIXpnkg>UMH4F@!!o2NX_~W064l&EG<$|BReG#hJ_w0`luk zFwJcG7sVtYw?(C8`ng1OtMCoYF3qrEug`#YqRlKK zqWfXX-Nj+%m1vf8`rRAcI8C-&(N6nX{RH#o?Q_6opijOLbD)$~q$XGGC9Z{m@!KwC zSnQEnc=3X=j!i_Hui>b=`{?y3@5mJil#xoKBjz(qkt=!;2#X8*K>3Zv(v~`>C|GB} z8!*4D0CdZ1Le(x~5qI6NJ5{>k8s-URQwJpIKgxjeNZF%TtV z=crAEB8@Q)lf*|F=lh`1S>EsofXcX?PBf&Xx2zCwF?4&gq*E`%pNpR>o;}Vx=$H)3=QVdr1J#2PSy-Tu2e!+f?Ms z@%;H9He^Z1HWB)L$Ye5=#-`*fh@=_Lb`@>TzV%w}(8$id3(wvQ*`zw!?R0h=B* z!r7^_MX#`1&>pwgAJVBCNn#mW-!pH^ou}*PYLC!xrnn9o-P~Mkbw1)+^Xx0K7s^#V zjGIGLD+exyAAIuyvS*j|+38qNF6}3_u=6#8>!J^usXgc$@|tdL|IytpQ={p9e_ks3 z%lZm(YZs87aek6r9UQoJJK}rg@&-7v+)I zh9Xz99R5TtcgPn42G6+W-;E;r0Clm%1@+5ecm}pdO@AE)jE&Vw2IGr zf&z8(O2k2}8B8mr9?{o|GoWaPH;0c%m{a4E@B-J)-Bp%oo2`;AiwMtDtx{&ApIjsMZH>ht+7lt>wH?z!-i6#n z6z?3!#>kiK1~MnZlRZi1zKr4RL^owlh-fqhYpWM?QWs2rt-TA}h_ma<;gFM3u@1i4 z)gIC6@7Mk&otd?^jC(n>846C&1H}`x`35}aMHZbjXIwVl^Ov6>(DnQ--@18q_^${` z?v~YdT{gdv^W9jUx-nO7IcG`;CQ1e1+^~|>dhuF!FNW#xp(aexWiJqs0}^SM_Bz*`GkV4D7J@X#3jb8Wh$=`DZ2g{`3pDxj#@_evKI)=7 zaB8)pe}$pLGjQ=P(f$11YYKb2>uW-bI*D3J8L;Mb=x=oR$t53qTyXxzNLuF1dxB(iQF) z?V#Awunw_!cRBV`M$Sd6Np$kCsOf8}VHnHhZ_p9lX~eEMSDXUoyF(@m>f%3kRy;h+ zd^*Yg*RgXZGJ0g-;@KQvNJiY=Nc0(jvyKna?sm$;BL-^wiokh8w>oO=ZD#)|N|gGY zOgf(fqJ~AWe-B@Gz~Lh+<-N9kq2Dge-jx=?&y|XczI@=`o501Q~T42h`a0l?UWwey;1<6pJGF@Qr2vsih-8IBtL==B z&a??wvj!IKiCIy$mrc=G3n0JV8s)&^D#CbMGfzAab@D2SB5c7noidM3y20t^8H%n8 zpBq{KfO|KWGU;TsF<}OplDEr8S44YA4hYII;cikDR<%g#U{fx{$qhH0DRTYQhI71I zF_xI$bRb@H7VT^m_{(l4sdjHQDmE41Zb#5twouBRnqo zbs87^I$2se5L#&THj!Kr%4bp6`Bw|dEcVO*y`>dVDVWjxPN(?SL?(LPN8O!MVUlWk zSJ@yJoIJ5{#u2Ri=B3)`rwLC+P8C&-ay5zt4~D|5dbp z6SD18xj4eULLbju{b{+t^_e3(PwlnEQf)7+)=WcA=j(vseGKFv)Ah(@GQVmv-|^t9 z6~A0+kCNko7v!i;66G!Dua%XLt9da#kg_oXHUiw{K>jvxrufA6MFsc0xQ~5PiK_h>pKyx zMq;@1qm>b8qGJW@&XJEiq9}rFEoZfrD#&x*<6Z$L!#gA zS1Ld0-kLro8&wE*xymg{Cwiua$JSN+T3Ni9Te^59RV6azetFDZMyY|mgf{{6L9c6k zZ&qACiw6u-EzMOls`EmuDosw5?hO(eM~;E!f9WB{Xl?4V2e^rtb+C4ER^zJNr%_mN z)^9#;?==MT3x%n8QMZnX4>L>|H7~D+9Jc+^OL(j)z0o#X>C>8Izy&h-HU_aJ48xoH zU@!ZNn;Htkh2fgxA-^Mv%!SfR<$LC$1FSivq$@kV9<=9i;yy(?1|MWp=S_3#n~-)l z;T1F>ig7iPL5a);pOoQ9Oz%sCL!Hw0rtli2b}CGITLDq@dOMa>pB& zeQ*R&dS9xFAsMVUT_IyLvz3Bn{mZ(UVhz2C!PEqpRZjc7Ed%rF)(lP2RPz*13PC2t z9mCP?-fe+zW^}SbO)sLqmo4c!3Nf3H_pf!WjF@h92jNJ9p+vH9ed6SP8OFf@LO?0z z)V!u-I_uxD-Cfvu59LlE$HIkSLkFreuzcC7rBsKct((8+s(sGh9OLe+EWk1m8a^a< z&C10bm3@8l6mdTIF3R?+%R8osBC_baxmnB57S#=g?ZK$y28L9@M0gYq<|4n*8T@XA zVYiguF{8-aUq_UnqJc(VF)O#%*ZR7Iu!*EOOjmYsPG@7M`-*&>tWEht2xstmV;N!d z8v+}>XxcS+}`txk`c48m!Dx$Y1q z!@RyDt@&R=up|DQ8mlvy5^`_7r{aqFdUXdM7kp(?RkbFUbi&uH>N3e{3+8k2BjITt zN1Bi_>m0;)Y(6G3AF}}@!CP`h1CPdXNNaBJLF;l{ZQFDS_SC1P!F%$M6e#P}?yyGI z&7pcj^-tfOQty&M<|Xyz=f&O9h36N8{{4PF8dMAG&4Pb#348m0WtcCcxne;7vnH&~ ziYTfVXQ(b31hi@03-#(#_&^p0QiVPrs+)g3JZE<<{5lq{s!cVfzS30DuP7EmwZg~_<` zw-cRoJ^d3Qo}pV@-l+UNy`FxT?|bJyaKx1=?W9MQNE7`c+N~h|T8f{?wa42>|FvsC z_^sQV(9(Cz%TtU`$7pAbFUq-Jn#U~gB+e$3B~^=GY#Pk28T@I6wAm0F3uNC1yvF=E z7<)pw7V=Lusbp%a4V{;|LM|)M}8N%MgACe`~FIU z?`)9Z*@uSpr%ms17(_!K60T*7M-4QJT2%=yx2TKAWu;3By>X#i!Mgm(Wzi{+xUD7R z{BfN9sBChZoIXD#VH&3)BYQ>OG4XL|XO!AAf+%)gQj8CJ_k)&s#85(1l>Za!TErTk zDfh=Ht0%{36xnnYUfCURMH91L#T=o~NsQ#Wj9?r*m}Sq8g66=(jw?lS3D<)q`%O(C z|H4p?)cuh2IEFxd_*ZpLZXVoo+o-Zl8nt zo%9gg>;Wm^g{p(x%KUQRKmW(*UtpOXZT^yEAKe(7PHw+HT6vB{Jg#J_<{#*yTm8$z z*zjr#^Fk;jJGhphP4F6~uv)3TGyUU!XP}KgBvxbvdDvoQL?RylZtvC`a!av+Mtmla zm`-)>#8T&K5v@Nd#G=>&YODC3xr`vb{!=TWl|#1(JKX&(>0vhVvL&$eWr=fx+ORh9 z!o8uT9U;R4OTMm3;qQ$P)ovdlGliiMgtH1<#Er$~oV#Im$}b=xmznPbnE`+Wo}v8U zA)p9cg=g$3w?cA!NApHs<}jUrS7)ThDhl$mFYr+{T^Y^XCDOHgQSXk5kUXSI^OU7W z?i-dtIdLCakTv&xY7FBtzdef5!3QW#hn*ai{ z>tdM$1f@Z7$_EXC(Rdvk(l9@Wfs*;jvj@fAd%=v;8&s-ASc zc}|#Ztyy$XoTdWHDcw-Z!Y6eR*QLbhPZ`r`BNcDDZRhplldWS}CMx*s70&Hhn*{XuFm8X^KH$dV03MR>TlUYPQft9+XcF(XL}ZrgMN-f zr!mhQ>khlFR9p9Ex_&F2<$BqL>Up0PwH@F6zuzQ;!&a5eS*P4r%0h_LnKawlkM-FG zR~E>tTxVHW)vqfd)d-9q0iTU%uk((?2Jz?BrC3#k1M`>`TeJy~vz;Orp)0A4F}Iz< z;b#iw*lxv|#fdGtLqdN*pegoe8M&KeBh$x}0v7=H%=KCD#lyRO(zz6d zXGI%h%kesj;K={9Pkc=^>x~`qUkf82ZDUx7&qcmP5;_ z4iw^FS&9AQ zep<9q!sBwwf%GyXcn2B&At-nAaZjCp#Pexo@OYQs4ZMu_ zlvNw>_``UCx;lcJba1_y6#u6s`urKvQPf3KU??=Pvn$;|vda4-IS3RwBxl+=MOazd zLpJOevPj>?%>O5pP>^|m+5S7|a)-kV%D{_Crt@Y_nx`xMxY=7{1TLP`cq+G%(~0C` z=rhCf_0Te>JsCR+q>P^$qk&gbl`$BIUNp{!UFoOlDH^9PHq{1^C|kj z_O6*Q>aErB2aUtnXEcG{^mfF8JeckbYc19SVciclSS8NnW~bG*z$$)s3rXe|9G0pE zd2xWqe=;$9Fo2jeNSV{}tG!%_Hok(VBigyUN(0iHzDM3@kb>q}6HE7UvXO8Eh0glx zkW{LB8&|#eHMv4or|xfW&@TdJ8ST22Te?dtiiKSTFrZVb0lhbV73`Tq@zTlPSMch+ z)oXKrN*$7~vRlV%YSUvckgUgHAjnp|QPV-$A!cZ2^5chL6;&5RSUDBE|HbdBOVy0V zzKoweV~28;sw?_&xH5YeNX~F$6Lz}dn$ZDOFx`eBubs0?oJ=2rE;9<>izzN(By3E= z*M$ICc2STkC=CW=h2)KB&OwZL&RZs|4)jaJL0`Jhk;A(7dWPD56xIjFqvqFVoIS4& zNM+!I7SW>8dBn$58-M8a7(nyPr1i)CK41(*FStAy@TM>zeDp)3$ri34v#L{ccKyf; znESG9DdO7~)kh$~YiYT}sb6&2p+DYzD5PtM{Nea2Y0@|jx}@G1<#&2M&Qdzi0l;@I zYZs6|{h3tT7S7a)wek?hg-~vN^qiz#0=OL>I|kl4$;!Daupg-x_6cPP~6XalBc@A7@^$$&iFZv(6_Bc@Ky0`f(o?G5g(a*f=o&CF! z(!hpM6DWZybFgijd2LqaG!-NVMX)eW!*vvUum(W513H|f$mlfw=Hd3iT<0-+bY0f- zB4oU&vpl~+q|&4S!pA+fsCibc5Om<*2k>4DC(`HlG%sHEXM+QJ_SBE}c1 z*8&tSkd9hKx4z_L_N z9ProKH10vKcBI>|L8o}=7v*m>f#YZ^)}pGYjfA{wqPjuGN;kKckz8j zo_xell}GbTw1BtI{7FSNh-u~)l44`~Sa$bI?;q*ZnxjeBxkSEE!b>=hY`+L^uRo>U zEPW{l^v-@e+L(U{795Ff0Z#j0n)YDov$kkvFS4r46yLIFP-Cl@CJk(&cN>0U;@u^7 z5GAZvRyW4^D$<^>L9e*lpy^^qA>^-Xf}N#dL;){7Iex(jhsG>8v6`L<+#}S8nTg@0 zXp2m2LP2GTGeF1Q#wa-UH-mV7j9Q~Iwgq_4Ilpv&Y`iH@gc$@XNzExOrOm`+M%rr- zUX&=F-D`ZetGF)x1aFxMk_r*K6cA0)6a`ynp32z6h3jCUqWWdFK|Kaahd9%h@3Iol zogO|}J)o#=x8==Zn209fdaC3u(A;0=znLWKZsq^A;v8njXVvk017!AXYM{T3p?j=m z-J%)yz)J$Tr*WX5S@GGtte&g)olfyr*BHt3-;Pn%c&f@;O6BNM4h!2B#%7sRCAwT2 zEcu(F2~dEb>5 zA~CHoE1&Q~>uFm;Xtf|c`utvMRD@LI9)Q+V#>iQGCGVxYS>zZ2zTPR$9xr97)-punDyV|&TF09!)TJ&aJ zrB@fk-sfF~*_WL3I=t_v>Jrze=kLLQCLyL+%+0>Nt+p)m|7+OKvJv=*@&Ca+&knez zy~*9#!oCRzA$p5j%qr265LQeYD~G}D*ZawKlG}=RJzz`v-=c!+g{UOr`)%UD#Iv>Qkr$bvJ z??p8m?nogfD}BqUzJkDSIdTFl_e7y_8X%XQF)joRoA&HrbRIst$rL4Re0AMQtAw(bxIPkulo}wt zG3nDywr;M6ux6$2>?>}c#?R2U$-nyHT{t@+BWHG-dL@E(25aJOx4_*jQ8fGxa8?H< zA(|i(Bdi^=QNds8&A2Fs$HJ-25|oP*uQbgADy#xs%wfUr)^t3ZI8A>4D>0(BT{sbv8r~Wx{sYb8i2RQ&X#I-h$z3AWxRMthQ#WRDqsFEWAUW5S5?hi4y8VO+i8C3jIEN! zYmrwtPqz$J^Q)&<8Cdb4zjKLHM|AnkH*ubd$l=rmMio{nMwCRo-PN$UfpJ%SztXTT z&x7isLKxM8-?~JLM)|GfH>1K&ZM$wTO5mAg@B}X{uy(A;mHN5-^Sz8yZu5}{X0^nn znfj@Fx(e&s)A9P?kbo-GMFgIUww<0YQ*j>dT+P%JJ{nd_!eTO-{#Ql~$mKe&EL+)3 zim<~QjaQ&~ArH4<6$AVWt&{}`Tw$PY+Zs!+>zQozQj8RS`Jx62`yihs>aiRcH!e!t zBb#K_%RF+Hwm5O@;0E+f?`IZ7(gEE= zEdo|>Aio3(1w?W*xh37Bk}-6*x#^OY#|_XTPi!LQj$_;+v_?9&$ik}Mgdn?Xtm%p* zHD#Q{C3TD5((8q^-dy*|$j5#YUDuoaHPG;38Y|@@A#-guTN;h{;{Eoh=_Di1cajS{ z5q)jKjS|x;n^{rz)2Prsop~^wL)@q+`CM%6C&Uy+)6efi?>SK1C5cLcJ0vz7;lR&$ zt?{gnXpBWNoj@=81Lp_^$UCToRgpaaX`(E8XjdTyP6JWUO>ZQ)HlayO;}`9FCJHSe+;V=cC6l!Yi)#Wslo<-@KV ze0*_tRxxuJkHEQZC8ik?+LWrVboyxcauGy2pjKC)to}Hw_~qV&@;8uS>b17AUZCo9 zJGb%}k#@t?S9YTAM&j_$JsAI0Tb>1X1s`Ufw&J?AJ|wlyg)kJxA6j$8-BTH=FR)y$ z8)qVl$PHbc8stc}5SUL<_%JO%?mt+IoFNL1;m}>Pqd)Kts5%gbR_+-$cw$!L!xj@yS>C!p0hP~n-+TMzRwCB$uIbe)FLH8%Hd_{{ zDwDOz`tkjpVp9Vxq78{7>@D`|kLtCfIXfcG5Jb!b;W^JYZ~qaB4KT@-CFw?J%OjX> zK2T05DkQ52W~!H~BjMdvdLOVQaF*cnb-*Z!u>9{Ug{}3@JJ$_8lwLFr&ijlvF-dh4 zvv6QxHtZl4Zl1+8_tPFn8O&y(wTziXOFq%6=6bC9ql@Xq#h82OSl&TnFFeuy^u2&{ zf9^>0fDC=05$kLw4PB;tY)*>Jeq)BAw&EJP|6`N?f~(}9`x5B0!S4{W5}FVLW;s6R zzHOELit!@Ov_%l{ol)uQWCUBOhtHr)#PimiRco9<32nFvwMo(?Ya@5GV-fB32h*wn z3%2t8V#N}=ZyOh&=S>G=GxF{bJ9Hyuf-?1Tm&^IR8dDJM7XW>1aX#A|+xDtlOQ%t@ zYv=~^hQnj+q~$!Cucem7(h5m$9ba8dIl$VvtY$JZ);Za{Xwue^%6DopYPv$lcDrS< zx~#m$K9wEoF>je;xG)p>gXRk9R;4)T>e*XYKKPI5QNwhfR zd+-}bo+To1dmJpi`hmP_ihA_AKVKxB9{KB5Sh6YUVhAH;ecp)<>fOkl2n<0w9m=h-7_4DtQ|xt-;!3-{G;Y_6O(vkM3Pw<`+yZ z6*0e?JK!7#?ZIv>BVglpAFAag$MB~_Y0nWq@A>_v(x$UUY#o<(BwPVK%kKNy{RX0W zCuDcjkC`-ekyj>T?4NE~15+wnXVyGRldabT@eMe#r~_~tqsgKhCX!wQDU1ipa!B?T&B;)tCA^MS1cK$#QkkAJPsrL>c0LnMi0()Rs5I`zYnO)Rv~zfd!%TmxHzx z^N(5;YbeMTQ>+U&!bKpF-w9<6YE8$X(P539D$MOkHcfH&yc)JJrc?%ISayJ^Dd=F}`Yl&gkzwVF=l5+o)W~-OOU|m{qlIwhoNLmX zEWN%6_rPe)bNA?F^%m*!$9}%^=b?w^lRmAPv+|;}>xSwPw{Hg46WC~UUgg~g@09?~ z!!%jME6s>6Q^@b zDy9DnNUx)hrZiM$d^~o1qSDutg-gLqB@2?`UV}eO`~C~$i0eP7^#22Lyh~lA_q#dk zKX2gRKf3xO*FNCmJEcE3g50 z{vT^^9aKltJPHR0?oQC)?(PW^+}$m3aCdhC1a}VZ?s9N-30OjpA`1uP3*3a_s(FLIu$; zoEvqXGg=s+f8deFp!(4d`ax5P_G2wMgILQW?WaVeO?(MTPJr90|AqfgmmoLyAUB?X z=8!s!g;Sx6NLra7?pn@v)6JA77wq{ZCFXNg0J2cU=(d+$YS zjjr7*hJ~VE^Mbb%P682IsDE-U<%xB0C!A1)nV+P;%mI!@etuY)UsaoqMQDe|NIzbP z?s&y_`aBYQQ7kaq_ovV|)8=`#Ig(>1S!#G$YZRA|*M*W=a*3gm-Z0E&Un(9h`Asw> z`CXX8Zv}mz2wIx%tG>7$V!S-B)KuT9{d73wA?VkNa3JGDv=#r7T4V4$z?)UP2{I(s zxYESu?!Ne^@?wGBMe36^y-i(|nJ#3WP5AHqLZfye6A6N+H8uu0dV)hu=j9Z1MnT8C zJI2`uYHEW22Ev_B3vt&SXmc{_!C;#TL1oE65eq`2Q`4{$ZncB!H_^ZRDN~#e|6FD~ z)xoQ*RLZ&&PWb@pT}Tz&N<5SJiJiZs6XEhBxZd`6dId4-EGt>t4^lw>#PhAz7t&7p z`>T8`jk*C^q({vhv$SY;p{lC58!J-vU8jKKu&msgB|X%A;DU zG3pXl>dc9IkE(Phy}i%I$#YLc&=NvYs^z4O(Tb;jd5^xb^tzm7^Jx9GMM4F6%H&%r zGM|4d(jU6vYc^+B*Ta_-!b_8~`GcELS$P&z=S;KlFqrL039-m$L|en_+J{=dE#q5ChBNOs#b4NHsnm)3G<8eego5No0en& zD@+91PXIOh=VMY@&G*iCPp~!m^l{id^Y+S8zz19_3uq{c>J#&ZY=oGbz=FQH1!gAcpG}Q5#%{_!0(*%lP z+i%cl$gWmAsx5BuN#@X1fvlrdRV{4}31n;zasK%5jxZ6uOg5fSaMD5jj7VMuXpaByYHY{qir&QU6KvF$`aR$>m&U3E@&>IaSkm_#8zIi`iVHwKZPUfs3YbVrtYFCBY2COcpUj zrthnbGTuI?g4V=te3isa!ncqa>)Bq+1kCu<>p2e7$nwz&9Th1TZhY$`;Ui$PHj)g^ zAlDDI=6S@{H^EK6rtJ1~qRkIlpC<(Uh0PBB)qb5L=(l>;u0{75ltge@r=m2;ObRR@ zm7lO1Ks(Y@vw6zjPnaJB!2j_<{CJ7CDI^d^z2r!AxH-danmCmYr}Z2m=q)@jBXq#) zad;Fx`#9%}v+4qi{=o7fcz_Q&KejVU6Wo|DnH2KZenxTd68viC*Woh+g6$%k;(EoX zHm3~B%vj%Z)nZgxbQYbT*vc_!$oKTW$j2L_a?MZQBcpHD&Hz^Y63sgQoFrPfSmWX- znq)sLp^k!m#`_y|E!3S97(I)eG`UR!Wx}ia^9*-zDR@m09z~pwAuM7+g`=4o$II;w zDP9zJ^PUFMtz%8uMiU8meUaL_9hYcU zNI4`er%Y+FR)4eW!C}-DL=uF3$8wea0|bj;BxRwOHbT85*?tV@+7g>uOzZ0?j@*&t zQKgi9piQhooJC6??ojc&sUD z^6E;8%^$)Tg&yxaiWMlB9j_14%spf00z0eafG>Ls(c7P#!KZ(hHQOU*2nig0`G~1A zA=B|&`t8&~f$8$%!BA0%Ub(V@c+4eT+Vnx0GAt@q_0JrJ{FVF2$0?s&A>G5Q7*m&O z+mCr&pCP3xhe>Kpp}y<*!;f(byU8?jy1v#!WKOk^Sk*6+ZPii8jA~7V4EUs_jt%h@ zTm1^fg@MVI2nG&6n2r3bjzyHw`2q5gY^@7hZiG*SRqfWZN6KZ`H;`@}75{;^7^@6b4L~Mk8gv&zv z4v#B9nY$=R=AQG=gDAE?Iz|gKy?PT>b z`>-|vv5|l|GM!z{`3Gd8OSu#C7G>5<-Npd^gJoJ9yr({A5N*;(IrVrs<{$K@5|uxv zi9R&qcFv)<)K+7krxKX-Hd~24*}m}-D@wVGyHOeVYF7YynSoBI(yxv>=(|*S4#R5N z;uJVZ8>2IpEsd8c=k5WE$HeUCCQ5$_JxyM_Y^?=Fy1Q13&YA#YbjgWC1XunGn%e?b zM#F1aq}5qQ%lB&9blW*r`J)R>H?!Pv5ylIwtMOu7GO;d! zuBs*tZRjsV;Q=O6Nf=^fo>S{YvZdpk#+#U43^j?hu)1u1M;RN)VG_PhAgj;o;6Yt?Cfw{0^Z7>(PX6^jXsDbc5%q<2 zV=k&-&iY#fb*TzErjWhpoG6`5tgjhbb^|Ds(KkgG!}Q_3e+g=s`Ie<=B%&+n*pM7s zDFReX7i;PU#rOo6oh2JrR`=soJ)s!@a8gYMU-|9XBgNv@A-~sRpP5sra6yFoEkX-V zR3uE2&1$km_v-3_wT^xCUi_uI7Nf&zZL}IIyvop4liw=Xr?|HDtxI>h{}|q>6!695 zTMl0Hwe6_gIkD@M@m$`FRtKDD$z^NkS;p4Edc@JTxpJ&n)$qz9rz=o{y#xLv0M2Ce zr%VRP{*ifHw&reEX5+||VVo!My+5AA-zRg5g_F$!?}v2mP1?d(>jC#45;-Lc`M+5WVXuN&wO8jlHY632cpe(T>6yj6{C1G`|Df=)20S%Ieo*?QTz%1&Qpoz!v=Y!5p@N1cDYeVUpuaW)#A2HnV^4O#A-HgG66?#IHMnP*m<2Ucf5?w@sC zmr*KUy@C&m)YG1I*8?uS+V#j@7rwu+{=UBpTgb4s><~heQgxag(@Px5l!n=DG;{5O}9%LZf9^f|6Os=-6>K(dh-@lnQ-8QyJ^8&q) z{^4bOF;=jGFW|2M=h>z2Q;hLkRv_p#rz|xoJ+WlVC}7&8GV;OHU&ZPEE1jGuo=PDV zXv*6*SH`Qs`hd<+uA!K;TrEndKj0zpjohc{;pG=ggQ`U(kJ;_fTpy+)(uObhcJs<* zmN6!QJdxkO!C*`6e+DA{M=)524Z(MJ$K%|iT;Twkh!xIse^+G+##qP*;#x&o3P>@g}R=J@N#qb_{R7hb?{fKp#(fAZhWV=Zgiz-yu~^8{a4!R4ZO~}uW<}W z-#hy@Qq#mwOvfaKj-i9B^QHzL&P$GX_`ouOq#pMH{f&V_SnSRJJy5Uyjzr>?H-DW$ z->I-+@snj^iJrMV)P52@Nfh@*$GFcj+5-gITmvZJbn6+M6u5g%%V1B&>s7IZkhd5s zw198BEdHEOaAMBeI~PC506joGI+FISUF8$1%|V?ju9fowR#UL|F5u6J+tOQHUPT8L z-cYn@6+Zc$0Iyl*O!lxK_sN$aAFTZ=1cPN< z)}_2Q07XE$zc^D-#9;@YlZld7>gW`m2?i3>0`g>=Dy~J+%inTJz61>p%~qJ+aVR>! z(CVZ&!yhXUU};b%lCZVx*a>=m3*%B2o}B`vNM(ESJ9{;!UzY7wIHefxuO4QG2I6yM zbM zBWWemvUIkzNk@71$YiP3qwuy^xVNC6&-}e{zvXoLkSoA8+RvOI1-eJyTC_LMtQJj#DN$(HU zyeWAumxoL3Ks=-4vzQz(m-yX01s+QDA$)q%g<+SX6G;(9uW9tr-trSJ*J!__K4gB1 zbRapRvL(^aYlB|MJMTket0`Ul_ylb;T5l31*&h+)V1J84i(*4buBXe+EXcL zzLUOKD)Y>g?wDgg8*kTbR<_}YcVCq<3?A|%lD73NP#%t|essKX^LU9}{kyIN{jH!F zt@?jNa9GH%!S$ZWpy=@KQIFda1MiGvw%p1byG8Wr5pgI-^i$~7P!M@!Ol@@i6I`O7 z(4T5~_rW+{gDKFsm;+j6f;i^#EqnxTCd@w-;xLQdHm)pGIxagqyeF~!YVuVq9*FlC z-#6_OB&ytvEW(b85Ak#^OsR^JS*OwStC3r*slG{fMXRde!U!RlC7b28Y_rbN!)v;k z+nAh;iDG`Jbk$gI&}p`Os4U`($+X?QpWq1XqFbj*pu5eAmdqE}KSC>wP^>KGuc?h| zm2{y~3LtFlU8dAa2vC*K?yYQoR}UF+Rbr%Eq}l9f&sm3Gp(F1?Ywg3nzP>c$5N_cM zpeLU-i#v&`3)G2KGRw%+9_sq-TpM7ny-er$LDr#aUv(>ER}g}{D1SLDIdr#aet)ui z@`jIyc&`FdW+prz$S!e46-7WGLwhGvo~wObPp8 z@SDpsWTW6HYvoUYaH+JOFB#P z80BXgJojJgu|sQaf@?w}H}3B4l7A>J<&*o@Jc$2MmDES; zjiL2&!y0dR<_X(-njBD+kXQJweW%{*a!$g1@pGGO8K>P{hcQKaQbic76LGcEYTXYF z!OujFGqAc(oI{+^DmkTdFH0}Naz54VaB2Yy1$;Leo8{@__-~oHh61=9?0a5~(kCAK zT`$Pw4HfHyO4aIT>vnkgrWagQwp}aF7h+dhayYc}Wbw^00 z@o#$3yeVCSgiesIt3%#Szjom?GU_8uNF<`8SqX@GdV$-{<4O|4yDb*5IQZw?ah~Fv z2=sIfJ&bkS=fh4v`6@*^znsVTepDc0YJ`7q8;UX#_JG>1{X*G2C2kH5)rdHKs%=Y2 z+ZP}$1&rI{wn+QCIGntW7)63KIlY`jyv*-vk&q=W_YIMNc*oK_>*J+C;g7wq>H z8VpMMS9Y98t>3^n#)s22fbBXDcierocvif7)4>;rNcS7!_U~qP8w^riwCwboVf4k? zIKit=gIfy(#o~Z-;^Or$=HG;;kQ za=(5%&1>l;**-eCLJ!jQ^**l-&XvMTGj?npJm_*n-0#b^{`UUxZmaG)TKRFX-&`U< zp9Cnpu29WN8m(9MP^X)c-q$Mqzb9^7qWsM^|LRGE-}j&Sgbp`79HbFesDj>zZZ8kP zYN$Ef+qcGFT`++;Np5tk)U+Czae9Tpd_6-QT#8w*vem|KdDHT z&FhqQN&5X+5W9Dp;h#LXxS6U)_tje3=~6WIugi4xlg7#&J=Fe>L?&U!tY} zl@yjb8W=&p#rGqD60Ptn*T%@MHt&L@`ER9nZUa$6(P4p#8WJ_E@}ZuCDI*J->WJ&I z{|6Vk16wY?b1!2q^`a&Vc^}>CiQS8}mD+Q#o_DEUdsLVnIH)77Y{hG`Iz@NR{)W_p zm?VOBsQKMnsD|6bZq5r#eeZhD#OPqB@Hf_May$<__uq_E^S2;NQKc^Rveu&=m$^n< zHQanAS>mUYNmh9g5(7wf;|-X*(ie40KN&v-KlMBH4!l%|ASm`pnvw2~K&e0l>*%Sw z4hWdtxlpuc)Ln&Nxk&rJ`m%a9MBN+MvGP7qO6K4dUdngBxTC4@af<*!PaaNqfY;uc z>mHoy{ewfB!DV~kqC?HaB@v>}Cidks!8p3-1E!GjcQxPVx?O|5S-g(}Y91c%)>dLKW%O6wTq6RY?svVvl zPM7_M301OE5CQIrE1Ru-rR|n^<%Q)Z@at@ zDjeQ|e^J-B77z+mncchWjQk8$aB|doM^*K!mm@^qMsnk1H8?M<&Z_CJCJnmTsiCXmMDH~OZN&P z12IVK7{^@wNxWwBi=dBpnXuUYr;d*$ zX%s?GGD1uS-wB6g0$t*aSL^yJJJ0^ZRgCWgD%1y zs;7DVI~X!#&vD>bqSG*{WCqP~i}RTrsDvWJGcNW1Klv^0zdSVvq1&tt8AVDCXDLui zgkjn&@7rqjQ(Y9X+p1~;`fVxHDag(!WqWKBePcNA)-TkLo4d149$t#LB%xgqY8tOG z;@W(%2J^d<>PD4x%J)do*QVCrc~p8D8`$8f_OUjd79enn0_gA?N#*9FaiN0^y83g+58F>+P1M+JpIW{9r~-|ju~eg+LbMoUKGElC$h9xo7G)D z$$WgO3~kw!p!oXm!<F=m(_o5$RbVol4C-pVkAS3=v?3RKP&?}&+i%AnjTiP3(GP7z%QC_i4Ru8L)BQ1NVBKOkwvSP1zGHM z`g>B5A(&A2Ugq1OfaF?D*V6ZNLS1aFKMuFLF5T*w0(r*A6Fnv}$s2?MO=kaq%yimV zE|f<2>{aEAYW6z%NgSe4RciJ!1~FTpkHItqTSV(PIJ((_pfXwL<}!i0mcv?g1ER~o zhHm;8SlG7^F6=ecB@Bedgh-xQH34eJ{$TnnX0P3dFmldn;l;6w#=V5N6#K@er@!gA zp?_7@T7>>59e3yaX_L+8?UBMTGSpf)gl5+CKu1CzLC_~T<#4oFGRaXzCkH(pTWC~SQEp17c!2(@#!+LjZ@rcJD|V@30Rxafr$1Zoe8|oWpwSoimDDtn zXMRa^Mi9COeY9@<{_}R|_kZM1VQz9jYd~M_C^YLyMe|JAW+k_Z-qj9V0i< zHaVTj9jw*2(x|SHgAb+2hG(a2EqFsq4&D9QbYYQkmYtHBB40FhcS@LY`lyhguP{LP z5HnK!%$GzYmDAkgpjJ7I=JJc~`C7uT^3*r8JViz?VpRnV7vgbkb}>LU>vK!@72KwE z(A@AZhI12#(lGivEH|eK#Rm1%;vPQr2Zy#Dq2gOcPyXB(M8>jCbly3`*`_==>PD7$ zW&|~l&5d#M_QnMv?h_n$vnfO|`5BJ6I-5?ZWu76u@HXtL10A2fg|`f}83t_+gSmCCc=i83SRrk9YBx<7@-Jg0L9Bm)&w>dXz>Z*93Ra8o);2u~|oofM|uvH>U5Z zPOyPER^gS2TAP}9V0E-zp^kWH{rY4g&rAA|aERdMq&XfZQF!^2Dn|pI8-D>=xdXh* zT%w|dup#p9?zg1h%M5x_Yf9C+N!&Bn$x}M9eXD}{(69P7*oNOXj9r9#M+KkxslDBD zO}J)91_appecmW1Q7D}^?mQPd(^~GWd}N_F#Kv^ex#y5Noh#ejX1>_v%_a2{?N3x4 znB33whT>k82A}b@mcuR!C$6#@1T?=`wo$sXpPnjhuINB-XnTzvL{Wd?27(qg=q?vl zbP}86mtCTFJAPdyqwwbAMHjiuPNXOvfX9w5UIMsT0y|SWHA|=ET!|#C>*~RtRzSU> zMVyJM$WBuX&C0u4vm4s43TC}9Y}xH2ZVCuV5HL0^v(DY--|$bVda1mkcKOG}Bx4L1T9YI^llTg@o2U^ckdgG;G8dSYj&&>x!|8%@CIzL?tc5 z{>0zwFgA3mq%!p%TQt#mLla&~cke~xHnrMb_6#;QtHpl0@C0O(;kfj(Qcnqwb|a9xtyV0ZTU6Xlo=Y~o12!c?~h zhQzh7bspwil>-iHp)|A`ylW*U!kZLa*j5wUrViQ!meV^sBf>1ieQnKH`U$ACP)^ zR=2pXoxxpp_OGAcnWokB!T9&Kh9rIODUe`x7WrvLtk*qA_b43(6j9-jO<|+x>2mI+ zeA@Lse^pSYqysdZg9qBrD8l-g)EGR}cN!=YQd8di!p531ciQz=mXR+}wqH(NoIHd9 z6>YY*TZgS70(Z`nNG-Otc|a`-Mx`PGYrQ4gZS^AwQKr4~p|i8*Lq7w9^|ftgZjBVs zP1e?`pY6pYb2G7uk|9-W42HA6E82Gy%Y0(%u^pxs=2d(BZmy8ZNFIE$&}j6Kd~);4 z`L0y;Oh&6a+CuC81QW{+p<9w(2g`=bUGn%*V&=-5c=0GHf$N(}^|5z4R_G%F( zk~))<-{X8>_|)raJfOY~$u{NiKI~QJ#>!`p0zU7GbTHb!(Wqa#<>Z4}+pOj3wHQN) zUO{TX6pWdx(Yu)zOp$jeYY@M(3DC4pdfBWdt?3I#lNMh^qD?5!0%&9cEbOCOra}jr z1NXjU8*(&x(5a7bIg*>C>xQQ;EFBD3V+yv@j!-PZ-hUGLtWf8W_v{IVO}(B1xwv|| zIePlIw5^7|x#7j&K{!iM{rFbM;qir|ihX-01B@mty{`m4w`E(diz9KrCLgd0V>>F5 zRNe1sG1TKH2C;ma$V@l@@qS6ZrN3Ii9b(DOg0k3cE zPme@|@e)z-gxC&w6*_|VO2b-O4A*ISqmih%Ml5enSYm#>EC?zHTCdy)E>{5JE(1oQ60qElfYF46C3L$Q@+-dc*`AyZddWfWqY$1gxdyzh;20 za;XUDM&_)Y0^~gT(;!rzyJB!Nfs86&)H+jyJN+Ura`7f_FwS>IVZ{{h|0w5S`A$`L zJ?52vdQ9i-F5qG5bbap-zjqO>R%Y+W^5n8p`|ex7B{OB`sQkR&W9MqRu;?Y^t{Mzc zEvu7-T*4(2){XoH`E&Q|aHRuL63`T8mmz^Yd})jBp+zA3i>Qc7W;|ZpVs9ryy`9gV zUP|>JGk@BTFh81WX=k`{@K4*0I*jk*kz4o%Yczw?gP-z%+$pT|Axh&0BN|MX4N2a2 zBKBwgIGyn%&u3yti5KO`dOLtOAp(?g%!Ljv$Md@={L6ytgUYwM@8N0 z&Feq7p_^KL%$-#X%U56iMLMkhMbz_wkUHxdT&=V<^JjT8asidLfGAr8YnPX`eSg4tnBEKjd$sOCf~JcHmIgx39?Cs=(~oYnLR&-M;9yU$h4qE|n* zJo*0xv)sw;J6r|`0>Cx~?dYJ5hQGMlPE_~Zz5HKX`d?P;zpNsE@xi}E$&uWUi#k*r zaJqK-e~B9re{s6Mc=%uWsQ!QIn+X3)WcW*@{ww7AFBtc?9Qkj1XOe$KVRoW&8kWk9rR56->4iV1m1+=W7unfkn$}7e^=G+K1HW?8Gay?+DbF_#9RH zFP8}5Ru_%U6k?nhiD(x%c%C(Jx;0d37R@1h7%1yIx3f9irKciD-;Y*mW@eWQ7OVU> zm`Aa&vz}g}cQfXUq~G54jXn!nN7nWEMzg|M1eU@xE0o*L8Q)VuIdz4#SIb|om>$nQ zuVY*$xj8fge(wrbn|(p}y|ZWj{?2}`UOzYVydGMJZ15yFba8#9tHBpP7GW*Ml*a8O z49+rWNiESE>2_97hk2kGF`F}2<=S;MV^6l`ivD4$(!dTBsaxhrPn0`ZO_h5l`Iw8f zRxgxV{#mIzSNEgBqTKZ6-*mCsyy-Bp|I66Ad~Pgk=YByxjunQdusZd`zvmp*g z#~+&_(?@zjAb-`G%(b1RV9y-fl|4->61@F0wSYRWLIQ`@Hbxek_?r@ZhDX{Ud_U#Y z?gK+i+D7;3GBozH+1B^Z5G?NSga=zY>fPACFU>PZ6ap&LqHEwELkU}y&>m^e{ls~? z^Dm^1;6FIPL5E5*B}C=Hv#APoz9L>7ZJ&!-Mu=eCvU$3E5pCA@T{fj902|n05jB+sNz*87*4+kO?{djh>c$`YzGa;1 zU5f`}oW-o-MQ@#}WR?YSsx&OrhH8&5hL7R2CPlEGgS=;3;`@$QeSq^o-cuM-$eZz${m1S`4}(Dq zuW{xow@F!aNKLbjh3_|SwEN%{A-Y6; zINU$)h5*$k#JJ=!<{>N*r^6ic+kOq=amlTvDXL4$BZ~AK)nOA7b|~&`gp-?onlzn5 zms%`}YU1u*!SH3KfMzW(C4@l5)$H0@ZszCl(z94z2){l(Mx~d@SW#BWb&JxQ;bpkq zY1umUb%#>~&z>LmO*moi=;H4!Zg*6>t0R6;K#V4VM*eyu+XB{hS~3BObG6{?K{|(92`X zM`d_BOuFP?!VF0|pHn*pVbX7kYn|N?_*{_2|A7V^gKfm)WiH0HF<&Fl_r1P`Xn2Qu z`R&c@UtHn~+g&Dfo47}CZuT+SW;Zm{p3OG!SvyfB(+3D)qBKnPr(}dVQtg>c*HCRQ z^qpZkVm%riSm_h;PwqBn3$1y#lV1pJ=qB{2NZWq2cX)Zd6(|fS^hfoC!DsZ{cpp@} z>iO^1Q`00%qoyhB;c` zFYcu3PC2`U8OGqT0oQ`!UB(E&-XnFFqZRJzJ$(+&&j~y6bh#YA+Q;udrO+t3n;jIr z|2EJQyYgT=@D?^9CcKUTnN?b>MxmQ>9>U9)F_ZNrU`h)zF+EQ{303@~M1zIQn|W6| zZ!*8>F@zRePbp)KV|7xQ4$ynwEYhA`Er{m@c72U|nRZ>4q{z1DADI6ic$~P%*6d%H za$R;OtOPg$XrFSJo@lL;X_X=_P>^x$Ehcil8E{tdW8*)%=IHA9M_Ua-X;I{)<1uE~ z_xe8-Z@tsKb!)__MAy<`a%*N+X`%2hzeX_oDD*ihY3`q4p*QZ4l~h~@zNE5O-*vq5 z=?JAUF7-#DH*#2#=Cl(k01b8eaPoT9F;C5xL{v3Bx-#!ZsT4QtE>h$a@fWq1KNq?% zW(7TrQI)XKER6j38nHZyL+`{FfH20(r^fZ&X$l)Onp4tfEl;huJ==>Q9Q%8qVBSrt zCO$u*hddi-kQ8e;(mM@xH8Y$#n9~#gauWNAswd(@I}L)WM;c*il!FQWpYH3gaS$VA zze&LYzd?aGp6dbv@FkIJX-+Y)01_BjB<_t|$0ZJZ%{47KG@ELWxCl~VWP~b2i++Em z=j9`dlIZQj(}H4GGBS-4xD(uzGnpaO7iA>AAh>Ci*zroszuEj{jSNq9>+US9chAvXh2G4CDW=ryz~{1Urq$~ zvosWz`J4qC(xrjdle_k`jKM|EHB( z*Hr+|9xjEO&-|Oa%jS8;-qkB7DRN{U(aiMW8oM4>I3|@*6hty21E)0*sQ=Wmmhb5ovfiXd0Cs=A}=M(s@hO&P_6Hl(!lgbG7MUyNG$X#Nip(RS&6)cE9bRhm& z4nk&$+eFiHdKdw^DQ(RPUI%{&M?%vLl3KQxIL1VV+?s7>>Hdq+Cog8HfrH7?5*hv& zCapf>b_;E_;=yzmVSyOB-^g*};{*0UyWv>_5vG9ePz(Z&=7HgbbUccEH&lOm!q6s3 z0}-;=+eM5gyP^2(F@?V4+HO%dTuKwITz=Zjg)+Em57F2e-hY}C;(l)^;B!GuURP;2 zqyRisfmMfgH!9MDK-Haysg`QT109_F=go{K;a{VfaUO`5G^u0jIerCB+btCtKjr>0 zYj?xc?SEoAuKB$2>p-qYX8^@ichk9@u^Sl8jcrFtKL+YNcGvOeCbFa3Ad?sZ{*>90 z8(Q_}7Fcm#qvl<_>i2pYG0MFxy90N=O;cu*tTY$6f0H_ND_(6~pPIcSs1;c=fdSPE z402OJT`TsQ%x?HTs;l{nu7%^+H-Cw~&$ymU+7%oFQM-I^j|n$AeIqqfS5;;%@|cx; zcDZr|xclM$;}!Dj8fOOh#DnL&u=q{FZL(%}ouWOkKW;0r?8)>0+}Th~@t!9Nrg%j7 zT)5()Jbl`fSCP2+orG-R3=+06EeDu-5G?QzUWeT>Ohuo84jY)9RZ-gWF2vYI>Oow1FNr z2@T<{j&hM)#&UBj0-0R9TFMc7oMa7g^#$>2%dHf&gf|;q>~+70y>B@;0}+fxS!x83 zN>VjEK_&ozLJAVfZf0PZ{wmCIySE2W#{h<~-pX2xi_p?p=e zD>tAsSRp>~k5BI0j_e+!X3DrRkcX~4W^wJ6h}K1gWR-Wb_RyV#bl~$RZ>rz`L_%j!4;W6h%Nr4kfrE&n zU9>h7h6>5QpazBuwOUe?6Is-$_BGz#AGca6yY;pgyvZtC#M?xNWCbs7q}z3muf%!a z_!b(YTD7S>Hp`jRn$ElQa5cTurN*{J?nf>*kSb#v5vuIqq^4k7MZp~+S_=BIkO0ix zE3&7- zxlPkngkaKpS7f~|4Z+7---~GMTwS-h5={9*J?{OJp>w`qaG{XmW(M2QA*kRcPQzBj zIPpDR_9kxEjy{=IAZNV?^%23qFghFa@ym$^55H~KYDXr_S|ol?t^|JaL%ATN$+<)% zKO~s`(W83s&}aW0$s=H{e*ev|qwUvjcdfNkzxnX>?#0~ej~zFQ`JL@g4&-dMqz+(q zom-u62Rfmk5pTpu;KXLQFXFKG7#eq)osokRN17cZ%3pX4w4Jnl7tDcV!?M?O(==z> z^+i}nw#ez)hp&YiP>hiFmNhZ-Ky5*{fj&Q&SqM#%6J{sNX#QLb`JI1!UPp~!@(Q^v zs%_#ZVT;tazDMg^C+dl(4Vbz5JB?5k7ieu^ZIs zaiuTW!ihD&@?|sIMV~5!ct#!aaag*+QD*$`bMbcTm&R7T;wUHV1>Rq3!=`B;@E|ZLhzjfzan2 z?zX7piKtsfpiFmus1D5s0eSuv+#8vgON#tn@kgp9H8Cd2(IG#bKcg^C1kmt79nQ! zBCmN{es$!><-g~n|4d}m)cV4n-%G4^)jBJ`UrMLK#lOLa89y#u4ClglP~8u=GH9AzyPTUiPJH5xO(EJ*z$> zn53o^DVc>tDQ0V_?HIv=&_jTqno;&gJlR#QnxJjzHpD;<_e@%LW^@}(-Esp!IPNLc ztK=G@t)d;9Xo4cFId)}my6dN&)f=-L=f@WZj;#2L-5Ds0j)mbp3pOI5jD1>n38ZK* z8QiLE3=Z>eL`*Dlt45YicE<40r7;!_hrcg$S3w%cortbg!%rl6V<`$?-qpD*BUfhq zbA*?p9Uq^<5Qq({t>QZYh6g&ACq1us~=9@XQDv9C2W=2Z)3^VD7bCVj_LlpjG~z?LGEvzd}PREyE< zt2;F&)TUAd(4=0(!AV8V))tFf0uZuOq#`8PGEh4GcR`SXLb_q@ZC3)c?_$m8;+J<-Irqdh$hOLLQ=7j{VvsCPaMck9=zg`)r7W>Q^8PwmFa z+9Iy5(^;NGUA1d(Zt&VcKlLog1I66K@g_wCf|%E>Xg=ABm!>kGKa{Cfd`9K(j-pxn z4BA(rqg(rh^{>kR_wWIzr!z6afLn=9UnKcD)$`L@UXnamZ7@mRVSd-i1~Zck z@O)>v?D$3KI$X25@wah!!bOH9h{1WRrl?1obFHb~SC~$GU@X9Wq%xRZm_4>MSY=Hh z1v>(mic!V4_AALgZ13Rjzjja_2Na>M|2+ty94to=n%B(iwGwkV*N|s{V1Tiz^Gk0S zAI?!(`enLmc8N|78}qW}eDTcf%z``M+m2y88V&MQ3zvxKNKE@Osp8fD99P1VW4XC?2P^Ue*`*QAK8YY^Sh$-OI96M&A zxxjd-BkS1s8QJI);6hTv?XGDNwiuu?w;j6F3@x&PG*&vHXmN9*NMQrh{(A*U5u$Ly zN;Iy)LHeI>(?6z?$i-ZY+$d{6Al(>B>1quvw`;w1huKt~hiiZYF+AIa7%zc}*ie`@ zE#Xrh&dH@U9SV>#T~rUD^5yujV^p5AI)s#%>C-3CW6DmO>~Ao?E| z(1gwp^B=y%E=G?&`T;O+>FxM?tiz#Gy}qCD`$9OBE@^!0Qi`yl$Tk#-)e^n+qi$+bVi zLxjCTOcl}k@DAwMk8L!S=>hg1u@<-quNNB#sb3n+Y5g)4Tl+8RoTV@e4U=WQX#Sv0 zh4s>>vvC#AZGe{;NRlMbQq7n>aHmP++NKG?upp0AR$L)O6`!TTz}CRG*;8_m2JYrc zu88IBNasfh(8*gk2@t9PiO6v%%M!_rS%JjhU*d~)10gs?&5PkWJjqO@rz`1n#!4(u ztvvdjJ9XGQoYss}%NNr(PH#e_D?Ma5lsC16=#k3@COpP7{;;Wic)pJg9#im~4*+Jb zO*uE2)gYe-)q{r~Vp5a-y#5P?bJjg{+(^ywg9q3sO@*kNY9gp)G>E`i28EC5-8JgimXMl1VZ*Y}-QMg2}lGJB;?4M~_8S!9h!0t+JN^WXH znG~58H!e?ARh~UC1i!6`xf;J6PQrbmKs(eOA$~$5qx!T(X-G?XohgQ zCsg4Q1?%V=0aGmnZEi(gm<{1kU>M~Z4r znR#}@%!6s;96$T#j)w~v1yf+Lhm~>)fXaOzUf5L1wsRAW{JbzfBsMFqh&7kTzQmsznDSsVY1I7y(r4BXBoR#Ni8fdYN=mfgwR|mVNtUXTj267xqMPq9EC25 zG${2b2H&G3clOW;38nh-COvVYJIv$C-C_G(%#w>v@Xe`($&!054}ljs#gned*-7_O z_Q_hE$9UK3LOYhX2M8_>4fxYOWz6{=`#tB98V8l5&i*n)1O8|*(xK?H)fPRvBm@FSNNt`B0Ze4(SYec)1KbzeciX6J@BGWYZaE^U) zcF_4Tyh#N$q)0;~=x~ z)i#o%T8)054x=8Yapjz!Hy>sA?Yt>W=jm)G;=ejPYj1_CIr_6l$!qol@V(F!{8xrJ z6JWYZ7?4ON&cs*VgGFcR&#&y2PFQnqX^EwF@AH1}bUlE_Gh+9}xZb+#F^D{FXpnJ5 z2Cx=;LZ{-A>!ExqW>~4SQ5f{u(RkzKlx&MNvG*RDE}c>RCo0$2?+beJT%wCi@4?Ot z9!(#Mhhb){uTzxVC8`&dK7QE8Wf7nz-RY$;;Qo5Dr)H=K`hyQ#6V$r@bL;Uiawz4F z0--8qKHd~S%I}Vmz?{nCiiEW?#5^o6htRHNxPT;eOF1nmg8kQ`idmqKr|x7A5zig}*m|8T1JTK%yIjfzW*D zG84xfRYuhtU(fNQwk)yVsVm~K6`oV%lRg%)4<HwWoT*T%!KJDRpdDbhoAF@0JYb^F%avSJSWG&4z&jvy6 zDlxZrtHpV{l;oGKn>T6S4N}dZR91HvqnJf|6J@9&h443bhdAmdK?gMYXR^t)zGduKL$n!y=L9ZSyE0ldg^ddZ&+gxzj?mLiFEUO% ziz_0QX3+H2(_vzRc%k7yajLLG#WJ@(92FH2H>ZMs-|UoW8nu#~bI}#Dh+R-Zy(ePp zb%(WfHt!F5fB8D(daDUiU(7_9n1cP$=1#GJ>ljqryHqhIXB^$oXfc2##Kn39L zWsmz%q$a`58Cg!MHxKzuT{E_Hhum~THFPz^yJ|(u0RfN;!e7(=*jfZ)D=?mh5^8XL zf`f~R1%SQN5o8VK2faJ%s9eAQZW~6X!$C>s|6dBU{7$S8{R8OnYEt7*n7BI`F6Cn! z=@hxy+(*nV1pUpNdcLYc>kWFU^xy7J&EA8^Q8?`VP0WPzC*(T1*Tg3mZ&9gp5S-uX z*9)g}kNt65IP%whG?ox6?;nGO`b<6)#TD)r&TRbNhz(&g_c9H{G+D#oe@-^{y72^4 zg0oT=-!T!B2^3I?hAT4y@f^nhtLsEBC=K?YgdH5CUCx7mFJYXkl8#m_`I%EqoGZWp zx<%azSGwWK@*sQp*$4>r628&hK9=~OEUc@y?TpNVWFm9fav}U99=0zrZ97UyA!Nhp zo3L~Z3R5b0Q{;&z<~qv_dR(}@m#lt>#gcWvk`sEw!;)-hda`Rmh7*U^i2k1Q0c zJ1~w|@~JtDDr=cG|x+n&slyH~#@UGOh#nsVCAwsxbLZD{8#V#9hfKU6&DAI#USmnj5IRHTvh zk=VK&T>MC$r^wp3G`bSquMh9CU^Ong`7EwsEo_Q5R<*5N5`16EclH!Ir{<{+d0!%}8U5xoY;eN0|&pt*{FnpHp3?r>sV zseat4^82Gy;+1d#0XML>-xYuxf}d|BbRuszlUpZ9i&RKc>{D1*>_Zfq9}M9+-WOV? z(ThB5vtyG7B=za% z07&^gp1wO-!4%%tT075Zj@J!>)|U8hA|^)@m5B$&ove5k!-CTz$mdG(jDyQU=CN9OAY4@ub{x`)yL?iF} z&pakGYNc6%8EY~i(Ov@V%(KINGf4+-d=5#y#8cOdcQ$Hh-#CFxUOncYOLjQD`sbxl z#@u8d-o6|uQyZPgicdbCuirPjM>iv}8|%+EOWXB_lcFAZPpD#%=4W6NB^lOKjh3o~x5Q7XSdX1%PFn#AWF33F_aT@M z&NP=o@AdPbi_I{~gGgnuM8IZtFllqpJvc@9Ua8jHYEr*)Ve0oJhCn zJ?nt{6hQ>7Zz*8}<7M0`Q2DnTuKoV`dHM1jMM%SGnl&qt4n=9D16pxW!;`5AD^bJU zH`)W4*w>^n(u5HMXY>5Mx&2;>I_xf~-7y*Q+jssI5D)ALqQvFNQm9E8o+UxVz`uM5 z3^G@vKlZH9EfxJAf5|Zu5dvMn(%&E%=4$JVg}R#10hWJ;dKouRo7LG@`k9GLf{O0P z|Ddg-X!sL@i-_j7C-vix^%ma96KgWm)3N8M9* z-+rWF68-I2Xb8_r`MbXe*-=`N$L)WDZlyfwS3NfJ#6W(bKZ=U>vvsK`UGOSUe=>y=piZa}oohhxX}AwxwGXtHKy^77B{4k!ts%u9PDAlp|i44udp_%lQw#P^92KsTba zt;z=M8`-ihZ7ilZ=!rTMh$AN!`#a18{6M$MuNEP!7oaX(f%)!m;08}DJt{4 z`Mgw5VO$}qlrg@$sPy{JaFU-&7%PPx(<_(>`jutJq?PRBs^W&XVzxcI(@uJtky=ln1iH@gMk)$eYc=(L5 z@@fhh)9@CH`fV0s?fR>D&)x_lEnEdJXwWsGav%&!-C%}tj(_csPuFg&t}@B6Z(#lT zaC>r8=H+$&+e|rj6QiERrJ?Mi(ijm5F;KLGv>^~(9t~$x?g!9e{zom}q7i~W??^OU z|H|gul=IR8e{<$e-38~c>vsa08~9nptqI160#?%6w%!D&c?64D7G?(=lqrLTOTz?$ zAiws6MwAwc2mw{L->jVzD9gS#vXHxPFj7&@p#U{=H~9fpKa}A;KQ_}lqU7B&b_yI? z=mFBS#G9r394>0#Vz^z@P;AbLuyWdSe5-?b-1%!9m>s`g9GbGlMYO`RbOh2s<0dsW z)o))le&n+srgKPBCynv%A(kqNh80M2{)~jp^h@IxI0wB~y&#wPf{N$;$7IkEP#jfC z_4rp|g)A3vQCIyx!B%KwucwY5_MG8L&+$A3l0b1?uslT%tYv(;x6E&IInCq2HR&uG zqj{`p6+@m@Ntmn{fdNHy<2OVq51&Vm>K$>B?#nv}j{ETpZ)N68E+b!L{2~-2kebs9 zJvO05^8$SpUx=%Si{!DfbRpkVif0G18q-)vXhH>Zq#)30!L=N>sBsO#$fi=7=&#+e zLhIiu`D_OfwB6E!Ba7gqeaMg?xoX{J>TVOppNon zR!d6Ze&ODGA3YhgmZv8iu|LP&JSLz@nVM!$`@W^gtDAM!1wH2!D>24?Bkl*Utt9f; z;K^0TI_<2p{v2xO(hjWSz0|@Tk<#q?73gAh{n|K(68K?;jHW`KN8*_6Mqmq(_=oy1 z{tZlvW%g?*@>&Q|0}9;bC&3F~nlt`cazaK9F`L-g&54od9aprPQ>IxfGS%E%YEl2s9(@Kq!i^@g}KR5v%cJ+dE z!reGt##)9LU0SJ2Z=?xz9JZ+C%9y=`vAOODK}j~Kyv!RYfH8~w4aU;25^O*-0SLD9 zFB%?1ky$7H-+}b$87ijyiw$JJ>;suH9*yeesvXYF?=&)7p^8kUy(j62;wY&E8lBm@bO-oQrlL)Jw#M zh&;=a=YM&A#N#BEp~l`6o!{HYtyI&|QrneO3`?GB*RUSZep4Z_`iBzFz+_o0flR!JZ;LK-G{l174P*Ht%`Wex;db zyNmE(feZuX{kUX)KTXp8QeoqU)89>uw-`7F4@QrkQ>mn2%CC))uKofWmhBrfC_CV1 z(MpTSNsMqU5usk_`^$2~@u$aN+4r(TxWCy$zhOeZhEDchKRQ-G-0Oad+cp<|{!Cqg z$BeBaPV})9Mzr0kmvuvaL-M*qZ{&PMPMg?@0wwDtOO=y3B~(n zfCI!o7y_vjoR=X2Sy#`UFBXV}j|Vi{1Ui(q4XA*KI(LkEn9yQhpFZpuf|w;sQ`gp1wz`HNCLTc3Mt+D{qOg8u zkTmalY8G5FlACE-MYVmaLzNU|Yt(d=LNfHh`igO^M&`ne(}>H-GuSi+E7Go->s6kA znZF8y_(>`s=%!s>E+w^Kfzt}}Vl+o=tK4GCiPmGqxnHC$XLfK8Lv$nAz%5j?JmQiO ze(2mUc|c>7wdq=Mn~l*s6j=6xON#)r#bmgn#{6shqJ{>jrqmq_seNA#fD^E65dcc6 zltBsF?3W=B+TOqoYk^q?ApJK(6)1~#KMPRX!e~QAz5gm0V*V}Td9q#}n5@lZT|G&C zW$rGqbI_|RoHC22eUUQQRNdqn;~pm8O43|vJe{Dv=pOeg&bz9#SL8SNpm+Fg{`rZk zJLVE%r?uDqomi5&zKHFvbW0Zvt;a(pN0u3E2k(}|M}{7}qEro9Q`7!0|FP#A|3bv& z_=`e?p)*=stng$FF6)i!e|pRB2FlLL|97Xp{R^c}U8=WNlNw(>C})<3W|lVb)fZON z8`$Bc2F!XF9Stw0QPm$qsTN0nLw}cN-J8B3Mj=#Xr8$YBVWg*Dy?LE>TNkE?ioo?z zp#crKyZh0#3o)ye-fv{8{Ly<3?^^fNbHF1;hGnxL{3zfvJma)#bfg$)Fno%&G&x*& zQ=jEu+)9Z6$aNm-7!lBHVfcjrE%q{44`J!PjI2cs5!mSRb6wbPNq=gAa3yaonfog= z?IyziG?|P7$IjumZ`}}4g-#KTk-rHVzQxsu-*DSb(dGJ%OjUrTfy1cCO&LVBRp?dM z*(HK(AN5AEce+y_kt}(^t5^3{srLLSFUsx6&eexKV%0Os52w;_Y0oUs%8^2&+V_j6 z#j4kVxR$psp-YLANvle*sbwOLLtl;d`m_ghT+F~hu(WkOarL!2W1HtM|Cgm^i%TBu zF`q#xX4E|_Us!@3uIHUtj4>AFPB$>bc}kPYK2Jnh^8{(M(R`4F69NjY>o%0-hs77vo=Ejh z$}bs}nS@H^?XSjP<+sn}VNqMVZB$56AHJyN$?nxm4)q&1bbMkmLdiDXDE61sE4(se z1DA=UUbK65O5UAx{gL$K+ND9GNj_pGzNx4FmCbYRd7TQ=OI)%M_YT)JTxvUvQ)qaD zmoJ$&?Y*T-U0vEu@mH!8%HaPf)_I9zT^UfJD+seEi?M25+zn9?4ZYI1rtHj-O((or z7e%sIVG3!>qy()SOKqadVpRrW27cmJvr!@_YZd?I@4h^V8QR% z@66kI37r_8YuMy(2JftXbd{x6SDir#H3eDWU>0&n2swqq0+c=1;n!P#>D&OC**guE z0$Z%5!YGHSq+HO{W=Tb2t{Rq7+rmeTZkC&KX6P)a6}IoC)@z8m!u!i7R)Z(SiCU;S zUhT}q&=_2@oo9uLQM63}n9(hR%IOTrjVV#pWo#6Xl@J2<4_@py4*W1yg=<5K;bRgif@iSM8qy1D5)$W#Gm=_v%C!n?qU3$upP~B*hd5P{ zh%5y9LMUQP93z5C%dktnE`(9z*sljAI=(nrb{fmBbz5+v0_H?gKnp%BUxE*~plc!X zeSv7kZ@C`H)3(x$Z&Kc7X85_J0*FWh#Yp6U(W5v6*aDZa@)#{OaVs`a0SWSg*JjLkJy#so&^de~H7lo9Mnp=ms} zM97kF=7L3MUx8kkEktV^=8W|IMoen2f;l2ZX-Loh$R6Jq1eeRsLSKY4KhfmR(siGQ zSz#BP5+1Kn?RcH?eDT&)id&11pS!cG!>AaAk`Gth&%ovj+Fn~C-gJ=EFGqM zh2yN>=I;<8XBpvTgR^6Ee6+01MT?&pK*@Cpj$f7+oMn1qngQf-P;_Tva$5mgsgw`a3w1v_fTn)n2DV8p*n8NTH; zC6EePZrP^?Jk*JR5;m3QOo1L31qtw9b2tM^3|Y}UY?D(wBQP^@$|VIAn18Bq(y4!5 zp@oz<<>nQ$IOWt~6|`_u+!y15>dYa_wA%35O&4O6f5wK$8V}OIZq!G3@}EWenw;RP zuh4*ODzMt)GB3}n@Sw@8XzcAABzRblQh))eifp(+h+OOThIZeS+D7uTdm5ohXKsm5 zE8W(s>wg4=?0zO6OaGTVH2N2L*zj-ikcjfdNBL$~_I#*7Y8<7!ZlXtlWlD~eZtYW( zzm86;;M!W~DJFNl`|+D#2faygo%dl(J*d`~-Iy;=X|HM0US*04s&UTPQH&#j- zx{EmNwEJ@=vz=EOip3ur$Y=RWmhHq4>j8b=G$A0%oRY5m%`ES6HC|h|S?JgziL99p za&Mb<5lo@)8T*HvAi0tm*KnhqZs1N-Plwry4{XR(abm7`MjT;P8b*kjfvp^WX+XtV z7rv^9U1w>KdH)vJw~zMN>?5SUE`zA#m|ncw?=T1EA-Y0^xA8L}d`8YARUa;oMG!;b zwDd;wvNk*Ap^k1jX8P3K9HsAAHg{4=sesZEtY{SH4Q^D*(fdVp1YE)(qL%shxbF5r zHpXs0^oG}Bzr4!bY)IVLfvd6rkJAT6GBAn>cX(fREt4zskYV6}q3jA-bYL zv1cYxtUX^p_C4)D-HX`k$T(-x^-j>Z`SN)09h&R$E+^FH(TMp^aBJ%RIP45#HAP&K zxHgOYmkG}~=94I%;Lh&kuq+cn#Mnns>d!}v^xpeiEd12MSboXwx?L1)-55lv3O_#! zi8?le%JPpob9`7M9*(HK^6dKe9KAX;@B&pZ!TgTeLJVPPy&L{}C!Fy@m9kyw+)CAt zUJv{yGy~1G-e=AT?ReXO@YQ?vjc?ERg76dq2BfW`tlq5Ff*XAOHO?3>AdW>|nCl47 zcKz9NhAD#%|Ils;d0Ld(Inoyxj^c4wpn$>z;a}<5h_~xDy$NmP8%gTc;6pivJ((4P zvw(-`M9&r}NLPNlfM+eQo>(f>w;U2-A3=8vqn&4ORQ3X<#W+W09FHH?A zzxHO(2uQik12WCLj;o+qdJ#k0F9U48sPwa0V}AhKwF@8l-~wp(Uv&Je1uQ> zj#_8iZzF6eNrXvHO1Hs4AQ3jmw+7(MEOB1mGu<_YX z3F`%W#?#R4E~P_9FuB8E>#ZN*jX8O>SlDA(w_UBVzz;$@s#WvqC|i^v4L8aJivjP& z24$`nfUWc>`0vU>B;&MDdxvElc-dYV|Nsh{~;dGsHG<#SZ#b`Odz zg1!nEM_Q;`__X64)`>rC-dU$ydA|&ob$n1?M?f%nnX`t7j9ku58A!BM@ih>K)vW^+ zGX^zwTD|*VU7*;m-tK^E#{>`6`8>o;OQrR6$x{h(Q2s-@sqU{V%J4qPR^%!b)Eh#^ zS6*E1;h-Q;kIAm)YkeBmj-N||91pRO%7O0dBtY7>cJ@@6fv7WE)^8exMF_$nSsKzn z@3oJ>XdLN{zOt>19U^n(1o)#QuqX!&uKF`0+_97y=kV?+c)7I5YCd;8K>L1)QSX-f ztsXe~o@yHZa+9I7JB5C^j`=j}!Er_Hd(@Z(>R4CGr?pn^?;sqd;k#X%TYJ+%+9v6Q z*q}NA2>G4TJ731UG+hg_oD#Ui=ESBE2>BseR=Wu?T>D;%H%c}{p9V$%Tw{9-Mu%^n z3Fd6A=S3Z@pdNkZ4n-qj+OtW3&R+kMOU@shquv$+4tM}v-eDalb(Za1%d4?YLUfQ- zgOVBP*J!}8s!&bBf0OZ_le9Uha7+QTM~syQDIyatm><6knF98mXq$yg@i`g-E*r2s z5`HsQLrN6BM64k^+x4}7^~)OSeD3xg6gN^O3%;WM-l>WRDpg&J$sC{9up|w|+J^A{rz{VpagvKZK~K4AwF75^8}hW%xX}@o8n=`~WY}pR zWcw3@IG>xMTCN{ODDo|AI+(@9!fd6NjS_V&0Ff&4TmMZ}3-Pq#W=9>ReGfm^N@%{? zAe5B9OAM$T9*X>z$U%ZP4TsMeq=Os8pX+1Bu90=8&8y^s4M$wKW=puUD>k7Mk0=6= zbwwL$HptydUzasO?E>?=sGjlWY5pVJZWLS5a6vvp9#Xw7mPzV~}{GUVoz zjF~?NQ74u0h(Xn8r^BC!JqerDQ-+Z|7BV)SZLLSrLXZ1fRH@Vv)w>?xV zbM^YEYpsmeEdC}d%l(8Z?5^@Lqx>r;`g14dW<+H9;t^-_iiacxjYhSWAyWP!t8yCV zLRN%Qr&v>qbzr}Kup{Ygjj5wtr=WPWw6R9ZR&C8%uluELgZ6cQ1W+@Al;WKDy_@A* zkSkF8U!R=s&#;w^0MPyEZ!b6_lQ5ioshAdUjW@wJuKt0U^v!N3njl+}#O2luh5)59T|3^~<0YOMelpt*kNR zM0Gvf7k||rg`xcWx5k~H{`gaWzSOs6R|xA`EWC78bGq&PjYlV$-|8^hl`-r~@X;vj z(RV8!5*s#|4OM4b^4%K8)jRH>@b93l8_jvD9aHj7cfiG2)=-02+`J?u{6`)Si^a`o zG=WoV<>;bQ;RKMYJ=dy31*)1*JeGf4`Tw@doP#V_2-9l-+^;Uy52e7I`>*(yXRY}aGJzBL?>$Eyr-^?rV_AS**@sGLS0gX_gVWtb{aMr-kZ^zrt3K>YvFaJc=| z>E2B!FH*j9QHsDu?g3R7H5Z9ar4@|Q8}r}&Q;C@dVavQUHzyx&w4g;s0*%GRCP@W+ z{P7|zB`@EgJ7?YO?!`I+Q^mmBi(1z}=TIU(Ls_Qc?}?y`$@Vb+PBEbIMfm85-75D; zv8UC=5t%}5y{8t|ZT~9z#5xj*S4U^CJzV)M?x4nA(AO_d@n|}xo5sTAXUuUB5MLuH z+jBlM4kH2^1H`J^E&$*lAC~Y7_`up^H{i<@mwRDLD zDY|L$@2de$-_*A{Io$~S6qKU6qd((_)&*>Hng}F%Bp|ZP5@?|`5)sKo+YJ?z86Z?6 z_PbS|+x@kA=yf#Pdz>yqk6d*zk+%8v-1B@L_SfvJ+xs!b?<4HDj$&FoC|}oHru>?w z7LKG%emKSVH+xljhtR-1RH|qE>!!`lb7(2B+JJS^Pe|5uSf>hND*oZSk5T!PIs9qzk;R zP?>&l+h1`CDE`nbtlg@_W>3(}p1vd!Y127RJ5Xi_%k95gec3xi6djl%R*v#q(RK_b znTjp>sDmyvHNlWn%yMCPn2|FWB9)^K?=eIlS(o`GuL`HY(Ar=;4z$Mr=y3}5j^sT1 zeS;HP;GD1>sPQ}*y0ue`)9a?4zM;zA1*?~;in7uxvvg?MwcIVY*k?EVA{fIQN*k5s zD!SM<&$gwicoL%oVkX*;0flZ*_;Mt z*!%sN60EeA6WoHA1bDZCAwrlfTP0e1xR=2#wgz~g&@R=x0Y-5%rBvcBeE%etHrl`G#>;r_6W-F&HY~GQV#NBJ z{wK1?{OJpcKolith=HP9q#Wi00*CYIrkOmCm1zgUlthug|4YZp({yxq3RU$t!Y=$&qee6rQW zEd8u@<;{cqn5L-dD}xRk#m?W@Y0HAcF@d8v`5Of~DnRc*NR3n)v?^1?#e(`&QOY@i z*y8xFIq4^)A_ARVu3S3TLvlQ_oSr*q1$>L;Dnz_2TZN2t!!W}8b4&9TrAUAU)?6R{n| zEe2xx#9h}x~IFI zmJ@SRtxdR=nU9)8;(Z%AkW0t$0v%&dr+vWt) zqoN5VMNmWsb-cik;O1V(8RFS9^F#7`ltxBF)xB9Kvd8+!>9qdpG`jXO$BI;9cJ(#t z>5e$5ZJP&a&zhdpC$I9XNJl&H`?Sya89kulv0+ic*)-w(=5)T)+XkGaqu2WOH>$m* z@^G&oj4qp5@@{O^IxT20oxm31uOp^P`m^J8FbKi=2RNTit-c4`(_?Sky! zu(~ppd@>=7H1?_aOt9YA-+Mg#3TxE$8_0kpDS2;3?@E0QNwf6DYV+;BX`0UG!W}#` za{igJ`}!Y#bRR~arX73DDQThm;PyGe6<4ua5y(DKsZj5HBi)+P>2 za})00<*x4)|4U21)r%PcKnvPj6Z{UWUY*QaiSAH3hzf-a-4FOHBzTJ=0g3@sz$}`p z5Bea9p@f)eQmR~ScxuTY#W5p0glqA)DjT`;_JqCVYy8b5a0sQDI# z)V#Xmyt@30k*m!eTCvXXg}4)7FlNVjtNs4G+JdPwqGO46*_Md!RU5}-9P+?Ov0gs3 z5y%Lbi-#oC$b)J!GsoWmy%x~pA?MG|?x|iU>&BKOS9a0J(h7&@3L08K*KNAxfP*!> zjl$d-aozHKyo48LYQTbARz5-tDp2LS8lp6C#@&3RVz2K7k1a9Cp~ES)3u{Q)x}EmP z9i~LC#2=VTx4kc+Pq#I!xwY5k@kI*JSu_oN=jK$QL##(Z5nDX}k_w|E>LXkTx;>b_(lFHy|Cnzyuc`E)|m{$?$46+d1uc^$jB zsKCq?XU7De=&~wGdD`tl0U9Gf@Qv56wjzeDxdH<%>ETB(luX*Ogp*rO#>&9nt@d?V1t_sU|fFs-_wIH)lOve!R;h2P&nZ=XUMeiLY3=+~?}luc4)wJe0&4A9_@)L-w3F=iOQUF}AAV=&FJS@>A9`dNl49sF9mhXxB*!bpoQhI~& zdmWdswg)$VEeGFkGa_7s=?!EF(pVh)(>+$avqqAy7g z2PcJP!AFMg!R83Wf6}*bNG{*PCIcme#u3TMyn4=x&^i5=zQ04D@8$UJI+qhwCZt)F zHS3Zf>!(^gzn@gzr6TSzV<)MU@fDjfnnfJkg*{y)U5JK2DsUA16|_NJ~I@M z$F}~KNrG52*dvAWuhRhPJ2ydm8s1CD&xH#fFr#kczpmPfFNta>oHe{5n<4pMw;77( z3#P2#U$iP_vT*&MNTQgw{Kd%P4~Y}S9{p3XLQ;6K+wn4k(5YI!E}b^sVgM@@o4X^k zej1x&;s~@XZAJKuUWw}9jzQN+DHZS!af}Z(a3{7lCuL}_Ya56C4V;*~0q>nZko8@@ zZnyFLa##NRX|c@#Y#Jy7oBo=v8-1HrTYaKy&DgyotF+SxK3&Oz;uMyUeX|QP5OuNykY)rxD6iD11-)OQ%&V*1gNn+(^ zyLZ-E_S3R9b@7t3U*S|J)v{jB`?&g0RLN>zZ*^VBhjzCHsOeqXF!T~Vo<)@ql*q|!3-wT3^1as2 zy3rjbx4$}v2>pkWYw-;9mZwq2VaCkfUxmS!3X3Jyc3DNGu#bbi1V0bsoR$N7n4cKyX6ax} z=tGFU!4=MkyIxO7ZQV9P2J4Ly_VueRE1G{hXhhq7)v~7S-X|BT=Hg%beQLx`8jfw4 zaWag!PL_L*b0dSsaa&0FFo2Tg*^Fc?tND(^xb|V>6Ck#*rLY&(tCVhSGhvX?hFs_i zU*?D9ce@5r(0yMvuz~HqZ$f3rv)vp+PDM)PDK}OHN5|~~papeaTu`r;mpcs<9+oIn z{|StTWCI#@Q<}9{{b{TNL=~u4I_h{ASAasc__yhio5Iyxg`DZ|hW7|9=>6nFh=E39dj8Y%IL;ccgPb zE3xHUI&Z~sk_d?q!+75s_D(5Ls;$86B{(JKLH2o-ig?ziIXNSNPUk^R8sd(13I}#0 zk{|?dM#jbr$tsJNt_Ix+a**v}O&BsMcr9asnY??LJp$w@@-hOt#7H$8K+XeYaVF=E zI|A?}II*o+pDTTXtQ9W!^YPu)BLNv#HKB5_ErY(<0LVatFi@A5{YDPv`iMt-eq>g0 z<8pooyBeXq^LF)_`C*<&|V!uO`g{jcnwR_ zj$*HT54i#$lI33R2A6h)Ld0fb3VwVThc*4I8>EI+vR;XI%+}1&xM_%Qf;7i=n=g!s zDBj`PpSe@G63Z4Rdp7S1VmY_bc2;LkPp-ryJmFjamj9z}naNPcd&o1mwULly6w?C2 ze64ohs@SX5LM2@9XSoo9?kmMKfAV_uOL@@<+u_m^yk(4;yt9c;Yx`-F^qoR0H1;Oy zfeifB;HNSB=mSR)G5P4KnAPU^)U< zm{-Qk$>ETj=K0}MUbOokR~atImTb(<0>?zc|nGT5`S1UtTf(`dXdoc484;)}u?UHw-C1;7KUi^DB+h>o<}2 z9(TzgRolg1RhFxZI)-v;X_PJfJ-$iVCpLDP6NNdCrSk-xyGQW)Mmz{4fwUFffN=D} zZehiA4JFlInWUp8CC}-_EX_N73*;u`=^1sODVNr9EVB+TLBkh@qq!qfw9CBkM9pyrF&A(KY`J*2ScU@yu z;wG!J4%^8Hdyn^NdaZ$hW2X~jjNkZ@d!QCy`z~D{-1PJanxCVz{gFAy0+y-}d z3w9v)`^Y-q`{S(h{h03Bd(TWub$9Kny6P%7Qz5`x?7Y_82{+RuYV+hy#Jhkaj!s)N zv193FwBciZf1M@=j4kEaqC3#h9{ogW9imzt59{HY0DN9MeFp0Hi9K4*r@wU;W^YXgCTi?Yl4YpfW6;l<*O z&HS~}mrq?|_Bas{fNrKXdFVVm0Hy*vik@mCiXbF7YB;zo4mHpi-y=D_@bHikv_t2* z6=|%8z?frBNGb(}*}bn(kYAU*NV>LdVjp5LiEJ%e{6J!nVVi23U;fh5ZK1P+WSdd_pVB#C84{_fcY_WlVzp+2!8eo zcv8?+)lrmDqQP37<*?>(CEB6KUb@vAt%8ton9V?K-;g+7XkQ7BM5SgxWW4ccd(#Uiu2cG3JzhQa#dxs& zYfCKoZL4nMbxvf?giS8mMj|B7Tuqw1hpZ@X$B^#zlNsD@Ajd%|K>&Tn@5;0oRu09aH}s z66==^!~`0uYO|&QOq4JFLA0GQ{-`D_Qkf%rIQEs2l|3hFU&A$|HhghX>NF-8VyJdy z@V7b+JlrB*q!*BA5U$nZN63g~h`@ehN7^{{qKpUtFAfIklsgcASAQFV@NDU(rRWmW zR*g1&Xp<79r}5+~D6x^wF`AQMp1*Bk(J%_{lzNCu+o&E)$jNe=eM6rW%IsvRDOch= z8t%d9A9)x5noO)Pj;|n4+0s!@(Y7p}k3LA*lDnjUPdsm^FYD7Be|E$izb9<=^PEj6 zm*v`&gS?|$Wj>=VW&s9wcs*a3C7BAjCY(GD>;#J1SM=NJUij;~gog`hY>`1jKx>dQ zn#PaPHDhNCv9Ylg#4K^ zOmlnijH4@P=2minbq~cwWDL?|;4Ni1c)M(`q3r$LeQ|Hc-Jm{_GK0TLb5WHUM+2g6lgE)ZNBl*>&`8dEK_zOvpi@qu zq#HhP&1B#4P~OJKK2)+HxERiB9dM#h#&VNpR3}{E&lY~gRN^1Coypulz7L)K=_C-v zR=?mlsez=t;3x|=$x@vQfH_`_(k+Sx{4^J^;8>73^cRqY zw}lj_{KpZ(J7C-K&dqbD5GzZi;Dl0qKUYSm`E~Au6(>h94G_~=NX0cJdD9|>G)7b} zqqu;Lf99=!bUO(Bi>o1iR(#i0>ASW!r*ZIbVkjqV$Y?J(Dpt_1#4D&gU&8f-r-vzH-6Q~HL3T1f%V%*hOjMkI@b zH!W9&&_}viUR@)aObD^G`jPNU-M)!zS#yb?O+;-~+x570&LgjV@BOlv z+)^I~wSFn<&rXi>X0P%i$PN$cy+;0Iwp?l;uKC5GRG0xT78W4GJMNw?d#x1y$!wk4L}X zVqZME@UZK-n$`fgu5S%ZBF--G^&WH{EL}XlD$kYYz4eh?3`1w!f5F ze_Q?vCjDs9b@HpM%Kr0X!+oRhjq;b-2fx~P2a#S&QK++Y@=IH^PQN0f?%=;#hr};T%9)gCq6}g&R6-E&o=%314;4sBYIPbtEuQ-~D;nMFYC8N`2 zs${Bi3uddompAr+q-KC!l1V1u2*;3G3jq0_1iObVj`KT5E}j4o?OJGfP;9YlbmpsE z%N*4BimzzqBeR31mws48IIq~y+gC+WsJu+mqP(!l3<@JfhDPHPMBGW5$0buFlkX|Z z3xrPc=TIqb97Po=B2LnraTEQDUJ@LpL|fX{tQl(`Q2jMmIKHL0;G#lx8{k~uretMd zs#Ul7oC2RpcfLar4hhtjnq(`ifFwj-Y4Qh#-9~zkb!7n~-$rFt?bAnfZ+7$t;uue& zfJ1skM#yLYbxPE4Ip6X=PT~D!)uk>Uq{9fosqr!eZeMg(4FmTAxufw&m|8@vi|EnS zm?4~AN#Bu3l*RphDo8`*jOe;$!e4vFiD*BA;}k0*3Hs&pz%OzM8hqFO26C-6d>W6P zZ=^NkL}3X1q%ECqY{L(jSz4DZlIPBx)DOMgJIH{p&)-(IIOJ<`dGhK229Vc2S*nmP4!d@U7Szb-1kqo_}^?H=H#>gDQNsmtuPQN-H*px(r0$X+rJm`7zc z6!faRv12y0!rcs9RGSs3^>iWF?#aII^%(dh)H8mpA; zcF|Famm%8xGV6U(#;)(L=vn1|0s<4APm+uO+i5S~`T5+XGbHkNNR}3d!gxYk1<0m` zlc7>dU2Y!H{C%=fej1l8!FO7N9@om%e)ky=?VYUbGY1W|=eh8fY&37s>kqoqa~2;h z61pwl!5#Re3&csRBq?K~DsrR@TU-D_K)t_>DcW*;O%sz^hi6Fr=I@Gx9l+6pi}=m* z1-U+YMsN?2rXvA}75r>fl9Vjru0VIsKHdL4FCyZhD>ZOhKboW7EOg*8ZL-T zb~m%`yTd}yz6KIa5#U3cV=1mmZ%Ja>Dm_4A-IG#Xv}gP%2!|Q?6xIQn(=A#po3F|TkrY5@9k{tq)DZwUc7m`EBVB(TFF)!8fNriQEpi?> zb{?|s*O!JIZtge7_nVjLUd_$*bhqU!4p(c352qe=pL&p2?O{4d$1fJY3L|WHzCJ1< z+gvT)<=tH8Xj`B&I25Q7(s;3T0_5#*70ve=B1k?`EJ*)yrGNZUOiwHAo0H(B)Dibe9nV0@HQUheJJ9f#_3Oc{=%Gld$k3WL z``)8tof>1Ctr8EEBIuoOsRzY?@nYZwR?uBN)8-9miMvU)x^$U#T_In`QO*t21myG= zfA|pW|ELoPwylx`IgZH#70>}X7U8R#)nHgEF|c+xrAxl8u~!}rEVRV|Q>~!`;kY=+ zzapv3CjzENfUEtA!m^cyWHoTZ&90?!!(Z_(aKz>W7fiaiyW<@B^R|X%gEqA!a!5^x z=esD?dDK^AkH9KCMO!A%zt}X<9^G!k&|Ps3Jqj()zqq%YSF2I4M&3ItWIH7A4EPly z=?tqow3CJ}_{@{=jE;yK+y3#OU;t_H!jbAeK$6|YSJah9zt}SefPVnU{?iR!Ljo)F zJTR4ii8Gj(oCxL;X|MHymG&R;2sG`^^+0P1Jy;jMkWk$2>XsDRb{S&aF{bTC@(^3` zujl;oU{i}D;1?(_%U8)>3gpFR`neNQj<&0E_SgAn%Lc#M{QrIf{Xgmc7@-jeMu9G) zM9??gr3NNKjHcLv<6}G7ap*>)n}6eU``ecjjZX-XP11za*(4J-Jj-ykQm2@?CdBV! z-onr4+28C z$^S4z0eI?D`q#^|oF3@j2)gIG#~Ljdt0F4lE&a?O&E$}R+K~C=I9M+7Q@Bq+2K@bj) zgTgDTXNsbtXIAGfjJ&z;@dq=+DVyApS2*eB5@O$3Q*b$CACXKcL|J~To437oDw)MT zrKyEr0L`2ME|?<1)ssv5t0arVaGsWHIyLF_ML2rx*5_HFyzClN+3?lKka) zgiysSgLOW*tjO9p9rT4kCwLP5_T5bB0dF~Fef#v+qCGjGNP{c%`g(Do*KRFB*$sw& zeoR>^QEwDikN@S5X9D^`FbXr853!k+E`!1S0412$<%Hch(~?W*-xj>eh7J<)(@32f z?3rjay4F^3dJt>zqG4fre985!JI2dk&|-ZxT=MV{#$HfWWy>V`x)T{kBQ|5%_Po{$ z)4Ls0@=kpcDk$m%s$s0c5e}XzG;&I4O*<1oeRx-joP9JetHd6wer_7MHFoh)i1wvt z?iz0n%-#K!az?tZFRchtGPe`EnE4xf4EZX(el+NEn{$VZA$s!A>GUMUb?=dxlWz8Y z!VKe*gviy$2}L8!mogVHVAZ#EcEXTE(g?rAg*Zq0A#|IpR27(Ns5U58W0=>EglHpm zHDCK_`q>ndg$?UvAi@PqW-GvO8McVq!c!d-Kq{=eUGm=?%3i>F8MmGWR|V>4m=r!Ycg4-o|O9xg`2YRHiT~O^`rd=E5b=aH#!fQiMc+JUir%>!e zfx?=2&(J?2Qn?Ima;$U1%kIlaC}}Ti>g(Nrd~D zOeJD;;mug5ah_peaaD)TG7NL9dqcyjtes20EIX&<&TNNpH%&zJMjIRl1oX1@wkizq zb>6Qp^f{aO+P{-8h87?>oh181AA7I9u5M8|kRi7~7p#kr`}jWQTgJ^A(efC&q`A$& z13#`LeA7uhHPtm`TH<@AqreBII>&&b3%%yy0P%KOkeh`5x&Yf3PjVz=C3*EGj)%0^ zwHxwSyI|Ga)ch!rKG?fpDonLi&co%MGz^p~Fhf%aZf}RjTI?kGor!8;|81+frulMv z)e)0b*Y>nKh1++dA5=33^&~TJI|Xn58nrByJ*y^{7+Kx;^m^|LbKWM2*HjlDZ3cm> zm~8c+W{;W&ws+!j4=JWNqWj&4Ex|aR8zS4e34>?uWF6D-dVh$jkAEM35$DEd z-0hpou?xf=eZ;2Hhh_NB9NBe_AJy7zVk4&!rtd^tVsrc2hMT3bm4$>s(FM>MMai`` zkZ7{cEz(k$eTBJ5eH|mbliCryu$8S#|Eg6xFHaKKQ2=P16Ti07u21U7=yD-2cFlc7BMbjsKhBaQp09Lwg3Iz? z{Gi^YW)1EeKdOxE+kk7*ZU+{M$JC=4&P{4l19-S4lu<(zTwO!MHr{-b-%WS8q%3KM z5k`yfBu*U7afvai+MR66yoHwLt>ukLz7m9Ovm|3GdNl*k<#YKWp<22KTgs3R$)IkM z(ZC6_9^Pm2Yr(@VLzRIkc^y}JBW~qa1o59_zYqOPnF*uelcG24==oI~jB(Y_wK5(lXBLcbCZS|wegf)nQJpyTr$q7CSwfse#6pP6+vR8z zya*QTYq0XSR$i!?%K9GZr$|ElLT+&waX2$FM;Wm=(4yViDf5TG!(vClw^EKQ;H=a4 z_BrrS_+5TB?Dg0u8_rN=u|#u`hW5{}sOr7wG??E<_Ip~PQmH`fijJ9Y0>bTzNk;XE zSjS|CPbVOd^=!QJl4MeR4trf>3<5Do!)9=%$9H@=p|RTCoIrX-e?_z!!R-=y`^~pO zy5qUz$*0Mr1E^4edpJ$Tn8K?d(mToACF8rPoZ2sSuZir0uH}1lQkQHlm8x}u!|KTH z=+;<=?IPILbwvIUb+<>SdfJWFO?uL74d~XS652YR;M8w|>*5^R3zW1^xam=QaLSab-XGrxr`L zhvL}Ns^9No6)1rcAuRz0{Sg$*%3}99XFD{842j3rIGq3M;z#<&uVJe_xbnL zWlh{nld9}@`LEa-WHzfrpf}*`T-BMEglLoPbm>`dD;Z_`1LUKyHSla|Iag`;BxI5+ zP`Or%{D$}>Q@ipR7~g;sf8pgQ6{6{Iz9P4-&EBh7{eXNXqn-^s-HzEUs|nXe?o-z- zMiNOaKe+w1w&gds((dCQ-8$ZilYJOjO4v+Z+@U`Bi`?I)d+8X_rwzTOLwJ-+OvI*D zsX6aCpeQ`_c9MvaS%*{bQ1Otvi;SRMeeliItr@fWi+`yrA-Ytvdg-4?VNpd_YPSE( zDT^(YiIFJVA+hS$e<2>=EQTV3zU9`{d ze4FT6_r>H-F}7TNXHBSShvL!?a9=HQ^R@0<+AAO8K7XYjkx|^Rg5EcBSCoPj>-^XF zKI5iwxnlknFjEnnVgL(t4zo_W9nWf4mCv4Mk z!$6x@A)eEW3I1F=8i+sh8!jR*f))`;g$0`FenE6u_`99ByTQNohlbRJ?;GBM-k+0Q z5)(i^@1PN9(4y#NaTZbjj0Th!@pe4O@%I}YUviM!;m_GB!Mbm`XITv1as}TUgQ$tp z1iU)FxP8?6s#AtTl`x75AXT>H*qgz)Qi$8(f;mGru#7*^Z(WO8DJOb`FJWeYr%^e4+(~gdioHLS^G0AdeAqw$m9%ulUiv< za`(3cSJIy3mOGdW@uBfh>Wh2` z!`pp4#qXR45u^{++5FYE{9rSKJ9VL3>yKBj9eKzzSgj_3(o!b;m?OsKQq*;j{!}g3FIKRM!Q&ZY zggTh~+LmnpDXzhA6=Wx(!XQuxTe)H9*8-YA18E-H&0frqjE0rjyEYm68Uc2+Joy-!tLL^LC^28SY6Pr!fOLKRK&v#EPjNT{lUl1 zjOGUWgY*R2Pm=GLeLMr%gF=YaF488OX_aN2P5L$z9wh|Gl?M{d=1^B-z_G>rq&asU zPt(RxKsDt{G)|7=W%P1A`;QGlW_+Z^AwQhno|1n|vi^YVRYKq&x*_`d`!s(^x%3dK zHY=d#T&@F7zljdYw>khdg!I*NfpF4PqroUoINaKzcsY6-tp;&d~-)*=fN5&q= zmz5F?z**rBzz_T>?H@P3WN@B3dU~Z2Bu7@_hN>|Ci*t=#>x(GY-6#GCBRJ}7v_yOV zCEYew-A;joyS7tnC9bcOKBt0973vh@TbeFEc*{SAvqCy2Xv3(B6L&eg&e=)D8>SCb zNri(3sC(^BoXSFOO~c<=-W3i}{kZ7*2ot&iwSs)bN%`$6Ay@Rpp~9HiE`&~nrEYh@ z&MDh8zVWqM!YnTU#`Y@9E}z8f7iK;+v3`BR^msr@p_uvbp{{xOCs?ntf?rR!NTUM} zq+2`$J=aL#E3DCd4ER2J+bn5P?0e@Fx+>6OfOa%p+9!)gy^K{!F)wJXs+I06wf4(N zWD*s%9eZ{r|2DG;B2@_69Z?%|jJ$!iuOKrX)0u0Pe&upMtOUYdfp+`otHGvj1Gf;l z$%tKe`ZaxyBN^AC&`Ubuv*U!;?VL1!`s(0uJ2x>8CP|;g zR%9~`PCC+0qc(%N7Gwb-mC^G#5#usNy@W?U~= zUS{w0I-#rTU7ME%(ro*-zWrrdYxq3iUzoUn|VBv5pUwwhd z6VCPEV{nvUB;QHtD|-d>V1eq$pE$fN^COTVj0Un+Zgz7NccWw8yrM+n%7oPO;f8>f zcBYdCmUhyXPL`S}&_UBtxTnq(IcZ~o45)RE`ZJRldNPiY zH=@{K_&J1qA%k)RBy0e~@>`G~Mjrk=gHuG$BK9CUWJlwjsLn?I4kh;!i|9_udMByr{AN93-_xzZhJyZN@hPY~oD19kU8rkL|0GP6XUAlQi%|B3h$}jwW^4be%Om z8UH#kCV|;Hz=EH1Nl_wk_lB$Fdxf|}qOS!1j|Qa^2R8jnwcl#bd1SvCfowq^KvjjA z#jgP}XoB5C8=o0~e0Ugmt8_A>PdX$G>5`XzuR#Qi!E*`$4`fNh0&tz;SLn3f7eM+# z|K2_0BO$he{~cL89+>r)!Yx2OEl>jbE{QT37{D458ZHv!&J#N36f@{F7xyWq*0Qy1 zX;Q6xh?x(i^{sG;C$gL-*1(o7krwHPU&L^_Z>Tbnk=)wa{2YZb-(j7K3oCN+R>m3E zqhdN8+u*2R@;Oz8eIV*ZV_%_Nre)lTumzKEK9?&x52;2Uu(>wjKtJdT39|;K^d#>^ z;tbEevzV%oVja&+-*F0*51Q8tO}O`{#z}`s>1X7&-xahhRm4Bx9}QjSl@2|9fgl zADc)^Skgw!pcFf4h$735mnrh!7t}P|)y8ZIMDT~_k^ewf*ii){s2mEtZ-1uz)4Ex0;nvaX0=?Be zM1MWm`>UzHC8 zbEq{**kC{k-N4I%QV5aITvKow`PyoUdTC3GM-$nCNYq~AD29N0PW0{46_y47YRM$} zCT(qQ>^om7(owhB&oxj>cE;^_X@5C1E2LPSZFY1Q*?NMHhr^k}8I;HL8@hE*BJfB2 zON(eiILH3Lp|uyAu41j?2m6n>^XT})^sd-{YVQ}~kI_xj62{#qP+OBNQw|7OxDakJ z?Es_&2g;Njb}W2CaGg3np+`kTCPJHqL76EDRl9}LilH}@!jH!ZVrJdKqK6wo>miAg zwKz>EWm18>l>+PyS}f*ouQg<_E`x9Zjb@(R@^witCp>_V#gkZ`1nX5r4*?&{ih|Zo zsT|fiHZKKm0a~^hPbbYQzfaBad5o{V@8_4e3T1Q&6G73<5J~p!Zhyhe#LDXajG}|p z-Qngy{lH3~A|tVPBopyomF~=*PX%&FkMN_$M{ko5$v!WZz--P1FR!96`^f!G<;O(h z*!eGkEAWS-zKFDm(Y1T0Tg_#Sxkvw_WidVKTvZ;~)rV!DK(A$d-0+=MpPZ1M562Zq zu;31PKOI4doQ`ms4*6~{dYw~<CYGBW(B~d{vl6E2YebgrA zkD+-O;!pmNn(k5U5S2e!fA;S5d>nA}wPOMU`~sppU8MQgJ#{ZgY3(J&?7R;et$Fe};0SA7Q&qAz`oxQ!(ZS40UoVkC6><2~T9aK{{TiEwoN| zS@&(NAhk*wp8s4Y`5Cu=FkuPhB5Br~UXWXeHHacq&?J3(CZ#)DJ#V`ZX2j}-t&8Ps z9U!Fdl%qMgOr3#~?f)VM>?~devBZr92d$QZ|e~=^+M3WHQv)5|@ zo*GKMobv0&pJHJp5hPZ`F92~&c-*i`RNU{}(?|4!<`VM(j46zni4Rk~R9;D$VO_7Z zPclP1;&NuWfa1vmE?8y+tS+E(1+6~^6BT0kEo#=3%)AxHM?XIh@jgQQDDZS-2<-Nl z1s(D!JxvVM>F26d?+qUVq9em->r&LWKgz{M>NDUUMe#k&g=uL#cCfSZ1}+! zOVwd@(3`)l0LnGi0NUrovtGOBYD;vq0~O$~P=M#gsruEW#p9nquja$2>sgA@-@qRX zwDU|SVGkZ|ha=bh2IiaD-|0#d$js&K&C60 z%zjdywf^8MpA>ISqQw&FJBFQmgSe?*dgf*gQ8~gJ?=sxp#OR3OA2v$02U8MD z2M#B*ikhgJ$L9@w7e$0rYx{!E*!>3{X0Ot!wl-w*PC2b^_)8Gk3)Oq@m`x0SaVa>& z2E4WC-`%_4<*=2s;&Gg~?{9y@MXv$l2}uTE^vP5G>IduEkF%IB^3Vc)^fK9-4^SQ@j1Ef;+ZWFnuu}90o?XR%jC&hO%Zuf-# z1eH}%wRW=;4l$~)1EhN9y>l;h2K!U)jLBQ?|GH+jWngRnNu9HBZhlUkyEMZZ_Xz+T zRE_1w0q6Apv`Niyy?_6Xc7ovJw=!vFRn~=x>HFaO8Ic2B5{@4vG2yQ>PeiPYjfGkS zuKsj^zN4h9#lb?}&J=1KLJqQZc6eZ3eYT`GC2pr3+l}*qQa)6dp*2>M)>(JbkdL11 z-HBe51{O%fz~(8QM)@JoX9|BnInZeVgdi7rL-SK!o@vza%?q#Yi{%=wdR5xU({FnM z4%=|PnBLjqajUhCo4u^n4yMePgZu5ROKV;zEX8Z|T=#&{&E-dYV`=J?-(SmiQX3}3 zcUbjC39l87sE%TU<1}v1!!A#Xk=YxZ5Q6J9;L{^k%HNK=zArFr{Y2K4B`-nB%mA<- z_9r69`+{}of6COL*YI1P6K8Oe^}?jmzWSv&%q+fFC5fx%6fylY?9~RVmIRiWkA^&R1B#LpyPAZU<`=xY?H~rRY#})%m_7yt8&;U1>?TCP(F*rM@|#zHi3+x)J4&Wov>{cU+2) zAL&heF=3bC(TS9*2r-kxH)JI)zq+S}ajK4hI_FmWdIzv`E6w5w!hUyJUi-Hi$-$ zOp}B59TH)zjMw$V3Kq*Xy5Yz3PFhPB?P1F*9NF#yNQ!EGk^1yJg@{NZ6W)A>iRgFw zdIJoLtHN_!Wj^mJ-4+Bgrwu=DsimXEGy|%8b-r1>lc*KQ&&8z`o@XXxJz&XbH}~|~ zx2oN%s}dWTbnV&~+Q+qJYMC;k?s*?o%*Nj^%b|NcvPM;zrY=HAzg zVp|O)ves1H@4mU+pX|!D$oyu3@sy%eT|RY6nx{)P#rg{9|*v`X@;N5vRySBpi1 z;w;yFi{t6V=`Bie3DJgy{7kC#kJbHe{O~75(dS>^%-*SRM<>+QNTbb*Zm~`wlH8PZ zNQxF$M2|4ptXHA^Z%v=X6-V&+8ThHQ&Du?qKlBAxM_0(4J6dqU3W*Wr@`_M514WHqIRjAb|j;v=_ePJ?ZqZ{m2pv?BmuuJuR-8AE!!l6%w`_a93 z>JY3C)4y17_Fbb2bfI!@%4(Ou_mb(qhwfFa z<;(nUED;&;1Ma0C91^*L0>;C|=apsazs2D9Wy#bsJd7j)z-`r1O=6H*|(-PJ6_|itlo%*F8t=%L{aoe9WyZdTunt?VM zYc})dCuqE7MrBpZs+VP&sXleD<_9m0Z1rGkaF2p~3g?)c`-0>)wj*30yN zsBQTLT^F_QZ&euZPk%7dt;MHgoMCO;-m)+L&`gb292LV-XBv^+&?@}T=KHIZ-Tyyz zPR{j&IgmiIJ2GDU?m2iCc_uk%oKkW@gCd4IRFV-}d@Q*xp4z7G-=LUSU(I z^oFejlO40NyH0ffe2D6zdhTg0)&DYtwodQZy!eQ48lc$BfPVjS4O&tmm~qMs0MQ@E z5ioUt&!qEosUo=5-e=O+pIgYqdoXGC^rsa;e!6OV3Bv8XwPSHF9@bHguG1V6kvqEt z-^6&OjK<*Rt*>yl@%K#TF_N#b-lk?9jkzoM{z%&gTmW6(4hr4Lg-PY2q2i!W_s z!j>oT(x*N1oy)fc0Z^TWJS@UyhGq-NTL?l(*dkvV(|MXGNqK8b#3;Ax!`AnR6-;6Z z&OgSIOW5PQ#$%v|uajuyi&RoaOh-xzt{_0+SqdGfyjW9gk8S_>W;y8WZ4cDqhqRbg zG$5fVev?)82lJk-xL_~1r0%qdm5oln+A{ISZL$QC(?q`N6hW%M}CW~ zvD{J1Oy7>3 zk@+(E=J?PoZv*5v(LD7klL)L_V22aYC!KLyxF9gxOWjg#Gkt4mvro7ECi+B9O3TbM ztk-9k7;2h(;In(=DX}TKq;YBVM@4W3llHdInlv_A^h%}ih*6TfS}a`daexp>9H!{| z7kcCd4C1Q)o2kaTYC4=4W%WA1FC@Va$ovvp`Vx_mhtca&u+lVx)%T+mg90Um@<-|H z*SIwL!9khJh+lTx5&Ko|np?JqBfMRHsec+4qW0A@pSrZOXtF*E#NPYND{HpVZ!WYR zC6BYpLx*Eca7$T>q@@}3N)FUV;1X(6LRGY#w_yz=5dNelS=MA?g7NJtvZj8UA<>z00ReH8N=pOz##PyY( zNbzqxzS7ytGnpVs+_eWX-39Z!txnZ=McZP!V5elo6|(t!)r*o36qS}kwP}jh#xgpe zHCCA(4b*NXYOVaF6K`_=crFz77u2c^LZrHSAxx8(zlF_mj{~9wt{1 z56v#+-^aSMuN@0#n+Rs&%;hQ0Ox;%JEO5Qrx@hntY#L(kp+$bGcnU+f%3qGi~kPEcv+`eW9eypi1JrReCe zMH);#9c=FTk{jHU|F$tQ}!2)7UU!ayvY4^K47=Z7s&S?!g2_tF`c3$~uVN`M}3;4HFMTR08E3umj@=`wZ3xe4wbwN+hGQ1 z91?M7pFiT6TmypjMo_{aUi``%O)u;6!WN#xGhR+s){R>K>mF_Nw%(IpK;0z7yz!0DaaARlb-tcQEuLWW?y27gT!2HS%Jv)v&V?MJa|6e$qA7HX zhe$SL)wKbE%61Ha(`Bpons8b#fSRlLA>fPHvh9_&_%&NpSpUgpN9m}t0MNEu@Zy%g z12n!0VoncOk+k)nV=bwkta{bW;X6}2$#;OI*g5+0NUBrx5Gcp*L!`L>Fhv#Enq%`7 zP4Esy>g{_xm*psJbS29osm}=h4=jf17S*;Lya&81NVpLAr`pqSS$ z#ie5hM_w*N)J0~*?l5obD9ju68XZ||S4I{ZPu42N=MTNK7M4W*&~CT>Z2HlZ6uAG& znn^+5)VbLleZhf1iEe!W)+K}FNGDb=U@+qDsJ}_4{woDg-#gUpF$@mn0#wFKHuZ@E zolMBK!Z9h1z~QUwbYS<`NLZ3}{bEx6a&?Jg>`+r51AyK+&3oF8p}`zU94tEn#*2;00~Q)gP@+7N5Z$9q(Jm5Z;|!{0yuiL;GT z|AIq&9Bp=g4=tIxgBWSIO}PQYQ@I1G#9*+p#xs<&^u&!m;YWlngR za;1ZC**|c&=(;1)seZ(>ODq#q;-n!|ANegG&;bg#+-4atB{xo|W68-PcAVxM-fmg? zEWxd!t&=he#_ zqYvmIU0}YtH-k4MH3-A`brVa}p)bTjV7JHbh4zei1_D$`lrV5|X0_AxEGzE{X&fw;nGNM0|Ua zj09PrFZ{k%w$x?B-qI@dsN9veSPs^pw&4vwy>}xXT;2)@-AwjuCpJ+dIkGgd0}zcc;#B5&4#V?gP5;3Ppc9?S7onx zisgIxMLvW#w}|JF62J)jC3>bw4Reu&`Mn7O7k-&2wDu9Byqo=i**Rpbfm={=Hix=q_sk-#CO1vI<1IQayTq@YSF9`t@o1eGQZOt^XPKLcLHqUOb&zF%DYf zvHKN#xZ3dxL%pwT>oNZ2o5;2MO@JvXe0uPU#k)`T9;CMugK1ZjFn5EY|6`Ra)wKh9 z9Lc?M!{5-N<0Weqf4_70b?P_RRINl{ZG)l_pd{FZ0TovbFrOi#x^BoSXF&t zT94;1*T0f*)q#K>0pK?h>x^|2!6Z>p?-1avg0~%Ip@7Wo#+2cSbnghEHR2R;<NKRT=>j5HR6T~nKmewIT>`27S`&sNbFo_7ytAbK5>`e+69qo| zPp$`)7w)qca=o6d&JD(UVtZl?b)c~$aP&yM?b0oU1yHD2;w;`AJ8JY(7VjZWUZ?3g zx3}&c??@HGz?PmK25ocgC7yo!#+L)m6hYqwq~#?WYpW(jOhGES!vgndr7Ewx1+D4Z z!cxH?j8Ycw6JmoZcd>dG!zfZGgRQM^-U7>kgSM$8Vp#j340@znw;8k zcW|!9h%IBYWL^b1I*=ecCmuZ!XzXp(XLquox#5D*OP{ypPOIbO&TSaU^C)%BHk@ww zTee7m;d#Qk>g7E!Ei#PX&IA?*soo3Yx8sI@7JDG^F=ys|FP^@FS;rqwR`+SUMz2ck z^+%>q9pG(pS~}esodc~g=k*eg&mmvv)9HT!tXG#;Lu(xV0FDu>(!t4DT_Ss$Z+mgI@TgdIr9r`q;M+;5;ff4IqQ{ewKCjf=U z5H8!451m#i!dPY^Dh>+T2|DJ6oFhPvRUlV#x%Tl#n6G^ezkYog{Q_|x^F3^V9CGFD z=_&QvG>nt#&o?!m;!zIaR9`6nXc}*Ap2sdyO7Z~fkg8syL`XJ2Z0dL9oMdz76%WwG zg{*UJxJ1va*6r0xaUkauo&W9xrGjVf%9mBIMA8Wl27#{4ZSg-lojPZ$v#nx2?cJiy zkAJElUj+HiJ!U8w-&=G9L%l|i9X~07 zxT`jj=t@#5id8~pY=747x*O5w#yN^2042f~a3PlF=OyfGtO!7}CW$pVd?F!Y2-hOl zvU<-vF0jE;8b%D8N4rW6?i!NqIk=R;1@iCmFPg*$j@p2r_xDPrmvToJ?!FwxQvMH& zI<4guD`K5WN9T)b=vT>fmoj{|1Gg@# z_WO;xRz_lz@9RSr2nl^VC#t8EGEyXSB$ua$=DHUeO~-Or$T`AH8@i}%6AG&YLI8Co z;bI@Y@!?BYYBmIO{UWojDg~ZJ%v-rkSgn(V&(jc|5}WiXrB=YhiFQ`=b!uEmnEzTR z&h{jkLO{P6F?EVH5zuC)WuK1IJzf>m?k#;s*YriQGO0ZZi)ehkU(F$wU5gRu64E!M z&?kRrng_AOiv_Dci}8@kG%5!Z_Tvc2z9DC`cnIiK@;EHM*OC?>w{9+8LsqtnS;u;% zGYy~Y(Vz9smEk*F-ch&C9d{}g^=?eYgm>7LHd-Tn#pwvH*46w>&#PU?ISWiYZu+Ds z3))mWI})zpPJc;ePEtBrUO(C&r?FZWOrEBafy5IdTE}VE!Oduy3dkAP-;g>R$&~c{ z)`{SOiqB3Hie+vUxr4qD%~FK|w6$Lr7TSaVvY{t3r?F58f?--?*(6 znBR;HYB5L0@>B$+b196P)mhhjhb*%-rUQ`n}kS{|{AP9T!#CwXLFv(o(_@0wUer($YB$IY{@=T`JNc z-Q5h`4bsvL(%sz+-{HRB?|I($k9}sXYsEf44!_yg+Iycp7~G=Q(V|(%GQP+mccqZn zio&(7b1I9I`f(Tky4YMO+c0s>J*2HyCd- zStA~Gx!MVjFlS;_g95L(N<hAz0`~UsEYT~sd7ji#9J-{ryeNn`)j+U=O zbDs6=yX~uY6x3%JN(L`b>kySFa?%9;@b7ulFZLTvS2cwucR0?`23v4cJKdk&&Bm)I zJ{&jl!yQ zeK}!}S>H8w^j`VH={9altWd5(whn~B$K@PRqIf%eZ_`S@g;65muNML(u~@M{7XLd_ zj~pE=ah;fzM!jPB^PtCEe$Nve+$Jaa8=2do>M1Ce>U%PzU5+Le=k zl;CX%w$^&}Y2p43WMCSkupw*+iHljil{mZjd1%~*j;=qEPkw0`D2hg!UH=yh@;?c6 z^HOPB9ID_6zV^jJjCR`xk(u_mZb`bU>6cIF@mYdV8MoIKOa)F=^-Gj5zf7QoWOWZyM4}g%=|_eJ=(Ce(aAQML zM|cC!>llqCbb6qMkcuAePS&;a{@;RVih9MBoMS&>fsK|uGnA(k@Cg$Y z?Vg^3^n4pAkreQh@}pFGtLbW9W(s`sx-|OI_Zd%O0;6S2t$+@18El_i!gWyR>_ArF zcWb^DlL*<(;i3Vf=M6PdL(U%D6AY`YWC`dQZBKj0i~mzM$tcL|J=w_atX6C6h657vfA4h+o5R6TQEYhLW^*m z>d0>sxq{P$SLa$|04<7K$y4da@Q5s!``bD|8;h;(_deToHZnV}JixLwp#-HO^Q|2t z0k@S#(~9DGhX0u2dHTpy)&h=!=Gfs1G^p8cq_*O+vu;cL9N7kEPKDlmw2q^Nw2&qM zDw?A;PZBg$-}d-AP498pIM201GTjxQw;4L1@e=Hk5dAaI(D|bYhk;7W%RVv;1HwbX zz61%0GZ>NpyumKZtXL|xJ~2XJUrN@&3D-E8uT%5*(wpNq&PFmcxoEjXsMoxv#+f*# zG~dhpU5Kn_qTm}G2%AP0})ujHhPxgBW9?}uhls; zG-*7zzD%m(Flgy*+(vW}(5TS~j(z<>rC|1Z;i#?j?Vv$}x!7K@$ny1fdUuvx^Nn!B z#zR&^N?X;eEDX7cA$6tv;nB$Vf@z zwA;zOdO{5s^elEj#zw_>JSHxUROgjtxNBnQdDZiQjNATLAH@;wSi;G?0D_)LK^D*_^OV7B@q2=78 zp0UYkA(4^-h4jlLoe#OOv&j6L3w_JzNLS9X?rkrvtOF5{_7 zDq1Dm?|Ys|dd&`GLdV$XM{2)|$2QW!i3)g`k{?f@*E9kunNXB7d~Y54Lv6O$isrl3<%kX1ZWEJ!}kMVLa?!6GLD$%?-ZW5bWp0 zPjUe-_ZPgKzD%>9b^AFlGh8NfU6nYSCj|# zKfZWcIZe%_6t4d7uM1SD%f9!|I12C&^mrXF8~aMyOUt~pl1-&7z4ny8e(>}>yne@^ zP_!WqnIj;wt{c5gJE>pi9qB2`PrOWtO?7p&TSk{WCQ2>qA{;M-Zzd=+Py|qi~u)4$iH}f zm+sdKqLz0bs1?*=pKDUK3uxu?y9#!Pu0vI7P;((Bh4Zj@4dP_|=>Xb6@8qesyd^lI z8*0V-_Hzv}M7^%C+|8K@&Oc=xlLG5b4kU3b`pgXa%H`|%Dq`_vm6`J*(=$_qSqxnlhvzc)UWmhq4ZQk=qG-k&Qu1o zC3laSIDjRp;P(aNBbz=mqSFvE2&KSr;Q4*EwXt72m{^0JQE%xC^Fg#)h%nOKtonh( z8iPX1OUW85yLnLvjxUpe2OHXgry!*2E^oM+gjd7LqR?VPea7W4c}V2jPM-D+J@-2o zqwe_c_I5{VR0KtA0o=vCA+$EWE&bL?TL1KiuT?^sQOyRlI9mR@Hj)A^kxIhuTR6Ho z8-v^3Z0U1v(rZ`=o5x#;FkL)&a;NUSzD1Up*L1w)j-d)m?>+lgC9ubd*FG~=m8<-c$Tu2stWUzod0mCQiGEM9AJ=deU9Q^%=&;p#PVm5qp z2>E-hwym={W%lYCl_^HeGY7{bMV2Sj@JqL_@F-7ARH%>hx2I12mhnlM)nR5h(UJ4u zzKfVF>)%rIf4!xq_ez|oPoQY))MC`;|Cnkw^j{$o^|3-J%Jv@JK$*HW+TAQU`lO_$ zM14t5SwktFZry$?P@s>7=>M9YIvfW61(t>KQce|HIt`` zh4_Q%E;kBVAne2bG`NdzIA6SLr z_SP1?l(NLXt?hENcVnbll*OKZL-|FOEl_=Br@OAdenQhyBOaFeA$5qYsv9-6omERO z1fm-deJ10kn)mg>bHZ`4TmW`Bj)QV+B-NPq*)Zgm4{qo`ZMl4z#*n^Im)_&_ z&4?SFzAIe^<&1vMb{WR&Vf_G{mpN*36M_7UGOomZam2{S0T*hvfXnl_)3P7Gv86Xt z#%-GmO51xAuo%8*RCb?QvRu>tqKK?ffQ4M3HcSl<2O8R_&|M_ieO=f0iT;K2k_%_2 zAm+WXu&EafTithfCFueRKkfeH(8dn#kAiU00lcXu2Eo{d00c78YU z&9g+2P?Z3co6W6n$z(|4U6qQAjS55jmo7J7nue{6L`a>F$$EJj_BJT>S7nw~Pxtnm z1ITdjMe)4e8vZ&BkT4f*L-X{c1!R)s_NmG&&6_XEOu3-tn42@=vu!Mo--jia78jRD zukSMr8k}!;wq<5@Dw)$5qZAE8-0+19q0CGYUBO|zqWtE2Hd(YJwA;PiZqBV+2AM?jiPR#?%;;}B70uQWJmSlXI+B}8W2iA_YcMDS97WEQO z(Q8Z~+`VrL3UF>OkR?yhE3jenwlkC!Fjq#&~rW;g1AT~WQ8wyQb+c6SvFXhcIzdnm^GLd}146`FmQA?W?n zN70K829;dFo3m(gxY202IDS^Yn+Pf~49TP(Tox+d}pKyaN`d*)!fn6CcC^u8x z){zAYq|SFR`r%4VEXRDaviy^x_2bOPULJE6%S!pG(K{2QCSY9^Uv7_RI-S+-_iNm> z5#5;B8$uT-2pu&|5}r2jyVztXiWz{lErzgE_{=;0B`5Hu9uY(5_nFh&clTCqx^t!?+P z9m}8hkLya~FV?JtGaWR}IVL#v!{;vS9cRFG+bMf-;JO19i>K?Gr)#p?{?m2+2~Sb9 zuux(4EAe!9gsT)t6_EI)f!Vcho(|uADcAbjEcibwz4K<%vLOGANZAQ7ynT{>Un(I} zGeT&3K>+_tTF(!&3JD=N5vo$zfm8$Kiz8OMHTIFvUzSX(ue;tY{j7s94>ENNByqD| z>iu+z!|-CdIK25Hg1!C4$L$sB5>yECN0@vqV=Rf%f^1AZWEex>%~86AD!Uqe}s!IixW47WlFyxh*>2uLGU)S4#yPKB&1c<5S+8A!S8o%a!6iTZwv3FR)0?*PB^+% zgVKWD(%Dz*v9B>h@{dfP>!YjD{EjFek*(<0H*DQrV%{uZ+DJ!?P=i71zJb#Mbt2ys zbk9PW1xOe4?(TwzTU!L6{5osq(q$*N2^hB4a=5boPPN5qzUg(=kBFhH_SXKd;l|5}I@DrM~@(4rG7P>O*!`fLH8QJEq z)hd_%!yLIm@^WhOv@ruDh0pEB=&77uIMz@LQ`@S>Y2h}YvZr0HnJS!Zbi9tp=QAM= znu!*)vMXz!IVYYv%#r6D^P4V#A{0UTR@Asd=@n*I{#I~Re=Z8rPn1qtZKNh-W2 ztd8#J{pXYDtBt>dr5;bbV0^n{OxZZ0d9@+I_LCA@CNgWAZl1Yayk5F#W0AS9U>NnS zA7R7O-%aFgD}kHM*x{#pC^Nsa^;Y51fNf+#N7@?&Y(B0^Tvdb_6^iL%nQtOiy0PC4 zcg)Nix!EA1iEAett?3P9Gaq9)(L?ueMnBaxx-e}ricoGCZb+Rj{rQT82$QjO!bT4z z#C>fHqmEKqR!ttyz>+;gdAsH71JgX7h1zF;j%F9^Gp4~`>#zp$Z9zeh@qir^+D%+R z;)d~n;^|HXhYWMaGR2bLrIx09qml=Qvh%-Ongf&d{ccsBDSWppOoOHRz_RUk-^@#G zUr27LO4TT*Yf{h4{RBW>-1_Lz{Vz|T+Y@;31UBFRpe2nxZT4))a8VR&Q@BQ{-r=7d zNI;Is1(NxH&K7tM<+&DJ{O`o=Ahu3kT`5YYg|js{gfU2KEeKPdieSd1Zu zk1v$sFob2g1UWuE!sQ$!JZw7!W5=>-d3yPk>qm`(v2}vIXt<&e;NvpE=hq z@<6t`yS{U-fb}&1HNpPS1F;ScBCveepQ22VZBYGvFTH!i{;uyqk>XU5Ki2#t%n9(; z1iS-afA-Zl*BpVIyueKm0XHE4M3MkzC%~Ktn8AP<$kH&0TBi-%1p{ENx*e>yterUE z-K}0$Z8+3g+<*G6evzq4nWq20_+`wP?{}ugy0hVJk*#4CRMveYksL{@Hr3zH^&u>1 z>np@kR`@I*{i@MNH;dMsk=`SfMjGw8I=!BTmh7KjO8>wNj-Gh7glb-|i*Z#p?bZ45 zx1{&E7+w8^J6RM79-{`qW(pzNfJ0bLJ}VAF{Ek7?TjTQhTN4e@kPV|+rHkM>jSke# z5G+pY8fqI6n_HdKOKYYaIP>~pD}#%Mxf{7q@P{k zyF}(fcxCA?3yPOV;*b0B`rV6))P(()T4OVEUMGnG?Y1@i$4rZ=k0KWQhb(SzbiGwH zWh^@xiq5O$;;GQJ$)wn`^YBj+_oZ&&EhFhwJ|zCx?hi`3Ry#c(WY#;_GY`EuPkXKK zXQ%v9Q#vcZZ=$zDj~CEm2K1)7%ZqMMjOY_JFG>N{@8l9`FQh?jKhjGd6+N5DP^`mf z*iY+a+&|D<^Ci(%J-ZTrN;#3)RGFtBibImWO7ctMsCsl|fC^Dnz{9dDqN#TkjcKMi zckZ@SziHM0ve_6;cto2r%iD7!(>fd2;4DwN+-~F~O7@gvyJN9@O?5~8S1$+i%mj@f z-rus#+MR-&v+}%C9gx$RYvLijWJ9^6ZUa^I z9E!ZxXr#GN{6vwuLuT~uUbaWAu zm1|1-qrcva;jBet)$w4W!89a8rjG^IO6u+zLa*%kkgGXD%Z{KJci+5nM+^Ki-}5cm z{G5WMn|Ep2g1P-w!LRX%M@o=aDa*;Ptkn6Wv_bk8x+>Ik ze-LYLQ}e;@-SO7CY>AiIS2?;GF#Ttk!=MWdKl5EXFtN7B+7(wCn8Q{Zok(uX=liN= zm3+wgyKL`y-8qB>M_42H$y$8;c2k?;3G>^G2Ky>N6{)J(Y?ovIhc#>TFQVKuo1f z*9tp#PxfHn#3!q$T73IN^X;!wK^9lNUhf+^kZgjDa8|q1zw-up;|p`=+XU}*lt@D# z%;V?@CchC5!d6N;5&apxV_8vdCCbYKXGV0|r*`w{2SPGbD{6D}_X;@B%a3Pv>dFor z+xmQQ_Z|*Wb?RFGx&^P3jckfJneyE=!HsR>vo)9uFGv)$N3HDhXD%__kj9;O&+ zs$8w(7C+X|*dT8jd7*@!64+?2aKof64)h(;1^SRL@y|b#PS{1>=mI4LA14gXWXQS%; z=PRv@ed9Q_%quw^mJ{v;=IkpuVOAwS5<&|pbxv1KG3{DCd8lX9f0h)t9;Kc!G zlVndZPnyV+`?p$Zn^{T#di#`t7;uPr(rf_@_+wDp^gU&XeX_lJ3ch+8v!1J3F33mx zmk}`1q9S~L@3Yz!jUFB%6lBu4sA@_uYoccsIhi1PRDOJ~^ZRW^-iLDwQLaa`I9(2s zie$&IXmISnSRs;^6i-p+!sSJa6vj()UB;qb7AxFyv$$8SQrMvppSD{Dje9;?H8V6( zhQ3x;q`UZ0ybIHu_n(#dcZ6pLhFlFm96_y{2S(v8K$QYU-Xf4KEimHx00Z%pnh&z= z15|QgY*ql&bU?Kifgu1i0{$-zcsK94j@w*U1Pu1{8k0qGUG*Nd$pAhGxbXrxErG}w zfJ7(*tOJO4oBWqs5Ccik0ka!m257^+D3H7m-~^)pCjhtx8W4R8nE3&7F+ebYs476^ z{gq>L}=B zv(HD%u@^lNQ4Wm;O~a@m#bDhgk1&sgdrQ|hlC^ax6z!Wxl+1%Y$A?zDf0#IU$up)3 zO}MHOh?edsD*U0?e?y74a2`BFF84loj%AuAn1Tyxf3-2qStY0ryeUFxhkr^G@1L3% zW>!z8O(d=PY!kV%K?_rw~< zSFe2Pw3Gnw>LS2(RtYew2PR^3Dg%%a72rklq-onE27($kFC0he(%BRl%Jc?`Iq8NL zwdi9Pt6&U+jBa~pCwIX`?&E5g)wAZw^s-||{`kbxYoo-LVd8x%8S+%>f##RZLgs6V z@h_qn1kfy%BW23-d`~gD5m*#dF_8lonLS1)P34n2#$1O>Ko&I=DQ1x={==g4EGz+2 z@&^yUqoZexQUtiB3U5M{r-=xS<#SBgyVo*pA9Q>f@ZN(210_lf1dgV` z#=OK$R(ce-EcEk@C3sG7Vp~T(oO?md=l`>l^Ze3qh(J!)sbQxnOsOncj9o^%&T$n%mm~)!RF($x@-tV+bvf5{YGY9x zcH=o24Jp})DeF9*WEHQ+*xZLsv&3f7*AS&juD+wrr!!=aqt5O_KcVhl%RTUfX1|#^ z_BfC3zJFvX;;()qDk~ZM>x!s=OGjjvWpEN}M45YE#qPLRCinRI3S}DoUbu58js;*6;E|@4EcHLS zt#{OjhKM9xG9QGBy9$!^rctVQR=nLNDDVL7dLVZj{9IPA+O`+XQshSK+tFxr@l=ZS z{2;#jKoqqRSs@jaAfR;0T3kF_pd5CP#<@z)S62VrJ7sta&m&b2n}T0fC}je3{_Xv* z);rD=mVh7o#)j|CD+^sQRY{A{!dFXgGu5wuI3;trpi^K?;oR*kFY@U1JB;+9>Dj^e z(`moPbWebi@ZV$7TQAo;*mxkFJ9`y(Y!L|J8E@YgqA(XY94AIr6b~~Dq8vX2l<1r~ z?{?ta{WHq~*(ShC_|LbXPIZGUx#D|)TVpTM4vOF~D$A;vGv+`PAHyui)c?oa=n^#1Ffz{9>` zB-tE#{&%+^hA?A$@l>g3)%fp<( zZf!I-B_ra#uUF}2X^%aR2a%eQY}>m1R2txnWSqO85`9sxyPCx93H8*#mGKyz#SCTj zQL%?4xjd1wZr-cTbN+F!{VBdWnxtE!|W;m$*N_f8h~2BBLQg z*2(07GOwfHnd|)b6>e<)qNxl^6^JAuQtJ{1g-x;^4(b*SjQKIStrXIy*Gr2jW_|^8 zSP5Md2w7*E`V@ac!y9;z-rwoWP37Xpg6@P|cP-j)6BE3|BB7XmAv$DStD{sN^oNom z*cHc(d}FyMEMsNCvRZ45{A%B)tGLn8#!IVtp5s;E6^OxYp;(gzZo z2)JRw5jqV?A1&aum@kf!f_;1RVhN4hco9aQMzHY1 z!UmLioWndV~QbRAP%#*XqY~?F+OSv+euZx z%-=G&Kn-EA2gMRK+dW$Y$40WFOHb8kC$jw2nsM-arx}M7o4GyZ=)sU^?ok$#4cU+C zcK*Yd!4A{8KwnKB*|o{k`9YyN4QZ!c%AO*<+K^3LzAu-`J=UQ04d>#d+>7S*kPFF( zwJsFS&XDS9*B<(obx%vTg4(K?tqa!y@eU2j+<9n6eYeHbdW!NYaScL^lF|H)@puWU zgt!;$QF~3yVQBJ(qyb9%QT_1#{YHC|_^NUOIMEaSzyU~2PXYW-82?j%B|czCd9rd?weA1&LaWyD zk@(>8=<`n%qt%3>=Ax;1?|KE%&OjDk74R`l~vgT;Lx(GB= zGYN-*`Nl1m9kW5U4gWK(asl+{21IHD$wC2!r44kK0}!x@f2V#@05cw7wgb%ZfLR3~ zU>N`b1DF;Oz|T~hohJAFW_vFOcegJ7c~!R9Iou`cKTF>HtY&gpNGn$x+33lh{%-k^ zTw{azRrwwwwW9AZ-kKCLo~2*V>vvrZUwEILI{u2I`hi(fgkb2@jqr;fc6cd>wuwz< z`RquFO?Jp(A8AMj>6P^;1_C+D&CShUq&<^@ftjqzsMW8${;O(o^y{u=330uqhWb;u z1fH4kMa5C~Vld?m@s*4Cy6{@rI8eYWsvWrvh?VnQ4JIH20f^?Gxi51so_qoTpX>gR zjsbnxN0?uN`Lh&`;SfC32~ChGa~=ev*XoP3YpdyuNYFgos+%=WP4vm{O#O}=D)AZU;e$TV<}rj8991R$3OHNy>Yz6 zGd|$H1;x*uMl{^z?#>LC?DOm~L(Spi*B&!RJE}!^iNTEZADzIXdCtVsrk;9?BJBE~ z-|M0$dnfDT9Gjw^-^<||ogC;{_8LZy8mY)ziWkam7b?vJ@8%E0RZ%B{B|(CDnH&#- zb7NmE^HeD;+cb(zbtxv9r4zHC&_2}-tlCLgFICML| z-X07+)INZocFe9gl2m^A&#Udt(RVe&y#LfpC<6ol1+Y>GJb zfdn~DieTzWuWvp4DKHxK@ZuMib>M24wyL65W?5%?LLkcEkr4?WqY29GCNy--{Tn6Y z=Kg7#)FzxNp!ufcK%}#1XzML8S69Q`BzJ9atK#B$^*|5}T|x7q+lG0;@fl;HwfkmO zcd19rckF1v1MPM*-%{-A1ADYd0jo}0F5lp7Hi;-?Q%ylU!C!1=ig`IcX(x8nh&Xm!A43wA0~9Li znq&|NBNQlXdU$Q|r)fFY2``)Rzz{y8Uw@r=t{m1}{Sr

BC)V%A7uWG7E>|5IMEy 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

Z%X^QcNJkRhoQ|j%t-UUjQ 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 AL;wH) literal 0 HcmV?d00001 diff --git a/build/ABAP2XLSX_daily.nugg.zip b/build/ABAP2XLSX_daily.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..bbfeea3953868dedce025f6e5ce001b7c2bee540 GIT binary patch literal 576206 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

7dS)k+jO9HhFul?9;Yez=AskQv^yQ+ znv0kvkhEx%k3cj&seSY}E>p~uS5A~6hN!1X%YrZP2jCa*%v`|Q(yj&T+medFhp(cd zvq6#I{7T1#D>38VgA&KDg1Xba;egb$cCA~*cjB-N)Zj2|uJ!x*&0&ME`2`Z=N$wXx zoA9G{U%MQ@-Ffb3QLFI7!Swn9tXsX|_`03{G21e`pf>gV5@^0lAT3bfLAUWt`_kY0 z(%%J2f9IRAcu@{brcilt>?xe3uaMPR(tShzrI*ueJr2#*EG7Nq`-m6;$f6?~{an70 z>d+s~a<`BVZ3Nkv=ZfO14)b`5JBIe5e0{?e-&!Hshr6e0puNGlA5-i(SaR%J+j42- zA7wcyHY5N2(Mj1pipYH0HOwk>e3Q0NrkMG>WiS;2O!|Ek5f_fQdv_wUCL9wq_!*3p4>%z^+>eDHFhM=n?S` zZ5F{xYiYUmOzFbiw2C*PXcvoo7d_ir%)zewOXKV<0vN8#^jwRJs0emP?Qw|FWAx{! zJ(&au=CK*xr3q+&JS?5o3h{BAiDfy(k6xqby^OTpa}ud>$fkNF2?Hh z@RKTuFz^^W-{}uqkfCU?aa?K>c$I#jekM-v^f3)Lk7>gYkogHkHX2A-rwyNnir?Y{t%(OLxc%sV&+>fn>Wu-?7T}8o~Pe7(+CEu`)1p) zJqMcJT!wZ!Pz#X49m-bRja_sV8=wUC!p%>x?ruitXUF~K!Jw@&Ha8-eqc=B4?B=Gy z;SEaP+5oKJU5$tK6lgzV&gX9wdu5ReNzG%O7y}V*Ut-wDI%K)U?0Qde*s1%(dWFU?z_+XV%i%aiq_s} zYng?+XQ8M=FO(Lj=50_C?4h}1Eje&hq7vow)QK%-03*aj=a9wgpDkLI+P8*t^B=H? z7?JDj|L!awt#H^gL|-p(ZDjoA4Jgd`@0v;VMwo=^^y#-W0psQ9CqvtIf@SWOo!QMa!1 zpd3lpCGekYG4nEp=)fosH-bAyKs(qC89{_WNR%d#QVW z5sYrR_h)9E9rY8q01RrYl8pbM-%9ceWRP$d{bl1h$3n^2D;|Er98LAB7WyBzF!wOdg4N8+9qG@x^)?c zQk4ZLZC-;>u#%#5+j?7Bd?(>YurI}i&%;NpFgWRuifm$*72KZPfmOLd?wq3Nl+=O%a4(WfXN7uP|$(i!OC$Ko&pb< zagJ=j(VlO@VRQ^YQ|T^7uKyW-uYO&yyEHIweRi=bl(B}sAG=)XBIqIEeZf?WL+Cfhtml+tPW5B z_Hym4J#nc2noe}B_mu_IQsUT zm1xK1&^zp2Cf?E6eMHlYKEu@M!5B8RgT0T3xL^s>7QQgTH+ZZ^$&p1peIB<*=m{I) zgQGpJ#@gVcKJ00!uc3E&z=}0_ln0kDOv}J8z`~ao`ZI}e!`1|tBx@LyS{eZ5#ohI= zpe!9YI0t;Eama0)gJQ0iElTOUoMJfNeDz)L8~rjtyw64O^_(kyOm)|Yx@MUOwgi>*H06q`R!JLT6Vr{>eaXJ;>wk)J@3{6K zFamR-L}}z^M)cSq?rYfiyXE>eJZe>##=&C)yAoi_N7q~--HuwCH|EN?H5Z_i@9;4vY3Eh07 zj9H6CRMfGI*i{j%7OcCM2t3KYi5zhU97QRTJqNj)P4`>05J_w#Bn)^Tk zU1D5C&FQC!PoUuXL~x@|f~Se*SeAX~7RWM{hBA7Z_`*gT9~|BjeSx3yTs7v6-o+)` zH?!jfsyiBl?Vg{i$FL0HS@*nm+TDlkZWXqRNl-=1E`}s2qZx|W!9CK|xNgc)- z0&`}_hAIYkI>2+IJ-)m^pP=C%pbtBwD`PMmq=KL$5SIW0S>cD79e3N4tL{+W)c4%< z?z>KAJnp9M`5_bqqIP)zSab2thrqDi+&Qpn3UxlcNar24bHIS&q`hiu<4s-Pn|5YQ zY-Y#TVA-8sZ|eHNn%nElK;aFYbFw9d(JjcF3@A}(+X39nQ4z2Ld^G{9n9hkqZ(%O| zqA1j_w9dy(5d3?4_N_?Q1CE}TIUQ%k7w_YLw^q(;0Oz$#-DKjb6 zt+NFlclMS*vl9IWn`rg|$X15QS7xMOF3IX@`N4Ba`DCh=O3^uL-Kaw!3zZ;D)%uH) z=T>zi7dl)kflk#rjHuJU8WM;jeqES8)w+tJGt?a<&!$k$ByIMgym_I#H;5NW9o&}k z$82F(KW5f~q=Ln-TR3Eww1vx|#EhAkVjLM(lKC=wy?wq+$$@v1>LTxol}gMAy^B&* zW>k=jhu~3ZCpo_eQxDl!Hfcwyz zt=K)K*e0EqGGLixJZQ*FnfVs8x|)viI%@ED6bV3jS55w|E{6J5URTG-uJ&O_`!J-E z!;t85^^qRtDC}UHcQ7&e6CV@v6d292uXkr3HeohmjK(NNiL6quRV7+H=HGS&vwa5i zfQx}#dQ_E{s#!~V@Hu8h=uuUIM1gp{XGD)FM{XPuYE+e5uTdXrMB|gWfIm&*k7v4o z7hffwAZE3G=;zDvDT4l|iQ9gr=;zGdDT4o}xx(;F@z0f@P6Yd<=N;Nn?DL({FqY8% zm?ry}MnZ~{B*qIQI4Lu$$@`-dajaL8)np^;=$t0dA|4cLEXYZur$CP%;5FnFf3!VInW0u5LK$fV zde?eE8W8Yt@U1pcE{4-V_Yj>^Se|ifFBS(d@i(mc=eSJzkmx(~Cpq0j?NYwSC#0Ld zNA1|}QA+D@0OIiR_rUoZhPr(qx;gj#l5P0FM{fUbEiC6_v zGR7pSY|^4X$QWHJe`J10p+y~ZwO)K=h{l;iqdBO>e6n$HH1lMCx@mZT1u_R0u~&;~ zzHwj?S7m*+X;5?LahW+PhUr@LCmTn`@LT4mX`>^*(5h`t%tfNt7|j*FOV?Y$>%=6; z^9^DXejcAl%IA^PkQqn|@8Gu|{-lj^ zaoibRkA?$SIx}jYPxQ1efKuRWpAn5UqVV-LADeQcvZU$$Duc4N7-dRG7R}D>{^+WW z@egc~QMn8SyE1%B02W-joytAYx!|xT_F|6UQMmlEvLP zc}UU%nYB-lzDg=7XjA*Sr?*NY(UikYE=D1a^C9UJ5)heZMxkJ9C7VhdAq3K?bY5FI z3OA>+$;1(8BbiL+HCA_IdoPqjBvDV9#7syzy{`?`KK zD#u*lNp&TiNY6r$HU;J-D6~6)kRk-DCJ>S%E};O%*&`qhtm6}MQ<<$j-+4enqTm>f zTNnH-;GQd+8nFP$MkxW38xa}?NaBMuUggsXj&aHfisVNp9Ta)Q21PbFwM}?}7sN)& z#;cG4D~8z;8TC0}_M$&62d~F37_ZD}bryO#aClM;4n;zt<2FWWFmwzvaA{NES_gyK z2H>AWCMLALkVH%-Jd9K9mEl@*_@6u1vX=0do5fnu2KrF3NJyq(x_38n!}$gP`5NCf z$z;Z+=4t0>pRq|=G+#)IYGV3AaAidHY0%PBb>p}_21fUU31A698{;V$32Dj%Rvfoo z*Ln2#qmE+m5>a6MFfU#6X92jd{xV!s)ex*Y=n5kh znEFLgssdK+3&Hx|wYew&=n@&}V;vabBH-?j8SCozW)T`vK!;=DsZy|qu3B*3eHCmV z1t$$`Xs_Um18@bV8$c~S*F;9j4G;@~&;!8~fdn=z9U_;-fC^(1KomqH($S#jzLvLc zu)4-tEHr@`VGx@YTM|$qrG~(P{rng(CFqtHnDt}j0$v1LMnO=)0>=r*2D6%2qVvgN z@&tsaj6_EFsN>#nd_C>AQ|@mBZ^EXVXBZ+O{3c}24cr@kFdA#av8JcpkP2UAW`?EG zEl>Noh~iF6+|{nt!32E=JvjLnVq%TStr*ZZG>+(=q0toemv#YYq5~_=7{~4@K?#Kq z6AkfEVX`fLj$`kckA@?@&W9tezW0fjC3vh-Zu%f*CL{(pkEOmwWazeaN=Pxqa+~h& z{p|1klz8ula@bRGATjqR&k5IZj%J{^YcM~!UV4@b><}ElwJriD>Gdi)p~W(g1=q{Nlz>AmsjiGIemF%&uK+wPqj{-M3~|WA!ZO@ zSt=>3b@aqyKVJwTE3jXyb@80O9Q!pT6j+3i&dPFe{Syu%a=3VkmQ_k2VmwN@2pt3L zJR2IK*y_><$l=$KN?`vp*sj_E9mgiQ{QjzkhBLrz}+9fRoq(r8#>amExHvKJFx z0{vi^cxl8dv9eT+$qks&h*@Hl;e28;_j6tV zO@k{;>8S(vP~fL@0^eX62z~R?=EHVqF2Jo&s9IE zV*RztgoyIeaF7G+-BIQgo}#`dJbs0OVRIsjdz3Y2x5+?K{>Y|6iI;D7mI|Azxuot% zcBhJt$UE5{Qk%j@c@U9>}F!L<$UihflV-$Ro$_5%SZf8fGiliD59~>ocPJHY1f)e(3!6C)56%)73Uij~)^960W#OBF#gG`fDt7S{Pn&HC$u?2TA8&L~Cd|KR6b4^2Tx}7Pl3|&v-@vbE6 z&z+of_Vwpv)t`ezsG{&3gi}VvIoNM9gFkwTbgfYG{$$USVPETVbnQ6{doI}bOuX4H-qp-Bg_GDYgnpgu;>?KmD7-S+rnclde00cCEw-@4AD zKtYHEq(l{{Y)E2NpHd)kF#(1o%m*|ipoO&GVW?W46W*2M+JC@cFoC)x38?xwS)?Qz zr0#;{z!oS{l7KfIae|tzwtxaw7G3LbWAYO)2kcp4JVI^+3&kl1v^&6!u;~_%8r*;y zh2fxtN1WokfH{P=kY@yoQ=k#7EhL)2;u2{BtFTNXSVBULAZ{(y2rj=^BcR*KHG;?` z*a%o*$wqJlL>ocdQns(b7I%8h$(|3^++IIy zqLS4qWqzVk)=}#Vp4Rlt&Q5Y>#98_WzW~;FUeTWk!ok~EwH3->-518$!lI5<#MxJ_ z*;lS9t#S?CuT2n%WhrY5&Rjp4cb{<`4VwJEf=Barin^?8q7l&a7vWZo3 znoKq#qRzxBZEws|!9+I6UdZm44t$YKwQ5}&$(WovlT7{&xms@q6Vy~^LY1^fuDBLS zN>o@)i5A7K$);GfUX6HIUCqdaE*i+DP^AQ-u0Yg6^VCydY}8 zSNL`>`ZY|1Rq=O1adKolPi25#(jdL%e+u@^qBkD|kdV3#BD$7Cd5_-C+}k zZiXMxt!|R7Zh}_wu7wW=92s?!*TPRP_SeGYT?+?9sN`CB(VI50YvBsIfpM^MoQ0>r z`#ktY629j&?31g0y?*;Ly8py^SBkk7HtAfc*Q#;d{#WX!a5|(7dne5Nk0WqzJAk4M z#Gu$q5h&9E(26j~-{=mf7kzRG4RG(cdBon1bpW;nZqCO$ZUd`nIzTxo@u z+kLH*CMHlzQ-eD_Wk%OA7xs;7Zyprk*L-e{T5G?ni3v0sxd8OB_EFWZ#>465RoX;C z+~>YDu7R>;h#~!MBbac;-A1T&<=$}*;sgx`5)&btwD{sFuA?OnAPu6M*s#$ve~7qQ&!X}vteG5j+|IR_!`O&3@(k}j(jr9#>X zSF}kGB@tyq?Kq9#mPRU#xXx1K(J0zt)sIH;eOnftcJ2ZswLj&c3O4JX2@RqRVsUCz ze919&D_E7xwI_FAF~FeK!2}W<(FnhbO<} zmy$Ayag+1v8@K`5K|%z3n2mK=X7|>E#jkKm+-(;qKD*nSHF!S4K>_=ZC%>G>md5jDmeP&qNEEaMc2LB;3XCiwqL4M)vIArp?u6_kj>Q32hb zdpIhbEl)Tqi46raKDcofbA=JfAVL(pIHVfdXe*r35Wk?ChH?{c8oo$v9g1YCtkR!& zw24LoU|uj^z&g2U(}XYRhDjAg>n^(G(tJqo6271t-eM08QjbfkF>-_r}o? zFNDLR!azF1>+7~LQAZ6^ z&>O~A@N<3L?eb#pC-^ydcsQ7gRE^9VBPNZH3Y~BY(9VY@bK=ZNbMaO*!9;5 zSWK>XfxQEu3PZZq2Ga>Iq=Scp!jJ?36$2wSpTe{G(w}^3obW<{YIhE;gV4x1A{= zvg-c)377c!TpVO)Iv%To&R1hP=^7L5derAt85qQW5lF?YPkIELp#KYj+Xj|89gEHO zzyAw-qWll%Jn@|_0yDgvlnO-dRizQzd-|Ov(4==Q`_|I)tjM6^9ddb&!j*i&hzS`fuDy^jr;tOAKwhaPrJgNwB1sLBeXYq_Nh<%b{F}GFWXM!dy$W-t=UA0VPnf;*64UH^oaJ z9&z@TK)kApoG^aqmq0q~W-fzr)s|)mJ>V~bXkSaCTD7JpbwKhm=!QIIWzel!dy_gs zdjWJSQQWG%()^Ny4ITHCVNO;nY4MY&7ecva8I-GbZA&@Vdm+R-E`xa0nv*YT|Ar2B z%b;1cs~dAh`$EXZQTtGwY}ID=czHxSD}!j&rT}?~vi80VvQ?Wmgo-YCAw)YbgJ{*J z7hz*{UI5*2v}hUI?W$KcI*|3H5Uvc9q~g++Y*_G1AzT?|NyXJIsUYi@LbWoil8UQb zzCdAXmg3-&eEohC+2R)fUI6Wa$mcSIu3GA`_q$#Y>B^A2YV~FOCg2MqURmd-$5jg- za~Y!E1SE0gTTtyNOJ!CYqxS-6g&UM1V3m^U=;hGLfTf=8$+<)GNb~tkyyKvI5Pc{2nC`u386WkaOgv5UiXu$wZ%><)y+%x2#XUK+Y=Y$Zl(kz)9Rjo zb4O!m7k1j4sTD37vguW#TO@^EvBj*;6r&b;*)%KhFf@f`2@|AdRKo_5Y#Kdr)vV`4 z0BpF*CctjE5i2FYCKpw@(%L%^^Bjo4_WB0wO3HV*3fa&g<_BzdZ_nq}a#K4AJ{P@x z!IQCUY^_|&L;D#O)_+oT^Coh-v>PWM-d~(_j*dFrUbAs3(dly0nNDB`P{L_;++ava zxl^8tj|HK=T*nFmA;X)Zpsmrt%5fH+0=L^r%)@dq)%vvn z5E~%}Ue|QLHMkrg2~f=fpqj-%9Txy~TnyAn0Z=E!K%Eu>QQknn3NQx(CdwTMSONAxz(n~20V}{D*I==qUW;WSF z+Q8_Gm$1Se#9A`*GQV4{d1rBrlzec>6nMC5Pe_mX9gWq=v>%jpK<7jk!(pH43Wy85){`~iF?tyc zq&)xzQ&+*Zd%WU=*3B8r@Dq4X2BIYfKt4@^hhL?AlvnuzZu0U+0$XGw7xpn$dn(Lq zt!DB8+(AvdAz{bE&v7h+y^XnE`1lDJ?1n*wAY&twdR8c5Z&b}8;TGddR@gv`2Fpn3 z5#)me8=yB>Xd~8lty{%+6!c(!*tkDzEO^)mCq4Cm0g>a3f=-po@o+k7y@r~D^-k%d zX%utyWz^R?8uH#?pCy>Xqv_7O5ncWPyZG&0%8QLoW-^@6x0&>DY<8SotnG!5&;^Z9 z#lx{mQVu@PDHm9dfAd45x$#gY)eXb%mZogrr#=|iNHdOmGDT^|arjvp&6;(l8Al4w zqBP?;{49-T$91L|N5-t8G~+mnD~)C+b*33dvaF&s<2b-Bjb^8Hr5W}|l}9v=`=95T z=WyI4qCNaIrBR7S2gg-USv0Dxje(DE%A*m-)lOM7s;y0dPrb^c5l7M_Sv0Dx4S^2} zOWYK5ME%GjQf-X}a>!aDm7dCX!5jqFm2f4R5KE080(WEBP`O>hzs7MR38@bSw&X}Q zE9kF~jdX3-5Dfpl8O3d&d|Z2Zr?|m|7WfB@S6G@4RuH@3~F7?Z@s^Cfx-awu>dPykPA z$IzV~TFs&I9k9%L%I$i|f5pDq%{~+FEoutI@UrV9FTpCi6|hA)lur15MZ3{X=v=j(*ot{+KNc3npMOX3oQdvuvSvI7_eZ zkXP8n^+vH*2EGXzrjY?m{T6o%Fbs3D48T9+qA2pk;9uDR4fG-X0Di9yx>^s79!Lrq z8q-9&(1dpbi|4#PtAl`0cnGB=^)BYF$;=TeGmSKv32%;~w#0-BFOLSYBn4;mb<-_S zC74IOI`tAx4vH&unffKQNGFc$XG@^E{b zdF{fJvY_9L{tR=mx;LrMJOdpv8RU>DJ{0nryk)@MIKJ;Z7_Re}1O^_mBX?HtS)dLZ zM{n^rvy2{-4UvXJr%DHtuh$pD{^VEXFAM+gw;o0d)OWZkdodj5X~I)~MW7G_Whn5O zv;1zk0UDe3(ti^=#Sh>#7S?TuWTL=hq-iNf_<4Ug9D!Yq5}*+4?*z&}Ujg<|=0BIK z+r?Z_|E-ue=F0HhwRK3a)9!Yah62B3AmP_w0f2xG6Z4CH|66>B2TCJs&#(N>tP9RP)JPK@TU8v+Pe}b-kZJD}_|> zd1C&Eo9Ola-URT_=J}2C7W5O6Kmp7IS8sCJn=~TO5`;46b3iEHVaFBHi7eEL@_DR* z#Xfzogv^Y@goZ*_9Zb}$_qf-XXbw{)E7@U6lZ17WDF}%Hg<>82U~A@A{GY_zI2)#o z2TKnya$M`ya;@deDr2|FCf?vVv4I&BJXDiny)f~Wcq)Z^_PH5KgL z{K4HjY%10}qBw8=q_G$T!VSDI!sZc_p$-iGNzlQ#tpQ$uI%|Zob>Y3#><1nQwj6<# zFov-$@8WtPWy`94ZsbLMe=JQXj|jY`82SFO(PXE3!%@->09_cBWk~vM*cJVZshaodglPBS6GCoR%N6J!4HhdnAKTfVx zl_OH|v*UjA?k&p?Dm8Q(7rosqkBQ0gOiDL|Bq+ChLkOnK5)KgN0n&#Z;{p)xBa`5l zxJ1wkl2^Ey%p{C6O(%OA3Dk|9bWuP?I2+Npw264nt&S9 z7f%X$qWzw$fJdlBYA$}%pW16r`xz`(3D*Q80CL3%o@u!mHfT;-Ct(M@7-MLn=i@Qf zIA0B2PIC(+fbL)m(#No`kKmt;vqV2v+U1ox2@sfz7PjfzEUl0UB2a9b`UmX-b{gm> ziSCf1&*=!gPeGxPUS}f77HNtw)YNcD6)_LfQ@*ZC1Dc}fB4EQr(TvL0HQa<+$tK$M zh+5pKM&!UV*;nu)v!{&BYH*M@R7`FYY%an<{NDLOtf=_tBaz4+ zI5gwOdj9a!@JZgQgRc0uSvbh1!?uR-$hhi``FMc(=3?0WD*O?NY={h2tY+vI!;#Tf zdpZ~EgauykX6b?nv|@V8#A?vPaYB`#v2MMVlU_gt>iuz=^9>mQ6T~<>%!OFsw>}vCI-uol2G;rvcsc_DpPzgWv zz5O(5B$fk?Tj9=PffW~8-f>XU+y;ycN#${oh9~(OUy8nMXp_F$?IxMx77Isg0L)3~ z!Lp!pn`}a6A?dhsHt`4$|2eH_%BDOsY$s{N9E1uSvnv;_Wqy-Xcj~P9p%6tHbOMYf zzYL){?=m^yX>uvV;7HCSg%|<~ZRd%RbH#WoT5#lDl0u6{EohO9Yv5Q-5J5a(tI8?@ zC50f#hzkMJEJDNX(ocRt?C&N!DVmNfruCyC$N~L9GZoIF6NY7+iUBoRsvEj(b22XkH;GW^Q{h3@e zgcl4=K0hXhVtRjcQkt_YI-S}@Dn#dG92G@Sq7DV+?@(NGd1omw2M`w#xV*{b5#f1w zliA}zQCBj|LL%r#=BZ~Pe?iFeBU4A8yGS7>*nTsCRCuXWc??(VnX~j`$1mH|1uVK# z5u(jbOH9h;hjOXHQwN}mlb2^e6?AumdjoIz>y@nPeI>|6+OY~f%bg_xb|OgjqVQDW zt3WyJxSs?^y>Kq$!77gKM02g)qBUXI8=j(kpBAsPlSqegmK^D{Y+qjO!tGd{@fgOg z!imZPnf>mOC5o}*Np-eTV9r6&JqCv(zIJfBdrn0minWzZ7 z6^9YnC1m7(-#FqXSXEgS1Th;W+ex{Dx*733V4W%xT)k6%Mg|f5a^~mBia=okP*Sru zWFiqKtwKXr@G7KOjzKY@fy$eryV~)G9!fQ0&gXAZzkvyDx5_<|#|^Rb0#PZOv&SYS zq$m+NHrWO7N+6ULE@5nUio4H0-qs#@j`6$Ei)DRJG*d9nQh-JQ_BzE2$s->xR+}x3=ry#P$5&EX?>Po4+CT zE9l`RzDcQ>L6^PA|141&!%rrKWIy(^i(}YxCH{lHj8*J#9=*-2g4FWyRydz9Q_CY@ z>I}q^nhIev>RSiDN*T;p?ZGMnvD~-}o(KYAZhPZqeR~Te9DO<&j)7Q^st&_mkUaUb zreDD{VgH`0%18C95>;kk=8f0r03Krh6RZwj~*_qwi)$ypBOW zZ!lS(FXFkQ>FxsFPUC8(mt!h(bV_xTcy7?B%E^ZMEa4AbO9P=8brB4$J@}ga&Fx|i zND#EAzd^&L*{!A6ao!3FYEjJ+Wh3GRw({DxQs~9jzlsCH!$G^bTtHO2R%#09o3*_F zZBY~B!J6Cahh{!#nh&@piR+2PSSSI*j;kb+8g?=rjry9}B>>{BGHSZqS*!v>Rm!jy zXhpxG8aHZxqGom;9~C=nb`KHg8Q3QH9qkw>R-zD;)(mYb-h`P$<3nALdVwUFD4O*_ zFx{o~!zX-dgB{A-)c)ZcoAiQv1MU7AYZxZ?Z6#3h-~U4{tVY>Psa;X1Y2RWgVpcYR zqC|PJ5+H(F&s&*%hlYVKQ7QmOI7KgDM_kJ8RiZjii0-f|4_wAzLPbUMfgVt902Iqb zRd5_<72IXJ2~%yqah8jp3JHQG58u9u@+K!(4A&EaX>2leVqOiUS7ec3RC%#FM+lp5 zNtXm?-8HCQX%*6bTfRi52mv3}T|4=?oIl3!6BBKXA`Uhxg)9~2eY6zoM$Zi5%4`9<<0I7n+NO^61)rSPbUgGUtRJ9wL1Q4U;!i^8Qv_Sdtb3 zY)x#O7Nuy?8xlK?qIV!cbX_yj1zR~S)HSRMNEkF>p)_21tTVhG4F@n!W+uAP6C^#r zF2&ggr(-q4T#5>pMK)0Ya!W)Cppr#qVnC^1C_#<79ArnC;VCA?Gq7@LPUg>x5*N5)bgFTcE>3jty3&L(~ssh z(ieUf+0YrJr9A-IV^#hZTo~+qns|)lnW6>9o3n56pK6JK%1cJUnB;ps3)2ZG0Jm72htqjiry!qtr*_TqhCp# zw0>U+%Kj0T8N4-N;CWI>?zHPzjjZp+-P)cTjkCxX03U>|6ku6Gq^B-x_)RNp#JWI& zw@k0};*BD;3=}pQHJcgKV}tB|Q#>T36%2emOuS5nF(li>4`h=quuB5%*ik+u(Dn~Y zF@at59miDxIF38FmoVr6e2w2A>*yf#Vv=29;$3JuH39&C5CGvV1RTMI){95WjrEHc zqsC#%>u7~Wuh*+p-q-Qh%-7OSq3JZ@JY~ohK)s-C{2CUBeX!g+HoP-0CxeLE6o@*P zcm&N#JdGQC@Pr-^Rwr@x2EqZ5!>;-T6OgBsd_u<3zH{6~1BMVHB92R(r`^5GOXwgH zHX;zG_>=(!2^`Xu6R!qFdlHqqm-%)2`fk&C`Sjg3x zrOyMGG7Gzvx;DV3lPj&K$37TqmsdI#Yv{?*$8D_-fALo4%*y%*=B$mr0c_i4KB0YU ziJ7xK1yv}iA(y2<_%%lqjl`Q&q$KO_sr5xnQEaRXPHp8N3UO|NGE_$eCUhd3bK#9h zIwrXiL?JYeoyRgFkgCEVoTx<91tn8Bk@pFUvHW(q z4=zwivUvb7YfeFm`b~&If&jOK84IjV!s1 zb&wKS!uAmjQs9s}a;4)VAL{&&9ez+Emwk$k4RLdLco^H|VZXbu>ofin+Z=}T49on^ z@Sz?$i9E#5f}_;BIk@y?1SHTSpRx zKR^BzoXlHWN%q*5WIMMxo*7x9677*CuO#O(TU#nxqHS(uQA<*eeLn1Oe{m%N5CFlO zY$tZrIk6?6(dce88jVIb-aO3`Wj+4mXED{4qU<9yM)DB!aTp_Ns-_Dyl}bicL)>&h zV&{9MAx%uB-Z})5?J3neIX=c~9%=YN{|_4l?!aqru|+8AXzIEY+oiALWrN`$5*qmt zZyxcUKwYuW{i?&cKOy7M05{&78KipAIEk;kOBmgH(I^cD3;0d@>p zK?0Dd40VHD8BxsoBp-s_X%g@r>-6_Y0D;jMtbcne+nPa8zieMKa-qKeb@s4HNp+i< zmHzSUa3-EQeTI5tojZZcA-$&l>%W=X9#Lb!EAN_CPP)XT>EcO3LhxmhUP#j zjqigWdaYQy6sU;RL92A20TTQBft8$Td`hJ%o?fCR-G8Eehl zsSA#t?#jXRWxc05ir2AX%!!xR_Uh+Y6>!$X(-y+W5&dF-O=?^Og%f92>UeABeS(}L zLFa?710{(c&{vfE*kVraZTX5+bd?`pm{o=g!AhJ8wXU$78PBU-UOBIip5pQn=*z6F z!nx*u!iB}8p3huZ9NqA$f^Rl7ON#rtuJy#1My)r3t(h|*@hOF{r3lGdW`nR=8>j#UF zcXzWfVe7rJ8;}k(MvZ8|n1Ds?&TzvT2rxA-(!wwT-8gCKPr6ny&DaH6O(lt^ zwSJkZ63R6Uzo)ScP;yf5BWjW9PyLUd?8!9a9^F8ObA~`ZB|}Z55o4j5k#CD(2$dUU znlJ>lEc0a9Gu(}W*|m3d?S@Ql8PZMu;-n@!jUum!&NNsLxg&C(-g-a;k}L+Ju+|~0 zLGLVyH}a`124I35W{W={M1I-FkGK?qkD~Z%k$S@yQq+lz-}|5$7%hjN_;R06E?x-e zZ__g#PC4mcS`+kA7w1voS^Mi=3{s{C1sDryrex3l;*3)W z9n=daDT*=tIE~4Va(2-~GBRkX7_Jn)B<0y{95ojI`tLL+k}9IvcntEEF~OP_NG!Lx zo^Yu~O26ldMfy0SQ=Dofexb#om-(K+TXJAX#}y zf|iF93#g}R6AF=6aIgX_hTRIX0Ctr#Ao2j5Qxkoy90PjHM0s8n|s)C*OEC z5Elt5s74eE8vjW=KqU3nYc@a1>*{#lM4;I;X!d_v4XX{XQ}<+JWnXVimC%ulb;;|( z%0$ysD{Oo}19g(_kPY8Jp}dxAl-IFKu|ffARV+ZYDIF$MBZ2n(N86#DwUSI=9Jd!EUoprW_R>M-pjUf2AMu3_lD{|HrIpQ$LHfS zd1}PEH7cdumhZB2KPY;9ciE{sZ24J^ySPq2CE~tTy(8iqrT4Ma7|0-tUl3vA0>Ao{ zyd6qonE7ys>q3sZS+9nYtc%(wL%HY5J^V?1yUR~LtEuohNQgS%p9YD|&EVF437WU+ zb>Zhgts3>>quOF7W%T5OyacNKl1Wu#+)P_eBq2ZSBOqP})b;`h7nIHUpdk)4zXbo` zgm93ngvUnfCTBE(y6EgfuaXo2ANJjXnowJMr6AA)MPhSL6PTI?+j)sVFfx9B5aJB^ zFm^mHo}5>_^Jdz6?Bbp8aRE~^4^Z(@in+~g91i`>w7;iF-`?G$(;(URbvXK zhm_caW{)ua#*@kgCa2_cF0jI+d(yeUjH+bzPtTNDoGT(?Z!|tVAG8h0*uw=9j0lTaF$FGx?ovcNf)OW8a0tKgqCxjMC>!E8MrhJRE z^4_@JpV$_ZOeBY7u=yRH=T0(_w38A3xIuu9SNLM*Z0S0owGRASZ-G;V-#RcoB091| z9Fkk>B=tN`yJKAEgVKndAHbi-Jr2J?luR0;IdF17e5t?&lzk3Ea_pf6m>WyS!VTvE zx+bKug38*A#s;mLX3bil8B5EI9+yksF+pJM%)h&fz4SU%T!Z2u(^=%lk`34K%Y>T8 z$*;5smKnidB~t^0Nrlzyh5%FPv?zLeat%U-Gi2(Pnoa>mrJ9ox#jxfiBo%S4U{NgQ zl}&cylaneKW2-j;Dx40xbhDlQ)%fbTs`0%*CWh zrMp*uh0-+O)E`K7_?Ljr>rI4R9BjxHzzyyushzCGe6t2IG)d+{ChcrxS!cPlvtrg+ zF=U6k@KZ$7Q2S7)o#HDze0-d=J z2(Cc&2#fiIS)<&uEhLP%TwV6tm^v@C>ABPRoKD@rNLY;A!Flt;98{8x5Bxc_zkrFu zBlq^4!<3GX&_$ewu#d(?ETiXxJBqhO$toPhG6HVLCs*UTFYl8hWQDfd8pV#3CF{RB zUrlRM+H}wmS^u!6MCRRgtD~OQ|A^=H>2Ub8&$AX=&G3=(q}U_nR_EHq3y^YmcY7 z%rjU5D5xa|%Y&5BsPF<%O=Ykw^3m8{E$Rt%|LG`Py+NEir{{KPiY97!o0|RNUb)Gq z44Kp`eDkg~+d$P<(aQB2lealYS6Y#iqgf$%uq(D>%>8c0UN?*_!By_ID&n-t@3N9Q zthl$CdE8c}PAmMBuQuWW);(I%CXXp=C2TDQAkH(AGi=jBk2xJ2TUtkq@!Q6mCu0Z_ z3bGrhmZ)_k+B2tC?nt?5d)NhiEG{8URfPJ~9UFU(&~eOLfED3gdWH$E^4fBZ?L=(q z;<&0J?a8S7tybFRwdsB$+MgT|6+6U`PtF^Al^3;5A; z5vGoKF}T!m658O1T*UL(!vBazQw;=S@?txe1$80;1(EUSAytNq>`aV12bMS0I0ZiObKld#O$O4;WzwH-6z4G z!AmwXk=Xf;(viQOE#1pFrR*!_SVnk#%(bIQ3`kA_xB}yK#HCh%ogi&7ip&!I$FXcx z;^0a6n|I;PF79#gNZ?++jKRleeIn1tEZ8`NY_ag>qy>$Sh}WB@2U>hU4#EicdTsS1 z7-M(gMo^naKIrPN=?n6Ud-B^(lB+KsC3Sfc^IuGdMi0I@aue~)e#Hfg^t>R9V8EIK zwu2vm7r7K)Opkc7UFH6k^E06Q?EGa*&QUBElVmD&0oSM~ zb-@D_Lf|bnIhk1VE#)%H^nFK~9ue~@XtN4^pv)E;x4ArGK+w>7a|G=c8!1qnQP^M#1QR*9$6w>8nv$H1awjJ2ELIx98GDpY-@Qzvk|@SX z@k*4M#>-6YA=axbnIL}!QD7HVAouEFeAnVs(%x%T`I%VuF8nBh8U4Jg>paqj)EW$F z7=A3xa7ixrDg?1k6bs9wG;e)b%TSKoqm@Z{^&*p<`uF|Lpgn=Vz<;&-wLu21IF%ls zYUTVK?y~RRw|lL3hn<7Q;mMKR>e@}5?W5CZzw5P|&@}>P`*Ae>hId27!Wo0#&WHWZsB25ZpFy9KPQ1T& z&&Q~|>5P~M!0Z_JCx6Ta_Gf#5{zlwcZ!VVJe1fU>_xaKZLrcaF_{<5tTSA%Za4+x+ z_zXQ{ng=f2M)Bts+*z@HdQCq9%V6!Vz!D2lLNDbwNymk6t$c8nTg{i7g=_iIHP~gb zT!CR>h8^&M`Uc&b0s8PJrWwLBx5L`VyPSP5QL!uXYDM`Le%G ztvw15iYo^s!Fz_j!!WQ9CXr7PMJ5Bh15W~Qd4$jyMuv9UvWJ{*%!VpK(U~=O687xcqqUD9vrU7GPIbaetOMVv6A-Yw7|5;W20H6w|~NGT9T{bh+3B0oO| zIIX2Wcb5H|_0k3Bi^$>UhQ1_o@whf9gq&(l_0nIEnEONzy-6dmjd?5E)xC*SQELyB``ul zm}Ve;x*5K*?){Cma)H!9$ap;@Foa1$N)ZO)mgLE}6?#`ISdGagGsH8ACwA)01K)IJ zH?T2_eT*W5*Gj_!^c5lo!G;VE(QzVhj=k7`31pZ=u@6Jkz}ePP8_49XYsH(AQFS8| zSA|)OAhdeg(<$qo0DqD@qbB+T;PbgZp6WAbrYAlbcgCYHO>E(SKk&6*@;CUhC45Q# z7VRfE5NHD|q~S-@V!t4F;Qw>kuh9Q!6u@J`kY;&?$PE~CE(vDQqhwO{Q6t;2cVLn~ z%luf7=7*Hp+I*W^ptXU!mD5#SgAnod0vJ5b%CfQQgu5(Mn4MfXG;?RyGiS}#!`o66 zWTOmn=zT`v*O8yloPvfi2D$|E^3Vc69b~cnh}9L%o`Eh^;*ZhwU^TZ1EOXEyE1M5} zob$u`(+vwqcJ7>q4egEYY>0KHqPck?$n6|xX`Ma3&|AO z`+riCAmL0c%=l=cp-}#0qW4X>kTYQK$!K{*ELO`S$4e2*{z)kMOv^r3WS*LktOu&< z?XpI-TtPh+Wt!^v5;v(Nh%QP!a+krBABn30x<0d${^MBG>E7kczxW@pq0JIs{Qq6K z(aQv0J^G$?6K1n_j67+`(xh4BO;k?K2-l~iavn_?f;tyR!NLSdMS>l^B!Rj7^Ti5k zkbml#HZXRs-TC*>`f=?dPpFG`T(A}b=v`e!j<<3bCaWQ5G|Q7&4GAfeUD%kqAKjG; z>%RAv&eaoH9`OzguQTMUfX*MS056=mH|yx$GLwGVye`SdcP`nS=>kcQT+X|I9?s=I zg}wbr1)oy#*~Or+nJ|H5XW78L@o(L&I2sJgr{JQOK;ChdPh38WX!ls@n@Ib+pH$lO z6{dMS5?!J+4X#JC!xp45(cp2Vno2`^$iplcSX!!HCJyxJ_S#2p-@Q9(z3DbPZ+gv> zgZJ-YoKNfh$=mM1n?{L1pOen{#2!mtRyED9Se{;_55t}<#r!ZMRuTPUp-bf5weK%O zl!lEDvtb-!IYM4iFA7t!D&$MlRTH%_<{HxAjp6h#1#omeg>P~&8?_L*mO7AM`rYX# zEhy9?j&d2b(=j<;dj@l)ja0}?WCSb73H^K|LY5ha#4Z65>oiwnXmhPJG)NdC4I6^r zGQ8OCOgTo&(4!5K`E3tDD2YH%k7gM`Qsbl*84GHJ*~w@$kgecB`)p!&vz9Mzl?m^2 zf6_l0=&>Vhw6G?rxyrZ^w-7*WS7>+|%J7U^JSd(lZ)8}K@3)I%%>jI6_t`Cn@|8wc z5!A=-JA!J)L4ShQwd5uRjWJd%yQGC&l#=gtdj&;Ux?++RX-)hbj`$poSTr0FPWn7_ zuJo}~+%XQGJU)&`=ipol#gjkRP0!AgWAoRuLBG?-M;uuGkN$x}i@^MTIKiTu@a*pp z-tYU8FU-TfI8>9U8oF`~u2?rfd&AT4KPrj}Gfl0SBPuNR0mS;@(S+T}=^v{#vug0p zI&>FC^ndeAe?$7m`=AjE;Hxxrm21KTlkDa-G6C*^kDUJ8zMsv2(I!H9Y?kh=yENgz z(K81!I6y43Y}$YJLhoW}ru`3}wT}tyk(F(%c7Aw^=-MdN!oyM@9T*-t<>_I;BxV)H z?EupUzVrQhX+r9Unz)5zo?+2j&jlb|N@8L(A70eI@52rwK zZbEue{Wv_g25tx|YSKWPGkhKO+8TIscLfg1uzE54EW8E>^^1GduLlvC5Jaq=55S|t zf4N!y1|Wd8s5lF-3t?J1>q~n)ZV#v5{s!6tW`l2m<(Hi4 zJpdTYDsWcOJ#wm8r}h|%;Iw_xAM~f+AojifbZAc|R&O-6+EDnW{m%KIJ+{uy$3V^4 zdzLkET}om|Oc{}55+nDAA3&!{DWYkH(KzU*wNJhc_xy8r@=3KZbyd5CYB^c2F%P)?ei=~%* zQ@8A9-Dy?+#QTYgZ$c+Vg3T`kpSBR|O$kZ`EXIuQP4LFmE6iN1cM0pErc%F;NSp;q zvA2Xz$Q5UDC73cH>L8mue!bKKy@#vvT~PuRmJrISW}Fu^b<=>7s4#9&s9WNvm*h|m zYfm6OQ@?7d!b_Ul(0g*nZ-G)m+54yBCVddqB6lu73Dr`$52Lhd;XKr$Pa3Nh#zp<` zs-*%CcHSbFPt$Huc(AJsaC)@XOjdwXO|&hlgbEyaegdOLyg#TkR^vg{R7H0XIa2{W zQ6oro2O++2|2d2ywSOQ*3so=>-jug^*TB4GE@9ID{LU|qPOKb1nahR;G3RC1Gf%>p ze|%dibIZfu>|mV{U-LZh{#f!BC}+~JC#p%rTOgXN<>$~M++|PIqL1ID~q(bTbRDg2jQ{p|R#Cw>Oc&v3hEs_$i)+~4| zc15zVodCnibyn7AC-5BTxP1Bbcp7Zn->lu^9(>{an>ASjSvfvmeP8)MRlLLhtdIUrU=0{2&#PtIFv_v|t8W{{A9hrfWcA4}5Rr#6cSQ_Dkk^t2y8ZHjAyJ>?Ch-3L#oh9Gr>JaXCyJ{el03#M_}1L~I#X zrp2|3(@KeHlGqGL2KkRHOPv5om;MN#U@fRqA0}_xtibW+2IxDSzKytEcj`@tB$djF z^2y|mg?P*{f+mE@lTN0TeeihV3QgV}Qe(k16U{uGiDq7TCK@F_D+-XU@%hCg68`5T z9Zw)hhmw2Q$M_l^tUO6MXDP)9d09Wm(~|OxBnSyHu#7V{)^XbI+KzOWjLrI~GA)@9 zN|5bGlosKkly^*qM5u+t2=Pbti*)Ii4!MI3pQJz+NUHQ~jw|vp-HQ2`ZY$2mq~v1x z(Ar-^eLsPmHV>t|x1Q5R%A~3iPvp)n{p7^COyY^3M1!07O|=?al{jI}Cr;RsN2S6i z#}AWt1^hX*zks<)uUDquuYpcv9g-w)Jnz=xBk3dcgMO{W}5L7tCVy0jLzY+8%0c+0AJ zi2iHn?qUzoe+})ObAOe6F)ZYG}`Za?dJOz#h*bd_=6uJXY=O(HG4F#pyNkB-s&oo9b>zfH0k%aCOoqg z^vs~)`^F(hv4l8arc`G4O%KG2|is;rsMwbBYAd-eGvcE@d1BU(G0!G`|rKGn;7{JER z!H(03g!|~9zZQTGX{Mb3GYF{GRn0-#_G-?;ey z&3vGtp$AO!KeEU}Wk>@VJ?h0N84$3*y@bVRV|A1~sm78u<3x*O^PSGPFPT1wva?g5 z3*hHMAO1@|TL;=Pcho5g>@$oX$x!f>8JUN{D?B|!(li?;tK_N%33XdVFgdkT5lm5= zRR@++T~&ew+GIzbSz?r&ndIW1d>{AuJZpER{m(Y_%(g$qd1CN7!~d^%0!STJG>dAm zLaVnrct~AV2(GQpCo;m{DrlATtOOCNtII-!g4Tlm7{#Q{W=Ircq12B@96Mw@a1cQy^og25J*X4Pa+MW%I1PUgu|(K_Z3< zStUOf|2%wxrme~13JNSLgOmVuaEkXaJb6}erhPW6#^9WtpH&9wW-4S=%3<^5nIs;; zviWqkEXFB=G!JhZW?4}UIF;r9`WYC<9db<=H(~vB`8oJ@+ZkmTk;rRb z;CyBfrcklc6z&&(20kH&o(Y?#@CKv+myC|lRdPvwVe>QaiaIGx*!6`NX9YNBbegVu zU*j*qo;bI1ywF(Um=E79;bD!(XH7!4be)UGNp}A3Gn@X{Xt#(JY{USgLvgXSVUkf# zev|u1xxrl=8*l^L0XNQi4cKAC4THSIZ%zclV5pFQ zz8_w6ZMk<5Ns+jBw+!!Kh)lOVZGW(q{_Ib0ZE-*7apKtSS<{gqaWk&7GmpGmmw}O|GhF1*98sa`U;K|dM+K;s_{ul#!GT%1VdO3tXvM%p z4oz~Yr2}fV$B_LNK*o1}Y`?n@?exqDw}ex`b%8P9Ak=FIg77r+=Lj-7&OFz2iM*@$Bemd4>aRLJY(@f)o9wF(;9Y~fllVLW_vx* zq>qG2)4R!hvxdD2OdEE4pn1Q+^HyIU84&>J*n$Et_I&DOKpw7K(?>lXXxeY%X|oeH zoh$8=Yr3@41I_rIcE+!>ri`7<;2$8db2@K>9=S+_yF3tq-eUr#t|Co^0(ZnFQO;?z zJs)WH%?6!5y#Zq8&Di0`+#wtNb_Gn#uvm)nsQB^Nv&%7q9GMn-Y!Rg&e1;pHjy{7!#r-Zm zkbpB)ay-EeCZGDfDSK!cqbh=3dtk#XBgmzv6$a{*as3m;Urq3T3qlV7jJ>tX%d2G4bI}LQ(X^ zo~a0+)-U;W@v0OxFk;0?g8JvBOZudLEMIcyh%V?V1R~Zo0-(|=hjAcag_D1Pl-|j- z$>4A=lY!|ZnFIZC{B2Ad$PQ+R&S(gqgAd_ZJGs?F^xG$#kD-w_WAViqj4$`&uNgw5 z`F|WYlWH6l-{E&a-66KYzmngp-XIgF1dJm`Po&BI=&onf<;+YibZ#*jOXjiAcu8|d zpkw?qL%hvGoPT2Xvq)Ih8BMX5gk*2-VFXaOhQPOt~vENAcw?7xcF zFyk|{@UtH*a7Y00uZ+u)0ps7gLEtT1J(v+`rGrEt-RU89aVrrJsYEn{Q;u&SLvbAV z%?v&{q1&2zoHNi0#z81BMvxL`z7CR2Tj@X%wTYexsX-C70GXmA0Gu7NnWS_^jGwJS z{rs<^X#HV-Kb&8?H%_?cuiX`ZfG;}0pTX5W7~s2e_HaPy3%0m!}d=E!xqf4f=;>vq>iHUuW{eUg?A5IQ*820iZ*uo5xMKelC8IJPUk3QuHHDWZg8_$-AxQ{sNLv z(~UIY`T@eb&dsGWkNn_X-VZmKkv3d!AAhGqmNenI1#le)ZlLK#o9Mz)O2m~^6ID`4 zP>FF!3FC4HCM4hA<3cz1mUFHp{NR8O8_6`8Qq4o}PcAG*j)o9H!nKSeNh)^Q#6BBY z00(kTL1zwHlO#dFzxrq7$^$kzhKz*29Sbpo6(idEU`>D=$I68}Ub5@?n4-qI`slYW zt&4l`ryqc|0^=Wrm5%4&&)|b3s5ikE3(rXoN!dShu&01^?*_9F`SGznJ)ib=-w}r& zz4M7@B1M>f`!dxYyUu{jC39k@uWSyz5esMOuK;^u&ucwVF+`%E35VSuG)gC><&RUS zlKF=yLj`Red%%y=XXqTv5q`kgGNymb4N5;2&zOd>(1C+H#pyUX$gaXTNm1-OmL2(P z3Ctlx4>uQZFh~}1uE7t1;D_AIO46QsoQja&gzy(h!?8L!#h2tYx;w0z(@Ayshh}uzKbeQh zvH$Yn7)@OhCE1+#wx4+|Cp7gkKOC!xFQ_D^>RV3c*oppdoQ{2;C3$@odw!m| ztsr%L!SQh1j$N`9tZeLrq0COXCXOv-upsmtkV9a1B5hX#xblEDS5g9)Q&dT;|8>yTKaX7_8dNShc+0t&S zXLjo-O~YIsj@R_=yBMRZ^>iP_o^J9w+`{*zJCfU3>CFm%JDc3E(5u&QM07T7e<}L(oj97j3|y<>LPBKSeguY?WCnPtlFQ4?tBw?(R~KMt`F<8 zp_bb4sJXLr=U_6i=2iimz?L1*QU~tZb>Q{!+VO&nkmOIeOgsi;`XTmf1zbN<)EQ@UUMJ>Uy(8@2c zZ32Ym{MuPvxeK-Y#w|OzWriLAR%Do{0i7QBj9aS0i|KO!YaO_k-W@yMZ4|!*Fcqj< zt&C&eB@46o3j-WD*d_J{erO;GEzL%Uon^J?Q0wBe^r1|SS1IW@Efu1$rS2)og#&DJ z{Ej385^R~gCDDdnGJwnjFqNH*!Z6jn4T3TAbq+Td@#yjHQK&QBE{b%Hw}&E~;|-x; z7^Yqs+0kN}sI5fvr+l zl8dV3;xCa;>ZPQED_p6#a-wkCQrxr69ObJdBI8RazV1p>lfhy;)QtTYRnjtcqtqsj z@oq=`>QAuy#UR6U7u?wCU05fd;YBU`4D zmq?^s*QYu1YL9Y|;huJBYJn!Jh=S$T&-2Pk!8BS~-l2j@;EU1(@(#<*qhhj@TS`n+ zY#bdAMy!9n2n3sBJ*qma3F~(PZ6I5z{GK+z`<*L#!%^gj`g)v(00W6-tzeACL^Z9fuVcUQ#9b zxCocW;0xqKZnoqPj6-cIb+OV&pT|JfBi8g8)YmtQ+ za{4%AidYsX+O9+hEFZM09x9TgKj+{$!4(^hr-HM9AzL@$hc5@6?zERXq56ES2%T0^ zTlNlOG0zEQA&W*QQ%Qr$n7b6zjRz^5f~5w9JIGiPdh*#RbFzn?R;~q-SCqUSs2K+w zcAR}7JFfOw%{&(>>rJpk125+L!~hESn|sZD{TMt~bBuvHW&r2;oC7%Rs)aA|J_G)b zA3yef9H0>ZPn!E*PX`mkzFiM#__;}x`g4Nd$DANo8}?*?&7YkLh)$_$H504n8VHBc4ra-zPRhZc) z70bc;VDhbTcOf(EB;W4G~kw{bXa9)37__u=T^UrD;f`X!F4gE~ZxuAXO^+rG?E z+CL_ttJdgvz7Tu33$d|1Xixj2;p9{QEN}f^l*E01FR62Baus&;lV61i1pTG2!Z=#w zy9(o~4Jy5|W44vf&C7yQJ9$}fC2okk1-lEV2J5RXv?RAo%4|ou?wFKNP^;WGODu7j zJDrMdI|3bRS=_vZ9I5`InQ%gd6l|rHoBpC@1f`V$<-iEafo`Ilosybrw9WuuEOQXY z2BAeJ;VQsMEfa@vH)h51y0k|7$leE^7*dp zDc_YlamlK7$9?v?Kb+V7>!6h59h~*C@0~sI=k&wB$?HmPJuN?cn#2$6iZ`NP zZLWBc9M9hPXK(yAz46}S&d3A)*J2)UZ!yCK6RB^vPS;`wgk`EKI*ZlXM!BzF@#iKa5i)R#B~*+b1!at_9mrN8~V)uLZuEu4JE zWg4X4n&&2@J+iVBN;Z~b*`WhAE?Tml0;bjK32s~QmrBrh2!APeaCjK6DQCwP^PN78 z6_{rM?pn>~1^A0Bz}S)SVCyeF_Z7Vq%eh^4M{$p7|J0svX-;KJxXwkaO(~jZ6-b&# zSF+~ORopyT-QoRiEc`_lc>X0`%epNI6c9`bw2V5)T=HcXy>eTlPRmlGBuiU45xR2o zuU(WkwmbR>jM#R!YaKxE2D42*Z=b)w_L(@EAI^S_-Mi0s|G)g*|KwA9YRfeIiB>vFnO|G6 znCQa+KN@cJV*JredI|@Yqdwq=OYpLcADLn-S>E zeGrm$2ML6Y^s05@bL7f%egy;@~sRlv!zhyxh^Ji-W-VyQz@$JCq%u)ABy z;Td(G8wqi%*g}{Nv*GZ{R<-3MHmi75QdW|^VuGAe%aA?0mP4?Xg(l)CCZSW%p4&zh z7h}3|g{3aK$Oc@kWInswAK2Y)+e)Xe&dm<}5xLy!?|udMIwEH5R_~8yUq<6U3~Bs@ zoMflsBXYJLoSgCH zMQ_mlh?*g1_3;b5#K=OcgRYg_{v15P+aExNz3R3zc&2FGEyKGV_*chY-v{2+b!5Gq zzp~(Dz;PV>)3nZDearhjFGB66*IsBXy^FvB8=MCnaxO5^{LAPEupRcSdw*lios|VF zG%qAJsO5pv-)gb%2cSPnfqM@>+Q2OX9Z*pgVR~BqI6SuoZWw~^=&Cr|Tr9mg=sfV| z?kaRGC$!e^GoXGJ;DCtw^&lb>f{4`v#_0mZp6pq!2fl}6llqcYYp+R1BM^VH{J?tY zL=gYL^4GBAD}eO91rC+~lejXaj0DL{7vKPnz+U@nFs*9<5KQ!kw_I8muC)o>%gypP z00Fc`VH~6Lsns5Sv%a*)f2xJoRsYy&*twxv;LCTlm6Z?s~TXJ?IZy-{;~XIN4sI`GPJ9LHEEJADls> z->e^j2V{r%GdS)7C<%Xmv-+#~-fz}X6Et#G-+{DR6JWu(07TEb1mJs1-w%GXPJm$p zo1eBVtI=vU8@tVeM$@v+Cv7yhf6f7`uh3PF)jnyTS#WL8N(u0L@`@JPqyK8RZ1|D0 z0qnvz2K`$g_C5E;a}X?CDH?t;b>~1#LBGkm4ZphfZ`?J8!&IVL(^a+~CbRtKJYJQW z1uBCAJ1+^P`GKxh8+2Jnz76;NcBv) zed7dIUS>)L*zy#&)QiDtfkiZ8ueGIOuv&Of@-1+6LZzvg{rIxGYCenbbxTRLtf|YUWEIn*ggc@M5<>#cOIZz#jJWzvK zH;relO^SWv23Ib;3d@9sT6RE7BXF5pObkw&!yzNoD{#e?tyEX8YGorp;pPS`?E4FM zNfn?{jpCLku%!V+V!RnZ9K)9SlrtB2<8!leuYi^l(ozSIW}JdsIDW~mv!q~4xP|Mp z>wv?-kE_62K;uSVy>vFqh=HgA^?t9}&~gvHNj2jhY^hzR!A8h=pgu@lBbIqT4*j67{=ARRz=&{->Y zU)&Ptj_g^Jwg3Y<^9-m!9c9j(90!-~t-HiFxC-c9^U#@pAngaR{aC*dv7qs>!yI%+ zdH6_y*7J)6s)NX$!}SnV2Q|E!jlt-5p0y*?l2?L(EwxI)7$dFlE#1q=3=C|krF5bP zvM8NtnD}eUG6Dr!YW1BT0X1O)2)ESkSjYk}frVS@U|srtWCjbj)DnwJKd2>EMhe2J zPGtxfIHef!5VX{)$Gb~DOQTvn-d*Z#$#vlQffwCpgQ6|9%4*F8z-yqc=;r08Pw@=4X#;Pq31uCrG0 zt_Q`t9v0}zzr9j+HF$re>TCW6O9jE;9hR!A$y+S3ulai{bQYa4zG2mytW-l@&f&8w ziJvkBMrg4Pe;l$_NSaWRU`Fi`HjRMJij69v>RH#e&p zS4NIJZ$d8w$oI~2eeFm(^6=9gxh|JWCne}}rbRRZmd6~fBw~)C7WmP~sF%h*l(v^m z5+Vf7m9vyfj)Mk^t20+XnXkp*QwStjH_m#E7P0U;3@7>`-!d#GCu2w>=8{t`F7Yic zp(t#hpg35+6&)(3oJ)u(1QfF}n{R>u@BIYn3*TS5&Z@%Tt>?Eu&u@V$WYj~Zv1K3f7X0~X z9tbfAd-5LAG~&AcoY^zd33k(>F4{?*D4poLcnGUy;%k}k|Sw>UQVEc~kaN20n4 zj3kVWn|;|QQ8&DI?!j4 z?12^=QUC*`Ex7x@%{plUcJhWW(Hw96*ysj>c~Mct;@xDozU*0`Fors3fvzLU%!0!} z`;rVuQ)<>QvJ2QU=j*dzN1;LV57THih1kxlI_Y8zx!Uy@AJc*5C8nW(i7Vn^@v-Km zs9|$(8tCUt+?nU7%;UlW$!uA*h(cZ~XGjuvTZ@K_F_%2uE~^e>)T>s9{hsCBk{BF$ z9+e_0f(el_LRh2e>|wXx+bgcE_~5D>Y(hBqOhx8QdtTbFE-@1N-5{rK@Q?4k#jk=VOCEU9~y6XcJ!p+Uo zW#RT&dBKbDLJV6hXbSW4OoI>^apo^yGQ?Tb8fl5A0QUm8G~Z@Jy_sZUWu&i!obHrvX~ZP$sG6ZsCkJS86icEa?WX?XxTm*(sg4$&p8 zE;xGCr>vY>(&cN zSZo<4BPdJg1qb6J=jNre4BgTMz|ZSSahpG;$tYp9H<53_@=5x3#~#?&^BqjUQ;%01Mk3eZ5&!5$6uoB-+h388Xhfx96G3W5Q6c=5jS=C*AO@Jh+hPKCVP%D zye4xd;z30-iR|M@5h3BTvlO4m2rnv&x4M;+$vjdRh@$%7P=FBWv?m4Ra>7~1%E_~8 zM5aOv<}Num6qA`n4I7c{!uxr`y)gw+}K6jS$4a|pb5#MX3 z7$_3NvIFK&ZpS>bwJOQ#1m)@(A8#)L~ z+?Rs`b9j|RB?QOpvLNnnF5nGw6+lWdhhubwpjvwzBvO5ye-#VeMG6g<>T_^VpwpYT zCY^Gwjl&A$`LH5+J_KegG_uRVa2Jt(v2^C&%fV4<-U`^?Ix5iVsK`ifjYi5TGe;H3 z%uz)$bM(I(Cy3xn?ov>&y(>tS1NH#{(Pxg4i!_pgdU>LZqGrK$u zxDhf-Qa`(5`1nY4>+_ajrH(WRzKmg*Z5k>ZNEIG>@DG0nMTp8~LMVw2fM3K4fOAAC&WLub1c<$>Y-1du{=q$o-1d1kC&+eQD0;mJZ{WBOj+UjDbFB=L_)3oOUH8O(+If zz3r9?c#TA3`Rd1Rq2xn+8lnnOFVRNWe zF?NQ@Fl6eL$ha-bn8DvLs$T=L+n@A#LqUopDA!1rRNa-QLLCwDnrXyUk$FlqVi7M* zBR-YBQXMG6=$X#>LX4P>260Agpt=r4axu-ruQY<)@ODm5b>0AKD)y3!tjp%Z?IJ3Q zYmG`3gYwvvO~wK&W=N`b`^5AUkj!IUD(t=FN`o&AqA--umr2?pzK<;4sWNLaDT-XZ zAzA3soIc~q`jM)0F?|P5NdE0sx&($yp;SfQ>Q`<#?U!HoDawXO!U40FW*T?H1jX zSeoU{esDA+f1Mx6qith}>yJJGL~(lD+=w1*8&6y~^?~p#o2F~$wT0@BL2U%<06_x{ zeLx;b<5ELd!SLTGY!wWRdccUqB6MZn_mtACqugpFan*es7NV&*cTQGWkqdJvr<=LVyq6qEHbS%|j0Z%T7326**h&FgBZ3 zQ5yfy+A~LS?U_4L)D>6H+#vzgY|TzA(L(hszFudNs+<<;~F965Eun4~0?N3MJu01|}@!kT1^e1QiE@%UO zZ=X*;jlkzU`?TK%NF!Xk5U*CF3Fgr_0v~J^+)p+Y|8R+Xg`BqyriNg$2HBkiRD1hOjB5u=P981Yj-0y6z>ZJOPRk zecd0;zKq6ypzl<~2e9x2n*3xK@-_33@7+O@BUXd_ys*yNW0pYR&ogj5M}LAY;9orY z0s5Vvemsr+x`<_;&ET5{dsv24ty&}vQIsX#0Z+UJL%b#>-q*==+#i0V1S9L3u44%; zaMdq(1qh4#;m`-Pz3jw=aoIdEYz;nT$?UOdMR69Kx&k)~PK3r*aZmDlh=bus<^{V4 zss^LBguLcFdi|CO16IG(LU96MGG#(Rt#lLCm#v4|GAVLiyi_|F;Jb6><}4N;cnf0I zMH<#tP_ceLN-FYcOReWDvtG2sdcpGQ1uK;otx{gDLV3aJ;N+9LSoIuR}$tEaZ2O|j2+8Qn&*3a*e(qBMb?w=!N}wriLbEO z%#pobn%1WGqm1LNTFvw9IeS>o+4S4MF5or82`3V{HgSN}n9DB{YuL(w1Tfj3 z5wL7nYhauiR=R$3XlK;9kE55Um^x5%OeZe>7P>`pQQmkkYu*=17!w#tTug5fe@1xc1`9WahN zN?=Ov@Dzh_W!V&it+JslJm(6%Ez?4yt+cYU+T2{;=tr4UX2V8zm!W1S0<93Jua^ec-(9lbs9@e*8tiPHb8K(Xx9w}&?x}6#)a|#n zZQHhO+qO<^p8C|bZQthp-b-HIy~)l_X0o&XT01jqtT8_$NnblS9RtPMD=vDE}iJ_3xv01{!_d>J7381si zRvJMeVO6SCy_`vbGuoDvgq&@q;j(#H_xV(j|0UlS5Lh6((W3_5s!YZ?{%uIdO4lxK zQ{oV?r1p^@+SIG9V;m$bp|u$T%sJ1DYuu>YBoLZmg<&>wFZ>YAh5O4U1Kw#@7o0w< zL=iJT6++#RCJCBstR7&p3uaO8US$}B_pq+QJxc_SN)R(OK&~%E65cn@8VseGDKO-k zHQwbQg__O?4EbH-dCwYfT)jN$CGZ5x(boWP*#fDBpdi&cAV6+Ey;uOgHRJ6C99-i4!FJ#|hzEh2cq9lW9V?_p5WMg3hXY~YY$sRfK zXS!)|I|qpM&FD)B?}TG+l-3+-YV|re)d_v{y`zR3H6~H-2k)hlOTyM>aW%s+=kNV^ zg68!*-GaulcpwO%*O+mS;`%fIS2_I-D6QFnsSvJU=IAd8Nf$wqJRr?@NvRN7k8D6U zzwa1+(+fzpY80g^^&VsA!^VJb(Jy46lP~FWQ^w+=6P^o6y-*S4W7L8!Yy5hCnL-&Y z>+gfvz}GQm_I2?GGmf%sE_L>-UpOpjR0_hDM1N1^d8={%(7J+ZA3D}6Hflhw$ZHfI z6(Sj-uQ9}jjmGj4igcl6G`t|C!~(I{V%pHY$$@pwZgIR#KWg=!E5wJe zO@YF@Ht%4MYD>E1K!;DYNQ0uCKi}|E({3$L;nOVANP2S>I99hqbKqTrB_dFqV?pPN z8;IPIaU_-sQ(pd322IMx@EbQ8`Lk)yudQeOFA6wb**E|2FLW)vyY!z)abNucy@GI) z=5iDOR;>DwR^MU1jUZS?YeMrc(w_;z=$wAIBj}F%agd}PzAtBN|kdgZrxx`h5OZgBPm@Qw*CLob&kSY0Xt|V2P z%NaUZb9OVJAeiI44_;VN)Fq5x5Kn8&UxFG~RTpFGBmmftSGh%+qQAE!Q0X#n|18o<%}Oqrxoo1K><0 zI$2|=?x=7U8cMk0ca^$_+&G@?Y(LN|0s{C4x_4v1c`5c_7^ucBgh%F<7Xm~x^#*?A zF(e4Wk)z=9Wkt7BjE&Vyi`~hqe>+3r3BU$}*lUjHlUrT51@Wx5#iZ$k87kWyyQn2L z!9eT0u;7K@ElCui39ASDBN`;59ikkrhU(Zc)9jcpUu!s>9MhTTT)sIAPC@w^k(KgW z5$#b^>MU$HalD2%isuSzyt@011v1VR9eO`exA5~?*)`B~QZF8N2OPPHCwBOA6T2Un z16iZRd}w@ksF#3Pq4)^tMXJg(^I@tFx3fdC0EJ|JXtZ2=Xc$%elAMJ*y$@6n>2hgn?q*OnfX{S~V zoPKL~pOvnrQW^DwwVH?i>n4U{f6|5<)fRL6Tx{Y3?u3^unv-NEZfD-~JvRW8h?Qp| zG%R1&2gSRHV1WFX@Al+lv~TN&=G|zzo7`ca7Lgw$PwU%+XuGwSOT{!i2>#NJoQ|eC zmTiQWPeYGPoaF2h0u=1sMApjh4br^O#L!&m@VOS24$|aOd912+2eU-bw-O)Syy1Q^ zQ2o|apUrSfAOp`Or}-mUjqg}1aFQsEdk34V9Pch6(LrtDU~(%woj@~kCplAraV|BC z^f;$n79<}64Na(2MszMTeHdlq__`<9?yZ2GHlB0|dHf)nxxjpB+ZZJANQRa|xR}nS4^*s(*y>W@MF2&*?ozx!bx5O$L^?X zDkW_j?NE)^{h#G(Ab91!7N?)Q4q$Wh-xlgTTyuL*8jsa=t|!VQbgJ~;@eU?J!nAOl z%RkQZu3yL41fnnG>OfyIz6v!3^xfb+1=d&wFD3DkDo>WCJb`ucnE-qG*y)YvpB+iB zeQ{F3z@uD0xTWC_EFp>fF1N>5+p`kP8q>tEdbZ@>e>O~bmG%<@?f)4%hVWvw81jD& zDoD9kk{62`P>meRdQfII`~VCpe;gF5Z!+(4Q@%WOpXw3%mD?y;t2=WfHX7!FukC!<(J7N5`;Ul(-7&fFb1PJp;6yj+!q`@FTpI zfzkciz6*3Ay1q^`Bs2@?!)ZZJ)q!q2k47acF$^~<#m#qYkk*Xn^=A-8_ z;(KnFT4X8nZ)3V{r;WXs@~hC09~(9euxv}038)${n&zv`N)8cawMWL+j{JMU+DgP| zZBsa55(=!_xe{+Fegq=S&8wr(k6NxOeqbtcB-&x_Np|qAg3GdsSjA9N!ga zY$9o-CaY7*`8*?ffLBx+nS^5$Pns)|qp&5>XzVami0ig%W4o0Gpr^9c#CL=`vWC{{ zWZh0iS5*A2xQo$Lz1lnh&}D+{x0~|>IlHWzYjgI5+Bh@g$i2FY8W*jp{)7u(#{LFl zKYv}#-?osugm&O1jd6RCGLjB>ndXFsHhGn#dUzq$pGtC}Y;st{IIm=0oE-V1XggM8 zbN>J|j~;LKDwXOxEE*HLS19II{6s_lD6UGQrj0W0uWlE`K$oGsS?EF*r)0mfRlFDt z_mzn8!_m-wafMn`i4q(^r}&RY-a%s02m`stTHTVNWD{BZ1F}{gBzWgvt}l+u^Z%@S?h2#dSet@#C<%}TDLH;V`pI3tS z?{nvP<*GNPk!5=^_`m7{{mx9&lX2h|m`-1>`vd3$4~G?R$S2N;QQlNvol?C-O1?bw zA4R1T|1$ZY0{JAxlXGM4D@1<9iFoiZ%wOa3%$+0ejY?CXV(4(ERdfy@27N2RJL{;dk{QsTMgcF@SoJ9g69cfzQpdRhN`gc+q1b&O z&-414`6&qE2Y_kjzaW8HF`tA3OUPNJ6&l&DS-fn<>j zhA&I`ir;2APlYOLu&F20t2HTYxOyg?<}sI!=&i6z%S&p@vfNvW(55W`mBtKpu8F1I zf}1x4+sBbL`r}KWwPd|pEy6}YoB0*Ry6z2;yKRiYXsxRo)$T3>vY4f_j%iVUis+wY za5<&EVHPW^{t?T;z=C2Jtv~$HwSPNauEDIP!Hiz=eaqHpm1YFjx*4s;J9U);qj={P z1hWwSRl)ZKV*oM@S!cD=^3-Gbj=niK+L2 zK$OAw@nNDtI)xg~V$ST2o`8^otp!ZrZk2=t>ka3+v)IKu3{<=kE>t{Q|49&sQ*9GP zXQ;mUq^`KZ{#+Rae}Ui$pJViTYc5r*mZWJsJRUa30uXl^MP9b4Qr4NA3`2e2UKR13 z(GsI5ww)&|QQ&=fYGxPULyvIiwupBw}+JowhUF?=rVMYxstQXzRa;S7!I2s7scNq! z7mlI|bYT=KZG!K6-dLyZcO#W$E1@wZf}F9iq&M7gOYr5{6ZDA>t;#SBp#Zc6|H*S? z5@+s+pj{rCvMmpV9*MGTy?KGz$`bty2@fSB#-mbJ>bTP}vBs*+9Xhi{!kpI8e>R?r zHR|8YN#lqpSKKh-?KGock%CYp+heYGzK8;tya%j);prlYy{1IZBhiEo_f_CP&$Y&m zLxcsf!*ie3Y|0n*picE?bO+ASv>Kx6HWI+hf_M%xS%%0?cGb=$0bg&%rJ|@4SCWY7 z4(6{F4c(V~4(hJ?HOi$d&v2s7t)e;i(Gv4j9r}V*vF(0yJOkn1V2Uk&a4}SGvuny- zXA+{etXW-no`l+VR{dEi6&gzd)}dDa&W`OMIcIaqa*L|%DF6~&Ebh=KurZA(70gN% z%mNK!4}-9YgkUWrO{BNq7TtzXUIYxRvtDP1C7P&^vED=hxf2 z_u9G-phvQHek|>|&r`Vf1N7=8!hy1!)z$hKbSeF0=_E)P$OO`!7UUSRFA{dEPhIdn z(H~n!*VAb^a{&2<0;EGZE++K~{fx_JJ|g1L}xw1pJysAL0v-m_pnZ=0Dy2gN(VY_4lTK5uD$* z$?fIKMvXlLg9n@rZoQSqRVfs5VJc$=I4P5xGpyTf3Kg2ZqV@%pPBv#mVP77aCS+L< zCp8c|jEN<&e=9FL8?Rdp-t`xPYq{`;&i<4^XGx$7n|O z&-al$bkwP5_k-%TOZ-k|LPX8%?Yy3EB!9yFp7^W~^N%{H*eJxc^HQX4QBPS-tR(8V z{}D&{AOLB)%DMAk+i#h^6AbWj%g&1Ga{^1wMyw@im1fHb>mYYT=|&b0W(EmyvKNno zigw-6o&{*~K2*5vhc3;28pM3!nxza-z@I01AuEGhd0x7EcE7OSlE4IUE$br%F77TQNurcyD~f1)3+F>!W%={QCMy_Vnj`{5*^x#8UW(!`eoB zX0M_dRz~acNP7u=`2&IbiexnUhb_Z$R3pR@>d6#-B$bv9I^If6u&$}3DKeYJ?NAKE z`q0l!2h@L?SB^-$Y>W3s_?x-0$73mCAN$tnOh-OSSaAE9dR1=Z{a_OayN9CyQr!w> zI?uON_M-%PTIX36d=PlPiB)h=hq`#bs3{^Fmt>xcLy9Xp097Xo$;grLZ_5xQq$>EW zjeb?oc!$(>Bc?4@CL9OM6}t2LAh1@l<)#CpY}zviHJ0Fk4@Ur#y|*4h(YfEX_D_c+ z+4HEf;!5^?!9O7$<-R8=qIzvGRIx9p&<4q;iPtbQ>DuD+vLzkm{_b(P(xIY^r0!@KRN9f1Go?#E32tDD> zTFj7IZpi?i~5po14H1Y%mtb+0T2K^oxWb9pMX?f?`nr08*O!PvkUk@DN zZ3yP$BnneUt~Q5lxQmL|2iNlg&r8TT$5C~}J=sCI3!u`NFS zNHtrT6Erimy7RBq1jQ#YA7f7US0N_`hE0zlANu3Tf_iu+d{Ofapf7UA zpz+7OFqei6FrzS(>v#pSAJm+wW7K>4RtO<}V-^zo zZXqLpL=Wp-(Izge`)u(V(fqfJUtd9RTT0Gv@M1)h$u7n{$3fJLG8lyM4dCl-JG(D* z!Zc0OYAbvdCv8ohxfbwmfQ%qRIzvfrTLpjU<2D&R1-KbPx|GGd#WQ|qjrcE}pT3vm z1YxKdv2EyOrNExl;q9c+Sgxx<}wi`eg1(QeDMqzMO! zL83TZF3tod50`~1+%hyv%(NyN-H9X&JS63DORnA?hn5EpgK4yf9^-EE>#a=Gto+0Y z6`!||Ly&hk@|bF_7L!h5E*P0ZT2SWP)Nd9I9JL1qe@_JQcCa|YXNh1?O=W4ELvsvV zQrU~K-t%~Hx|tsb#Ua;OmV)Jj){-56Y7Ca@$c5Y+n^qW|sc8Sui;`l(7PzrZ)D~eN6V|<_NSt2Aaj(Gi|*@h%!G(tOq z^ei{5bG?3)*32ieWf_!~PiT$wY~W7gT;PuLto+&X-{zKf6>_{us91!*8yeHgf*4pU zl5*D}UZ*u1;F5(^P)jD`a?o2;|&+p%hHO+Rwl%1n(IFZZ9!z9VOu6bF|3#BfyRaSMQ6{zTIU6YysWx**rEeQ$UVPG^`6^@ zP<`c7`vW=|URE<8X1kH|->n6(rV;IcWl=N9;xv5%ey*c*I%jQC!7orPOM+Boxb2ED znUerTsy;OW$_WK{mT6$IvXCVX2ACbJL2isvjc+*ml|LAZ;zJFe62L#&*=G%@Mqo)!ykY>SzNoNsS(>y&eQp7hzYLa@`Fu;O^ zh8f~yoLdnwFe41|9>BsQED9p>)b#Zd2pJjaHx^e{Lns}ukg^CRT%&xn{H#u)n{PW0 zV_9xHMI*ScD<0>LOH}I-MHk57?B^(B5|^gu^^29^TM>hGmX@RORb;LHZgj))8p|eg zmx?s>KONo3EDTw!a46g)EXu(Cdk2e=zLZ$K%MK4uB^>fe7G2U7$Hc@S#jS$AXIOEpL`rKrY9&F{4*lhjoy1pu1Yau0z0CuP9T3@No>9zN zYW8YG)3q(y3p0Lc5#;c_PeI=M`5*AeL7?^;AQvU?l*ma1ZxYY7{dI*8x0$CE+-?t$ zGyUprjmYyfg!4FtLZQo3#h)DbHJ|5ec%zi6S=%8XpUXUBYJ^(m{l{YWrmeo951o)U4(3SdP*GbSrc;~@gXMx!GezlikY1&m(ZrFou5{|oysmV- z@~Dx;Z5FOxra0PEu311*4h5IJP9kpvbFsrZi^;(90B=F65C@L&6Xtk`$+f1~IXg{?g9?OAIBvvb)Uku) zp^jkoyA$k=sA0h0x8s*__;$BHLlV$;@j*;6Rb|Xr^Kgirr92zq<*7A@skNI0maE@N zOK&D^98~(H{*1PKPV}^>7|byxLmOgV_<(|9k_vzRyMAb)3EaQVPHoM+m^1}jbYqbf zA?g#oblJbgQRhY0jUboClx@NkYXU8NA|;vU3bMoHmWA1GgQo@B98~7PZ0ONe0VU5j zfn+8XA&E~LZYSn2M~f|`m#Fr9hdprnIH|n62l#J;Ut(xN-o?O@C~ytZmF^w&w6w07 z5dy9f+bMR2nx8$}*v%9-m@f=8@_G#dCX+$%rM+Uv4ohU5Ep2jZW;Jy|(DB9hPGdK= zb)QE!F+agYc&uwNy7vb=KAm&s&YIV9Tds&(K=l1)ii7~8zSBX7sxQszw6=09}xW3@p+i>aNS?^zd3zx(Ld)-AHwiI)at&`WpSo$SFWQw*xz*i zMd!~*P%K4n-aFv(t!5;&0IT-3^S>Ig*YmG~-nDH;Ss;odmTg}D<<7g9CKS*3>e>1k zrFsP;T=?eG<2EoKmTrt^07i!Zw{cLq`EgRZf+Aw1H_?NBkDverVdSSZfqfgo<~=m) zD}(YG_mmP&eP*@v2HG9!+b1!4&wK6$-J2UHBo3z%0)x@gx}U^yH1|PX>3!X$;e&7t zp$b)*$Zi?cqXv20Rgar94$Te|6^%e|kY zMK{|Mk2a3(&!xlpFLj30_eqfi&ph{y9^>Z^#>W6pPx}H{NXQoZ1=PRkSe^Q~(cN{% zEddu&S~{|~@;?KPQ8y^Rq^wg%f?MnRIu5zwjEQbYZpu3I3CTAKxBvCkW3e7$3&@Co z869te7$ok5^3{Q|z@-mI2?HCpJRDCqB7PFy$e-Pm7cf9m6D&hiuy#P~JVOU&&9)R; zF&HNZO&Ofz0fAeuGE&?BH;lcuzZyxO1O(jU~+x{+#eLL+PWL9 zUXE4l1vgsP88kf>rJl5}3RDP6PviM(MDvgTDH5|T4m6xWV!UE7dOKM}RGZMXC3p-( z+Fzs@(%h8_&?G&a=?e&U(}p+&;~Py2cmE!tp^k~b6ryH0+*D(V6UHQ8+cp{{p*`}1=b^}n7nzT$eXqV$mZMRno_!>;*% zTE8H-tjq{cNh^_L6;8cTt_k@OzrVkLW1LLS?e4C(h2@yGz4t78-!F|=fZ*haz3bF% zddubInK}htS(&6WVYz(OcPi454r5wAi2*Yvf7b)+es4cKz@b_}K*f&z#&3hX)QF~j zi*;v1nV&9AI(=m&(%k+e~Hz$he6)mmk5P!eN#Kn0v1Q^_ZNp5dy1O41*)Cp^=e?zU}zmR*s z1io|M-dVS~J7jXwhtNaSR@kM5p(Y5onqaYhW$ z#=oY1-5Q`6v-$15K)ilWv=Tp4W_GM}qj874Bk|q*JAL-|2e|jQx!)y;j{92f2Xb4e z(XLG$Ko*2UHdqwQkh>qI@i!N5-b%!ne{ZMw6pQQTf&E&Tk_9^=0wO|#kx7GjSGUSE z$_^Mif+a$@6G0B~pgjZ`m`4|7;VeaKb3W=)a-iIO zcKew~7}=;yKyjp~-ygSYGvkSWol#5HZs(-xVup zy8s#Yd(Ni5Fw{-eYOrsHw{xWxf4q-|Vlo0^A1RPT zz&}|74qGmLO{U3R0rGcZD#Uo1Cx9Ome!03lNqIgrVZS~OAHo}9SQ+J?sK@~Om{uHY zTI((|jh9>lgS%1SFA~#T6uigXgdb$}9rk4NLs{9p9OOos371RxZgP41uK;GQkaG2O zB{Q=iU&z%kW*5D239?N6*u#1iRovjCZO@hKE;z89I&i zfSXr#uBYi>qwDz9&tU?$_?piayzlVgB0b9+df7Uh|oI@itx_{wTsc zQ)gVt9)`)?B0Rj%e0_DrQY38=smNSId$w9)Wq9VT`>*gW_LCp+PUO zv0itrptn&rcU8Xlo*=Ohe#tB`C;%wI`LGUovYo!qajJ~Sb^ zZ?=B>=bQ;%hmg;3%ZYJVt|k1uDL$O~{2NDWYfrXe#0vG-8l77RO-ouz6?j?Ij@Hby zK?=P1et-TLaBy8Ir8*1%$|6fackeSXSBNINN}=!Lc|nZ`Itpm^@i_^zeJsta?Pq9N z>qRxmxf@k-t@?;FieE|&<)muRR~I;}M{dooK&AS%fL$;&WzC7g0>|h)a8unJs#w3% zr!B}Qh>ne@qM@TS)-3VZL_L!8!0{?G-T3ak^PW`W)K#H|2MR@<`>0SD)={Zpo=;dqh! zrY}iv7s`w7zkF|#>`i&!6erHiyNodBc|s+|2_at)VW=r`E+avk? zx#ME5^nx?iTN+<-c!wQbj#GPiW5ThQbQq)g5sP|aw>4whO?&Io_(CdM^b^NI`KoRtk#EqTUxVD|ac%VZS znw{GchPblhGs{y>$c%CLBukCJgg8NbN6u1~+EL?dh9RXc$RYWy{eIlMx^)9O`bBV$ zOztZ9xc)$nAtNk_os(bmHR0rz+1qVuYDN)@A%<&%cJD)C0OjQNiIp^MX#3YV>^@8T zz9_UV9Xw>L1!&EEwt@9ck+knibcmN_SMwt!?YW31K(GmGO=`)$eiQlf;9u)#*O29n zC{oo*{mYc@U$Y@A0Y-^RewHr02=?(4JXQ6;G&bPh49^q}c$S>!rhRWEnsg^xk)zn+@6yKyRGp9zw4OVu7furd^cQ3r@6sfii$PyT+(>gd&7i^)Ck$n z_XWMs8q%&~c^)}sOEQe;H(oYtk8oXiW)xPrLQe-sl}dhAq{oIJ8Dy$1AFL-nhRn@$ zt7%1VDqt9?q}UkO3dzyC7}pBm^04}oeN6K@p0fw_Rm7|flOHO{vvZeHQdVQF+S7h_`+{Kv+_CaOY^L??L0ZX$V09VgZrNak zqoHg|8p~H>G(ew|G?ANm97dcWism{ikDt1G+qGxh=lbL0s@Bvhlmj?oH&*(hJRC#H zdt6Ja_;EQiXl2n#P1PGESys0ljJr(drdZb8Q0ncjvAOpvpTlyg$VRerPb*I(aZg5) zHeokCazi1BE;l@lNedg2ji}qmAi;{EhHEm< zVX|Fq(J-eJJg()B*-)zvVW>}FoWp6fiP@m~fP0&s5#V!z%f~mK9(-hJ;bDO5a8h{A z32*A#J)cIG-7qQ@0~6+{OKoY$_8T3I+jt$t6B^-?OqB-V z!`to$aUI-2cLT2MWr&jApSWr}cL5{L(tOus<*1@7r^L%gX>iDpj0cEI)8*(aD~)I9 zV}p%B%)-sZ4cPN>M}@Bu`zFBY2bG2hfz<2cug9!t+RL9#VnW#3Yuu#VGjyLZ*uf&V z5;BN+=wIJNEW7v7QT4m9TwsURAa}Mo!f?s z1Cs<4s`HuTdC#qd3KwRx0=)HNw2Ly*gU&S{{zZ06B^g>lw&}wuviTK+qG0D%jN!Ab z?u~mbO1b)uhnnDMx1YM~gXSKhLYAtdbE!QOuSs1P^@#HZ+rbb}H>yY4c^w{2gW@CE z2EGHYVQsJ${Wa>;-0BPKQ6K9bcqort|j(dB)Yx#vP-%z6E=IzA;fY+Zl@$ypVuAL?(9+e?o9iL7*g>OiaVNOE7`!u;M{I%m-v+VWlY_>qyy$pf|SctT9pjbfGpgmkp<8}BvMhnI9 zpVX(+4AJ^)#Cf?ibWhIY5Ps8+Sq>2kZ_u{B zbso7D)xM~Cc-N&`feG^{R;64Wi8$84uqUL4(iN^%H7Gzs@E2Hwab_P4W=nvIurJ1a z{mGAt@H}yZ+?`?U!jM=S)XK7J%_M0Qw`_fJLc-NjOhEBUiXO_Q#jOe zRIbP>&fo@vn;fYDg`?j7G*o)}BTo>KurWD~L6lb_#XA`y9p;DWr%?IlYCsU_L%;6G zoyG0$)UtVv+YigGR?{3e>>7_p8OZcTku9`+4RuROz_IsaW-wvg>Je!(e$_1ha3x3xTGeN@n^xXIzYJ=0DZw{1@p{<4_*@!qm!g?rLvA7lPisy(JB z&L@k5l@EoHND=N{(zqQ_M?p$JKQY3m9MU@Kfor9B7^Kmc950Dw^XaaD5Qar02f zW~jhqeC4~@%sMb_b5IN-ZboRlf%QBEar?5YV8vRwXq)1fz~XEIIqyB?4stE0e{v%5 z8TN;X#ooH(^|5xo!SDGvOEc>3_P`5R?jzf@@B?4uTh8^d!~L}~QC8IY*gEQsJAZj} zql`))%_hv^Tf;-OroA}aTTiP}7RnZ2cT zZerPu=Q$bP-&L~Dss|_y$!6YI&IYTM!|(Gy=}jAd+Hf^U@yqIU4!ZO+Z6)B8ss z2Q;{DoEpMc76e@X#_?+++CJqqC;DA1*@V1tW&Gq; z?+#3QUyq|SiTC{)bw24Y!dxN~z^+gpK}!dwO;-OhmoMq<8%!V1uHn~TRtPq+YJgD= zAo##IE*8|xJp_8^U^u+PB=bBM&@n$<47RaBo93<-M~W2cth5n5_j?TFIA#+s_y2Bj z>H-E9h{*~}Vr!6dAo9k(KXw;GNrkkb%N(~eHz5{SVz#y?x_i;R5Lr0&WyHNoVa+=@ z&W#dBT0T^Z4we2KDm5H#RsWjG*jlf$Y#@d6{@m>46?|f#c3u8%w7VQd=~|MVk53{2 zjg5`gowC#uzS*CdHAtUjd|p_-VW8#yTEy4Wll!=wKNu|L{6YQ|&sqQ%PtJmj^~i36 zP|HP^V{F*5$DO;`ZNH`DZvDC19LVTkIYxu-Xe*Cz%UX1OUDmp6D7#~7)UANy6|Iop zXSuWBHNZ$Q-LEbfzZequPQK?xxP|JdThl2H%us!YeY)cmMPC^~ryCifH`LXD$ZXrf ze2Z*Sa7)Wd=~Ty3o`IQ{{cQG;E7E(1rPXYJEaK>1!tM15Hy5c!R@-V*G7TI*t^Keo zLn}UGyPL=p^5s5!b3X+AWYzC(^mxF%f;dgS?F?{!$_@Ag^N7i3J8^-lhQlJX%M23e zz8SrU;wKA4w#hdH2uYCgydIj_vhx4?ED+zQt1piJWGK>ts~SW38z1r%UY_h zkRGhm^4+s7+8lTs;BQnCQi943by)ax1nT)h9OUdj?0KT9pCXK&)eV30ERD=-IoZu~!Ze_ys>iKY> z#jMU(Zi~z%b%pPfzIn!xz4&j7!OR$uSN8&AC@1AJPR-SUv97s~JlqPo+)_2jWJ3HQdFpzO5jWf#r7SNm;jZ9S!3!lQII37UuS2Au1ePR8lc$LC;^Ds< zRGO#2<6-2@uD3w%BiF`fcxdFf0qS<%YT%_l)*|+#&YdZa;YLF zSl@z@Ld#Jqy}~A-N{JI6f@!j7WUbK@zvYCq_E^SdSoCT+o(z$1fMUyL^BwnOD#s_$ zNkY;)=0wW3>pO`+?2p6Jme$dAh;VB64SbG$2H88^MzrL{)p4d4VSxYT$hOg#J;ly{ z-@pWTm)ok3e7&aP81)fDq%zJCFPXc7&{(7k{(V+8jMhbZ6I>=%9Umul1!huC4F(yy+({lX=R~Y6>#G61SO4SAc+}uu!_yphxpKuOT*Mn-)BsM|x35|D+b}{D zbaxDk6|gV({4Z;TW7_ZsO$Vq?r)o@A*0_0WY9V&fNb%%rw1aQWlr#x$#}WR3GG&r%Wn9BmQJneYAbJ4%NY2UYR#f*Dv93^KT>;SXErJDC(=Xd(M( zvYF1o6|C*ucJz^J3@Tx0)l|cQrc}e1i9p2Iz?70|J}at`I@+|5%HBq_nTf+Qt{)Cs z=W!sRmO(tL`Ar)%*O5G1dWY@L-p<r6h+e6L_{ z7vYphkP0>`4COMHkCLu4soos+?#>uQ@@#~?W?0fc$t8h~SbvY?Fr*Ds$u{i}+dO8r z2X#6;?u%r!b{60J1+RL$D$RKaQJeO<4ue-$esW1yJmh{HGjtrmqOn94-AhS_IJV#OfjVE>rH;0+pK^6TTcGs8HBfmHi|p$OxZx^qlzf#L2&!?`0|PgQD| z#UY^%BI-lqwXp*>EOMXt8!gJ)fTM~xSDEIRCcHLV&4ZjL7A)YPqnC;%#566@b2whb zfH{jqd@qTjTXl93tnpIwQeeFedb7u&;!8MFBxx4SciP2!+C^Qq%PTv781)A`X(G!f z;mTIAXsa2+F*uW>IfK)~^3}TXv0pU{uFgcV_KoLEcM$+P0?OVLf{nts_<`KSG7z;qwFICqvJzeut~f>o-dfwr*o1f?w$6o z-c^E@Ud`7@Ag0N)yT>5*z``1V=!|vVN+uPXghS=w8h1+$;N&*J%Ugt6kmha(Oo}88I>0Q z@anN+(|NPX_>5p7I2C+NA(K4$&Qi#4wzkYt@V4Il$NV&u3K!@<21fj0eA@>nXXm_t z2iL+Q;q`(}KR6Fcl!@e()63 zy>pL6*08vB4#UpKJ8w|1UOl`w50J<4Od-}Fy%xOeIinz|3~0dd+{h%nTEdHs(CmBX zR@uw-4I(fJQNzE%cyK#8l=2Jv;#&o_YsB{~kzXA~=zayg4)Utv@#4};`Xy$+1>EDg z1G3?!YSm5+S;p^nVZvocqgUgpF+KL8`(Gzrxp!v+=B3 zY{?Pgul;0Diz5aWGxsKL@p{-P~NWRKRs} z42|X~sRd9htZapKP#QPw@)>IJSgg*Ta&1vA1`tZ>&cSk`myzcxrHlvFc!5+jOa*mT z50Y~oLZW&0TeupKoUiu;ddFdfFujtKrVw{V&3zIEUd>)`rYxI>=2?nyZ`G8$Wk09` z7>DJ`@N`Lv|I<;Tym{2()Loe*`B}ran9MVFIDW$#+`ZS7} zy4Jm?>Yt2aEOY`y;v)|YIb*inwOfI=kRZHl7Vy8mS?&uKs4K%m9+u{9zE2%9=)M7# zZ`0}vYl|r#xfkKlTVzo^K*7E4`TiPP!JPAh)h6Bif&d{;L@9qkuz-9C=r$ap)0x)RJya{1p)gn63(_!1%hga`U1{M)E}8v)clUq=RNq`05X z_mb;vqGLG-z!px%9h^z$1RnmTQcPM)T5GqH4V7uu>dZ(^*D3lj|FnteLI<6e8Df&@ zr?FD{N*bEpy-z+SkQ+Xg-oz=<*0$&Q;#7*cmn7ynV}<6MIE4J;^Wvodm0`F`kKv!< zR!oZ-X}4?Hwe64B>|OnPGZ76P3f&54k7Kt_Mv7Anl?w{-S?n`3@7uYFRvGdw3`>V| zG@JJmhI_zs>ChR~$~cnun^fIjmlEsuHA5ZPKcotA)&>h=+P&W^H&}h_U!Hc1<_PcI zwxFJo%S}X3;Eg9#?gI3Dw`{3_- zsb|09lcOIRuAjb5l##(gNZqS2o5OBVfOpsyV4Wlf%pOS{m?gJcJ<7FWk^corxXefi z7ZY7DMP5I{ZMp;NRBTm}i`7_!Z$&rCdgs&C*&^4#|CxOwM6?EuX*Kxxsn@^-CT?6$#@D=iGf-LCs+w zC;_?xq+Ax8GPR&7kL~qk{FeN~=bojDGpYq6lhT+Wq^&TawfHHXyW^6U${yhd(wu>D|9Wxl}L z8}36n*A0O6S#EewDD(l|T^dbJGGy6Lgq$h|4YsZbhRo>U=-j(yq#sT;Ql&>cQ{Mn` zyW|ebw_C$bb>~(y&`|xY`{ziXR5GdM2rrAqtSZiT@7(hWElNEA0@kDcv5n2U+_Wh_ zdC@)nQn%gFl-B^hQ>=ZY<;FG$NUQ2?W?q1+WDb|J&SY-%nt?Q_*|>HT#4#!GX2p$) zu={%=yRmA$S94Ph$+ZEW6q-7D>g|-OyJXCDeWPPh3cJQt(4t#Hr76`^>BKAy*0xnF z5GNMqy#tIWPq4ndwr$(CZTqZk+qP}nwsqFlS=+Yv+uyzS zpL|JAQj^S+>B^|Py6PQzqOC8mQcKS$hUkXF-@NC`k%J!G%xrHsrakHKAL3@XPfT{o zv_Htbu65n)grVz(wsH`dutYfJ^rck9#ElZ|tf@lX2IDuBzIeJWUI6oFJpmgbyfKuc zPMB)ajCDAPu1@@aU4cE(gC4_C{D&yqbF!v&LndvX^XyHAy9yDtClMkCD(1R1Uj1HU z<0_+2;{BfizO(yjGDc86#lhH`6 zj)>A7j6=uND^3eKpEA-^02qu4=u!nUjk&rB72d{^?eiNL6(qiCd)B>>fWH-|szp{j z4 zQXgJtKY^_-@sNcQ$+$n!JRLEAW9^pj;J`4qlqZ`-?b1my>TpkZv=t@S;->IyFyg>w zZU@LMgsMDPkICBcSj%jsbydu&Yk*uW8r(B!hc7>Glh6Wls?X~GPhJU zM7e%lA3+S(A!G9oMb?)oj31J(f*}b(~5AM6mJO)?*mJC!mLr_aDmT-UIR84 zxB=Ll;tODZUjVE#j1|H5K7`fD*r%as<)&D|-VHYxLDvGqF(EJ!{3}VE2c@r>Pe%N=gV2)6GXHl9V{9_;vSAuR2we zfI%_YrQ>m7(i*I{l%DT;^7D&=iBi;{oxNp#r2Py^V8k#yx5f6s=T&fwfRIOj;PwO|kE);<10X}J zROSaDfn6e?<;$;Am;?$6=@|u~hK5ia1A2xrLa-E}LTXP?D(aITDLco&gW4rRN|e^i zPG7-;s79n1nUn~>bG?d%s*jOLvpn43#*2YrP}DsUZy=I$uegEUbPUFhfQIfsi-3Ix zAfjcDT@T<4KnX=bD}`d~;3=tFc^}}^cy5{9#aiMUze6?rNISoiKHjX4X)KU+%c@&S z7&m*a!00YLb96X%;%Ou|rZ1XN(UjHPlUfIr6bgu>+*MLaHB1!aQYaj>_}E6Ms<2K& zl3(C@EkhgrNKL9(EaZm7F_Mgd5mvN1<*YC4i&tI=m9e4md>Um4--vLEJL#Rqj)@gI z0Cn?1%IsFcU{?D&bTwEK#zA3Yp@w33p53n)$?4iL#(CN$u13kC)G6fwkTm|3Rg_@qLMuej zh;C6FMs%^j@Gm|dX=ZmjFqk*Vq-p)`t>H0<1? zn>ZUOU#l1pw_LC3O7~C)CI*t0m~~`&b2iL`K$P7NiVyCc>^8et%xvNtx7oKrr4Od7=xe6#6dF0nu!|4R#OikP@NP90E~A4{^==C;0sHB6Q-Amo zsO}Fb)ZnM2<&ua7mIP!Hu7d0crPk|%&GS{Cpe${N!nSeKuU6iBCfU9Qn4~i@m-ypL zTm6~YBl3gp{iOE^jT@zLA>~eeZcwwP{1ro9+xIs7)Rx=+eWA1Rvs-+1lr0(KJ$QA@vSzc-O*L!VB-wda{AU`j-+--xSOsrzrV**3srZk$t)2&7L*1|( z!~k&E*-Oe4a9D{@i#8fQNAQi!_lJYtThui*b=N=ja}eLD&N`lCCm)M0F_qQy?{YU! zYC3P@!fN|6W>=JD&716!rbcv&#_i6mn2-3%m9RJK(OY`Sm6#6-MhWH%KRd+P-fx+t zCxh>yjFKvsBir~^-8S-8i!P^c?nWw(1H41)Q|u>1bYc)^xha85z2)r zQNb#7#pHQzz&gnf(fmvn^v!0|KzfVgLIBw{`snFlVtIp%db+@|;v&I*jHD=?m}EZv z2%LVng-TJQjJ>xfDQ)J*8c~uVIv6@CM0?U&+s1_8M=JoN-IV&=vlpnc*#_lyo>KW} z|4t^97Aj9;!n4OnJ(H&o;Blu*IF!GSWC+>nq1q*d^s6GKy@_hRUwHF4oUW0nV~nbGDpf|hN?I6ZzA&k|)QUk+7s}vuJar-^l6~?d z!g4-|#vok`x)GH+8hK*ZMss`$M~_}XN+(OGDoBg)eigk;#hoa;uSwPOf?Yf{N`2%k z;&MF&C5*iLOX1X#KdKlV6)xcP*Mi&??-e_YiGuU=_XY>PId;K|Fe!!(q?Y{!w6;bg zMCJg?o=<;dm?*R^(^O2b#?Kkm3u|%LC79x3+Q2kl=hb#=?i@_`8ci9% zH~PcW0f%DyknHOAHJ_Fs-o#T**-w^#Ui@OJs1F+bzh7>^KD|q}4Yeh?4MFR48QVSv zj^kv9^`%G#z-9v4!H7LeZY$@7`v#IDh;1dazoFecm>F@Ksc%_K7c*E{B* zOqhXGHJeaRB((&eENclX)$Ai_55gqSbb{8RPQE=;p*Rc50_He^s!L{QfH*IyvH>~g zuLyFYt--tIz>J;-kOKyAq%|*>bP`Zoef&xeIFV;R6u%vK*ZDEe&c@XMejqbF|>sp%U{5^>@dKzvo3*Y2VBeQ3!h`2peZV zEi%kKT+auw?WgJ+G29(1@039I1i)9+y{fi&r<;KYz zKle%N%^Ud0eihEJ>ERnicjXExf&izRz(LJDGWO0`>iDK5v*gjHYs;2Rh9U0|J;S*X zYL<##iGON}iU+Xn_3si3ub#IYsY?c-x742Sp-Hg*oEH0ZuY-@gBC&z3_h`@(aZ|8~ z65ra#lx=MYtD9htnY+*eSkhl=VkpUNecwwP;HddFu%5?Ir#`5phFki7B|IZGJa;Ng zJe+=r^lY4%bLogWoXmGx*gs=M_6@XCF$4JhC5Y8z%x=&(4G=*T)ol0tUxZIl`(AV_ z`FIWOQ%Pa*FU*9LxV;37XVlE8jpb@C%FD^&dnJ>!zj;&Ruc~WW+1?zIfW{oft5z*~ z)iHF}a?q*U#M6iuX&j+4Hi*CyA=Dn{Ddvc9>-lo*7wQJP3&$WQ5n2$(WT<91yHTwnZ9A27JyrN+}G9TmM-t!*c*+ zT+xQ#=!&yOC%gox1R0E!s+uGF-u(6T*8XJKBrW<5dGi01MptA)<>yt5-oYE1j;SoasW#x+Xe{m?Km_Hln-JSk5%#=N>p^Vr0p*Hx1iy*uWxv*V{mAH2G<%Ue18 zs)pT|WnWW&hPV}6Em_scC@j}el)2xpj`C8>*x0RWX+|He8t*HIAcox9?%zYaHl6FL za~9{c)|$KBiCM{Cy&DtjidvIFTKq&fpePd$kuHlYTzR>6yUd5J_Hkb6ev-fgh#?Oz z_*YQVu8J4NvjWAn?+s9RHvho=NLRQkALj8R6}y%6AVMY6 zyv-7!l3^uJ3wSUjR0{cTY_rQwFK@A~NRow1B`a=o1dvyL_qi5f9tLgJZaw-&U#Xny z!|o9$<#jfX1!%^Z)ak4Op4-CZ59kcQ7DEyCF02SqnPMIS(2I{6n3j*Al9wYyAf6~Z zh}CB*U+XRIQNt(+Pbaj!y&u)56q{|>cU7|}!?c`1^N`UFWZko;l9T^#!ONaQyJ;x; z*wPe1kz6`QlU$mc%ufArvHFJcM|-6t{2pK33BBNfJXtSVBJ8GpXm0|N6ShG;S2j@7 z+OYQK?dKCofR+$gZGP(LT}y7=b4$EW>mZUxEa^M3o~V;mi>-0XS^7WI({VobX- zRXS1j{MVA{!&jY4%MZ-u)kA$uTf%)%L2xY~#OaQ_EiK;}1Ca`}O-P#;CAxd5*I5hL zv)SaVP~TprPyg!`H!=30Dy9|OCtnwmjsI=39wpUG2;;|ZNk}gU&FR;xH8zjn$`U++ zIe3W*61$Zj?J8`T(_rbB$gOEV6 zUfeq`$!u#(nKV;HQJ+0dQ%X@^sFN?XqlzN2^rn!(W*^>hRU#bYg}G@XH1d$NVS*-J<_Nf@g7)E zezsmfj~ST>hx1XMATiMupG9gGFV*iWm_drudMhKI_$Mz56RYlC*IaQcAgeXZx$>_mL zipLI*^OI3BK5>#0iIR$fl$3CIaoLj29~xA2`4UPRRaVduGt&Y^5EW%jDwet#is`ZE zvSx@)}DxbLqWmQErLZ(|d(?qBYnpBDPm~ny1|Ct z9N}cH%~&HFYOy?C<0X;7SYxB_SYuPRP-+5%$sXb4?X1yQV;Vx^nwR84 zvcW|7O4BCaCKG*jQysC~m$<#2nmw}x=uzI{fb(+z!C+i`nrC_FE0;tBzmeuuO8B^8 z!1sC#x>2E#&@{6A6g7(Trb5e1+Dw0mg0%49Wm%IEW%KOk&>3>%+v_PWU&aVNfAjy$ zj_s`85xmbuH=LG}#s*_aX$Nb%U8u4*U1B-0myj>;%!z;>GY3SX` zG>=hXUK*Y8YBUF5icH^-SSBa+l$xB$-RX!m`NjRFdcr!EHA9NUpOO#OY+F>0^`Jsh zj=3#s2(_%%cy>dzZIsdPJzx;VIH2dt(~&&rLXL-!16wg;B%HYf3z&Ju%G9Q&8B**| zX#}2{U}a2Ih7Qnn+d(;O0pUEM=LGf-g6MglJJ9{B%TcL<>vfqWVD%^-&Ml zhj8L-%~9iranweKj{A2^@^_-Y{S@g8k$jS?6eyGDLIIwxr2RH6_a@@8ej-xUNw5R| zRoi#?Ynz8Lk-!RNMZe2dS+GuBqi0UmQJB~2A(D1KMN;#N!5UP>K#}2h9mrKNTe25B zT)l+a_+!ywvx)Ie5^2tH2;*a$$2$m8fUe)?|4#K$w&@G{=3|4|ph#^VxvXad?Rd`P zGDs*sWEZU!fF8a5zv&9`QE$W}z7)y$5vrDW%l`D((&R~t^YQ!fwb4??&K?oxzK7Ifo&9I>G`^eEXO{0LOwpnJa+p)kPtE4O__C&9V>f=ipbw7G86H3fjq<|G z>0`_r8IvW#jm(RT#$@oNaGv^~|S%IfCeyFrB+*3d-q% zsIFiE{pjZ)i9A8OcYy9|FfV}_aw)fG!Gg^8eMPnf5d`t+ZzEsVgYoJI&p-jqrBVL|a+d~K+L`-+&^;l*+iO49lKjQV`( zEA1KmbJP1F$FM<@IRI(UV04F59B>Smg*cx8{VJIK$xw*?f~Y!9QH?O^fk+H^V)_0U z(Q~31Vd33M(8;k}1tUqA?(Rmddj9?vCf4K99_=C7A>n!4fD(m_ik^7s<{edGSA%GZ zdr6qu63ucNhSHz)HzS}|^Tsy;_S9T`?eS9{fCVbBpo5su!RN@p2Irks|GX{ivRe%5 zV#w~;jui{!hUn;gsW3@pOff0X6JMaS_D-8nn})MP3PO*Umn8fjzL6H2#J(;Zx&rJ3 z#3GZKc}YYgk^|lnl%;1#2nJS&a3m=D5aEgmIp#4QGMYB0`et%agYe&wfwAu$&K&b0 zXALU&n4l533%!C65Xcm~fiC!>2*~_wtrS84VKfMU`|C#o4UZy3;jJSY!tyEX(&1sW zu$Wqqa|aUnuVxDUGt|U`%${mrj8)91b4IKqx!UY+Zg~?B+Xb;&-jK!@yQ)(|qZa-Z zXkfiIn3&?pX7;b_osL0?i#QADtR@?8F5!YpvQz z2X-Y(J<8Bfn-SqK#q$xf5d-~w!l=`;6pUXtNd(T<;V-+5Bc`&4jcxfVk+gU+5dUrG zhssWiH7z6k%MlC?GaUb64zLIuPXd#t&146YuMxY)HM=u>ai_96fRv^}l&4A9vI58$ zN}~GjO7eIFbp{>rqj2j|LRO=cKdJ%yz=_MT4{`+j{v`<8<_2aJt3_1aZL`8jNeTFazd=`Y8ZBcP8!iZ>R*C8bHBg<1HiJ)>DNL5bweusuIQPurv`* z`G-jCP8!GxG+A8f5@mx@*f<_!o=&y)`lv$HO9N+l))1K)Y)mTCkXL)M)Nr85j$@X_ zeN4ZVU~fYg!s~>cpnqUg<7Ml5P$N86sI6SvM7xyGt&BE-9vN z$>#2|gXzPSFhs8kKBj-dEY4sz4he4@gQ^8oxC@eCb<>~l5%+=Y3IbCL;Y%S<#tTRS zwFE-7aahCDu5M_+^v{R@bnnA{QKd->+ILDhcg=`+lPfUInAt7g$w-H!qiU*nqq!ju z76;IGo+{M=K<#X;l$l=q2&%Q>NEbBK@^^i$Y56OVcuU&LF1O?z?A3Oc=zrc{?e%_K z%tNG}E1sQ>IL`nMYy0ZrpIfg~4tSqq{aSgdHiB z#xno~erxT@bnGpbgjpVQbc16|mrDlgBkfA%iVg1@>(GSM(K77hjrDLlu)P}CdTrB` zyN7^)3AYt79}8c`QQ?-~s zY!XFRUq?C*V6b~$lEmuZ-ilh2sdePdBQj7c?<-aO9!{ zv(f{Fb44ydFpKR{D;b7ST&;nE8)XbzzQEqj9FQ*~i=M}>>8b7jvFS{9n~Et|4-TG@xbA--XU-G^p+tT~vBj+Ie9>E5CiV90fQ;yY} zq$%|$_T*y1ER;il4T~Vaqv?j!#1i8{vOf_daWjlTizze_ebA<-JSX08cPoX*T zO|eFydnpvtZ8@G+3EP75CQ&qxdZM&Ca3Oibdds|zmEBSzs5P703o!CQ800)q&nTEv~Z_uiFFs$y@mCeb#Qng-GFWyd6BRu&|HX{pfs_3+2i& zNgwqSjJ`Hasr5@R#sz zVyS<^05#dan$j2y5$qn<6i#Bl0Pr8zf%VxHsV=0K4un%2RZ8yTVWNv|wGD@LN8lu2`r%^+Q6DzHC3unD z35$v*-o3}L>1=F=;{GKR{-BP<&cz;Y3Kd4QMBxj}=*dZ)B)-89N7`QM8!Vq(dJYzq%3$G zlNwfD^YN@p%W+|n>!)h1RdN4Kw_U}48PKfJD+|T?1N=8+0#rO4Pg7bl*>eCmxTPUPl$;R@55pfOZRpNQ4Gk#2oJ%tv{6I53w1;_(l zm+BJ!!-;2;#C;ppl32sh^Z_O_E?R+zG<^YjL9)?nnR}O`cB&ngYdph7)<5ij~ffhb3rm z`N`w70lBZn1P2x<(CJ(H4s+42+f-?&8p9dw)WRV`F6H!KB~Afld`NRX|B_t}h;-x} zas0m=D01b_uU$JdzdnaBY%gOT!shilc8(`0-!C2?A6es!5_LoxB(5kb0E2tz_vZyN zl>yOsJAjdeeObc!;^?KzfFROc&a_HVibT-U%J;>H>Xsjd226kkAWPRM1Bl`}D%?YA zc7`lQq^%7x8%tJyh5_PYZLxMiPsj9#ggUMaqS3~3hzUNIrk#DOS*q9uD>LCgZ+P()yP~`M50LV;iFfk!%5p!GZ-X4t>V%P51<#Y-FO8KuL(HK z*^HV6?yLtUi^5un+Q>r;c%%zKa<2p+d6H84n>LgC_e_sCs=33(cX{wVl*Gw20VNfl zXNXdGp&iUfEWG%#TzH5i7d`{n7_C}Pz4lD*%mI&xGC;r)P7lrQ&Ny{E#F@i-B1&{s zC%H9Ll{v1OeB{jvnCJH6c;v?P50qUjBaPRL8Le!^R>J1wmM=;hVxm^p2`!w4mbAc2q+N%kXCO@)a z4c@#$`p>y=UOv>Cos30!k_6sDzrODbg$~&OuZ^LxLHD-X{_iE_RuW?Jo0W^w^R7Dl z02WwquoYwulVSpsqKZLP#h{{QP@at`{8s1eJI^Sc<1Qz_kj#{LLLXER8C?(wC5(z1 zN<{^u%49_G(=v6wJiV5dK~*TYQyJGO{wgw9Mm1Dc87Qv`npX+Mx7>US>7LE(Zh6qU zZ0=SRM@e1iW0Fn`ha0Uy**I0s7h6tM? za7ZAcG)^WJn+qq$ci`kF2!YQe1{~Ssve@*H)5Qrw523jwcK?u}q*Z;jelfsZ?0aKR z2sI1=S|}|1D}NBYaDQum3)q02KhnXj!lC>+-?MkR9nW?v@aS4M@o%((cwPAoCA3RT z9d4`aR^%RknBr^v{2o|0N}U6asvGRV8U67#o_T5)bz?kDw+%CfWnP4jNRy*JrdLFy z4dpiMD;iRVXWGMLSa4Z0Guu-)kK14 zR6>Gh(H(1}ABLZ;`oohoAFAOW$2^dDk34tzkb0cdN<1)!0f`I!XhEUtut|haIywSP z)#i5L*rFa@DzS-i>+h$kra;)^Rn&DvPY1x`Pe;iGHidQN#F;K2$%Te25XNZDp*n$1 z2_j!9GgFiLgf?^R^eqE^U)H0kM>NU2(b@$2WuA0(Ly0cdk@X4P+JU@)_OAgfGi&X7 z7kzD?zC8IGhuc%`)tnkwuOkd*Gsd4#`$4`%!N|A4nyhjcz2c+gs%sTpqoY)Ngkta2 zcrO^4dpu$07Xm?{cx5kFzqRqofnzPD-{&PK7)4`9SE~R9e&NGD&@wY#( zQyZWf2ho(v%-i;1i)D@K3ep%h@%%p7L3u!kW`G!gm5N`07&pi1zMfO5c!+F z6S3jSADX3YshY;-s>vZZp6YdG&JLh)&75v#qLE2_bg{|5hpx75T~Difr_12beW0K? zN-#l#>R$xwA*&Yt?1TGe31SqO6g?;=GJh*jTijkM$=XKjX`k@dldnw?I@Nv19@h(Ph#KmWW1z5?Sm2=&+yJQ6UWby0{ z&?t04VTmd@x(lQ{QvasH9*vtx;xgO6X!o6QF6CkgB5-1dkqj6I;oo$cd*)sm30ui(ZR{YD?2C}mX#3ktnnNRd@s9d6rqf_09>9I)RR#kGS8oblaj=ChbEd)RwOq-AHc?-_&m{! zEzy`$^20IClJ#KtC5KBtg@oPqudB>Uq`n#SYPdLLsk#)3a$M5o{qh1uc?>o4UWis` zQpmn{75tGx1uj5=t24JJ#W7j~4ksmy>tO@hEozzeuiI)hDH6{(Z&34L|AsVXdV)Cr zF&=zWXmKMw{8$=mM?duLZ{KhXw%C6GnFpT{v z4Gt^V?sYCrM|u{dAZmwO@;`$Kf*ud(9?;q{@YlGy17&t!>&3$4cIioBBBlumZc8It zH^`Yl4TcIlU;-Xee@8g33@^iugJ0aehb83f!CO(9H2z5njB=plMwtOo{INt3x@{RI z*bJez<3jKRgjOD$i}DkvvD}vWOildrNhMQ(gv0wTgNZLML?Rvs6Im7~3C6)~4?OxO z7DJ{IkE~ZRp8$`vs1C;yuTz-@F>gmVBt&M$oX5uPVuj;)d#D3}xtxH)_tfowLL012 zJGC)kqRpN1=iza{iE{Ps?!z;tE#(B^QP zknJ+Yfm_e!TD9J2?zp5zPz%l>UFblIIUagkUsBI8052%MJ1%@3R^N{1bq3|Wc5$T- z_`NEijyZ1{4KBr<+UQDV>j-9v^6&48kYF(0g{mME=o#soI@bubg}MOo^ct!tf%q(F z1dZ-}t0v35SQ#Sxh|}_dRSC?^8?-<}TZgzbjV^2#-}5`sbFd1~xj)@_{~S%~{vWzi zBf>(c{8=jtaZ?{)TJC9W0AkL65duVbF6vQhJ1 zO^%yjFV9!>AOQ)VNM%QeL+CvKitRZgFtzZ0gv|xy1%(wv<8C|Ol|YK9A{{{%uJ5}J z_g4Rhlw6d;F83h!69n8u(Y0rRR={{nazD<^r*|Z&`!oRcd>fMHRC9x}eRk?sG?n6r zZIbvY{%j^n&$XLB3Gv+s@L2Y}1u)|v20JS8Fde`?w@S*~YuLK|LF`oD4B3m^?SDYi z5SMOING-;SP}_Io)2NH>3amJX!kQUKH6}h(T<5G?_(kh3(HES?IFh30r7WX8N%^Fs z)sPID`y6{`{Nk%B5zR@)IY=T&p0uuEO(MzBd1)>|jOL{uLLN~X)6O6TOS{<8;2@1j zJGt5LDCbzzkHj(UsTxU_@vPN+L({_;75bd4tHab#81uST)e~ z3GL9F-=7}AztO%j&qCh#1CzvJ+RJ_pK~eI+Zr0OqDDO+U*_3!M#b0vy)dMMDSw6S5 zqL7y!bpq$^BqIj&(&)ByUPYPS|BMR~_|Kj9Q}x2xDG2aq9!2b$)m;JFc}1zg|0bIF z^BT1r^&||RtgGHlQqHK@wKOfepUx0xaz-WR1TfIStb)1$IYwL54z4nmdR$s;l$pmz zFeWO5f}HehmV^_u^;&NPJhygHBMP60N9#db1vtHak-uyd_7yezaiwOy;JNNqFSJd0 zPVqh5vxl@v@s|Xlz)VlVoksPD;-NpQoDq!h86S}+Z>fO%k1CU6XMYb3jB7ysTGnkE zC~7~}-*zTLZA{!3^8G^)Mog4md7cj9H@I~q2>|3pAOKu@q1&yL{8 z;&i2%!QzMsW=8EOBKyO`2_MYJF}Be$gVQW-E^$C#pescfJ2jxtY_sh?sq6M^30H76p0k9(&=~RNpYjT=Eq#=8**@sO&%K9SS2tfE-@Acw zo8&dNJ&@0N`O?WpQ$$FWixaOus1RukAi1kqh&jr$_dAfT9^i<^)7W&p3*XC8bW^7` z`#PmFn?bS&6V$%%SN+Zuu4BsXP?!K3l!Qh@Rt-EwIPs)V+p|7Vh;1s+zQ5ta5zfFD z&iG)T9R)#~e?_!2>c=0MC)YthogMzV5>5Qw%5}@>-$X=o#y&QpHlN#St_%fv1A>%8 z{YMMOMG=y`V^A$D54ztEH_#`(~ z;kQ1cCz-;66M(*;JIJKlUnt^QvGd1ddW zPOP}F&#Vi40AljqMzrO31wIhS*YgN*O;hXJZr>?qsyP7BBZ=dophGK3;8#W6qqHOp zd0_XKrwPX+cT~hwr`7?Ja#H)pnymA!YK!whH*tn{P}mg3~EVK$Uyl8Yt7f zj|YzIl6%R3&L8v7Cq$_V!V|89_c93&k;sxt$}uOMZ$iT zel<4cFk+}FFjLQbp7l=8uTB@d+VT0>!3|9!pj1I*)5$<7X9t%(5tg?Odqn_0&5rBU z3z4exggND!_Ggn z6=f^z5UgB40@dBQJX+fDoxdemGYCt?}V(lgr zZIS>Ma;T%EgEV)RMV04`8FEG3^A};1@tyNNP$KhsJ|9tXH&lmpt#nc312n7fOz|>5 zqKI2)i+fQ2*uzi6qnG3c!fHZ};{rO2;bQp;{sc6OuT=QaoxpH?5hVefY`hBvruh`=E1@og89YL1nYL5jQ;6$16wZrO9WwLPhsD078u$~)tZ#r8hSxgu zQF=n=&aeSk(T7EcBCq<(@XNS7zEXZ`rB-E=ZGy!oA)#ZMgpVGro5kX98MB_wr#)|j zMf~0Bn-{XVUcm=0M&?lP0a(>v+Q|KvK9`UGrCH4#UW3I&`&|aQKMqD7S zcu(4P_NOvuU`;PVBmGD?bfH;1)j!HEY& zXjYLj?-f`C+zV2}88lXP#%pguT_uGLe(h6hmIW?x=@g1Ip~10{NzVMKQS4gG_C9mT z8b4e;olFz%&usk9!$k2HQxT*P1M9~UX(SPb0~%GgKyV7=NY$+~RuL$QO1DZffQ^4tKn= z3gO#&j`i=l;*QO6j;{+)=l`a8*LFYw}ew$$^KDHu3#^V zWT8p(GII{@vAVH|Xp6q=kxUQ^AUBU0P30i3x3qb1tf4l&NL1FT+y#Kr(TQr?=8gVn zFS*aND{y`V{#Kt~Al!T~mqD1@*iE5phA$~wCD~E&m zZ1eIunu>lhW!2lR@nhDv+T9xUC!imiaECzW)tZ*u81CC+L~Tb<4t^<(N(Vs(kw_8h zfZ52{PWx_O9zEYa6t~fR_ta zahI|_0ZR#zsoDVemCZ=L9uz~UEgC%D3^fjqO#t4(f?7=Pev^~fp>bW|@e;a0g*V)# z!VqSDVyJiOI>x~w;PJsgMEen3Q6YB&y4L^nTWJzt!3UMO&V$k9P4%enNQ|}8hokoA z&8j%Fou_>L;u_r_oc1u_pAU!=NB)UA-06!nFr-gycHs>frL7xcB+3uR^B^Xsd*#}^ zdT`){^(a?9WdCXl;HBepYI>9DiN?X;#oS}>F~folq|?J9T|$UY0Vs@Ks@5%w`qscfe&8TgwGED**D&1nQwa=f>Byj- zXK3a|A=b%!ZE`>rKpV$i{in|QX^4YZ#z{`e%}84uNI{HzEjG0;I-)yulS-1lJ*nt1 zvS&<&xb`uR=4vdqJ%&C^OPfK-Xsrf`h)ZQC5~idr0uB*~GF2t*s;krZaLyz&gg7fE z)flQgfiOP+Lx2pj3~g?$z?-qIsPsD=47R5b4YnVnvJh4Xyydi9JzywQ3W~#cQ)K{( z!Fm+CgGap!XtMa%E-mHK!hwj$w+EBN#1n8BEqzO#eoE zai;&^pudkNCR{ow1U7}Vz8}oZNzO@3*cjAL|31&gpRV?x%q`eFY-M)lKT_OMf3x-* zQYH^dcy?sVTgOggAD}2l6F2D>42^~D`UmwF3R@E5WCPJXl-+#j$9Ku9#pqUgd2d)kV*(v4=%SbpNU4=E*zS?;f5X=ZEn@suaQE8Vj`zxpOfBH6m= zdyepyPCIoF4Df@tsK8-vMf~{xj*g!948tt-F*Fi0AIuwc9k@4i9O1LjW(EzV2II=s zb(HoR$p%NnA>~bFeP4m?9+gX5hT%UpO{x3?S;DYs8w%GA@kS=-$u5Ex zY#usSS!r?qIeH}1ivQaOCe!V_y#c{3nPg6*%PhTB+eq}`c0Dy&&ZI}9pMjDCOXz`# zf;hBPQiA3<%#N?_Yg~otAIA9dHYUdrHZsi${GWTGb2dafFf6wzdg3@|Q=V*ZI%(hJ z*~Kf5T^{9|>AjXoiavt@JOfup2ojNCRb2T+aVYAqq%1f&74Zuq`79=R=Y)=3AKfGE z3#jL8lHlPbt6Czqlz3i~-t39YAdHBX#VYctm-rHn;=@M!hB;idE4wMaCLhoV1P-e` zS&lAo1axp4`gX<@A!OjQiFNtT1~qWo=IR$hiOTL1-+wO*HG%ai55Yq|?NGlRoGk(| z?Hv*3pHo~v6kH(pb-lz_cAPpj{ITWp;b^{2^3TA~pka!DAF-fAp#^+_rHg<cj@@k zp?6tk(^e|@x1fD8T}1B1A8BrcbB{dU&dHdD+-+|7%`@Wv4~Rf_ze{CsF%(FhkffGC ze}c3A?zq$H?8_ibBDwh?h+ddc*c(cArBsh@?1?|hS8EO?Uew`VdFBb2@#mgEXHWkH zQYSRAC4JfJ48&nXC&T7w)b3sn_cRBaKc>#Y*x0uV$GDxN?dS5&SUa0d9)UeCN@s^M zCB?C2UG~YRc-LCh%;YjBh~$_uw5P1TK2hMtuKnN`?pI@T?@;i_PHrQgz7q{6ilx2& z#JgiW?xgUc!SOjs=80+bZ%logS49-Maa-78sCQ$LVK)5G-@=w;W=F;jjM=)t!7bWt zZXZ}58ji|uVmVSLB&j9PMOph~pc(W&COAxC5rcE?D&Fq}i<1jhC|s~Y;UWSj`}DfP zydAjTMZ{nd=XLd6#tKKYSmHh$t|CA(yy<-eHsg@M{ieK19|IE|P3JloqKk_bjE*NT zFC0d(TZ50i!TaG&v*~Fxjkdywv#a>h+v#Sza$rw{)xD{^SU6K~e+30_idS!AHh*xI zYedW8HGqQ&L9HHj{(K}>y;SWQj_TzLRWCIWGXZ*cn9#kyZcRu%>RMz3afnD@bC2F} z1_8_Afs+h7OqAak)I(wM(OvzuzIU7rWnse;F(I5A0C-ydtjSa8B8AW6*kMTBmHYjr zi(GEZxr;F|yR+jHEHCN_7A-{NCQySqUa~+%JLw%tQT~8IjP2H zxt|h!df)ECTlRu!b1aUNJSb+p-W(3WxAE$?(Qn54=4YgrU;XwT|4B;i;=fxB{JJFM zEEdxpJ8_x}HiROX42=!uFuc1q;@eyw$*u0y>tj#87CgyYDSe9^P}~XTHDfxW3XH#1Z1VAoTX{^Eonh+B$l)l@!0aazoJdu z@*Y&TMu4q6hq>z@y3AVpPtjO1l33Q2)78Fz<0q~ggJ*7l8}&Rf zn72^_jX6|DBV_gDH{s+V=952zQO2kI{sR@9Bf;0XvzQrEdt)!$JAR}~7ZShwA;Ys9V64dpZ!7Wxe7>6jj(FKDWQ5rq zdtb-TvJEkj7n`4t*wQ5oaXJwZy}n8#mShoU-b0I7#-po=Svqrg~y_UG!}aJryhRC5f=f>?Pm3?IWYGI2eI+rIHwdtuzKWQ68^mQ!Uqy_; zgbV4LzLpq+2^R@AeJwGD6CsFb>U!c#C_?PXBw|$=l`u@GlEiygjw;zisviweRPN7r zVAo&=Dv3Dt;}~jzL{WZ>C{3oLD9VpBEMF(UxT5$t<1$mcHndeSnL?r6dkVcjtG2-F z{q)SlP>zE~F)Bk6$s-pYqbcBP*=fs;(GTd2;gqGvX$AC#X%dkcaXnM)_ zt`Vd;U`{GFz0PqeLuF@sFt57gr_h=l)^dK8Ijzq2+-#8bIB(lsTYdGs;G%|~%lEv; zU-Y}nXYl{|cDcQ~b2k6$)&B=jO9KQH000080LZ8;J&#x#Sgrv80KNhM01E&B0BmVv zWo~0-E_8TweNw@0+b|5h2gpAVJGHhqts#$^>NE5?$&}KK;qGPSHBuH{y|NSUu z!8V}SNtF2b`1Hv640y%u@gcc#7 z>pYldx)dxUFNyKD|PvY2X3hxW|&mz(yo2FYdG5vzXB;$N&6`r>{f-Ot3= zI?=<8FoRZx3x5`HS-Ah~-e>*ivtLk40|XQR000O8$*3$nb-6s^PXGV_T>t<83IG5A za%Ev;ZDlTWcyvw6F%Ezr3;@8d^aV6=bagO3qe24>m6A{+&o^=M_S*`_3U)hqVK~}w zQY9B_u-}px$f3CR6){@kkj=7kh<0H|I;k&H$HYgf;D3Ml1yD-^1QY-O00;ods4P9b zO)ep%0002x0RR9C0000>IWRIZFfuMuNl>+qK?{OF5QRJYD;{`GXI5w8XP4uQ!gB8K$92|^zDh* z^BU2f-?|8aQEQu4DK2{ z=md8N5FiA1cMCeW4DRmk&yd~U?!BM;Jn!Cn_nkk^)T!=MRbAax{jEL+1_p-Xl?odh z8zb4c5{5F0)rXMJG_kF4c2ir(V5as=s2#QbCWyR=0z*U86Mx`&Y z3tm6G`p+dyX=zr-m9>2$jHf~8&fZw>QiL7+xe2blh%5sOV~ZgZH%S|bEaG-*)M-a_upyQ zJ+U=rmdT6@j4!DT5)(?`(vy_&2=l+`7joh@@vvzUxtaUrPTsV=un^q@U zrc}}>N))%p3E&k^;s36ar)+tpZHd(r?3%R$`F-wL6KW6Oa_Wt9w*l+N$}OD_hU%G= z2puDd^g1W;+A(ucD9Lvs=|o~;ET})E=v|Tej0;_8JrZBu0}AF_^acZD8^ff9mZOS< zs_3frcv)DUKEAz5on0_=Zp84vIY27NM3$aE<|r7Psy$n_c`+}am^yire?y}F^yzKt zBcJ2xm82yK6@mE zAmRmN#$15+#ICj$Fk5X}AVpC$VXTItTKA`_;vR9r_e-Xm)IBuMQy8N;TU5-_oOZ`j z>OuQX4pCJC&beO^!HxHyX;&>=>~UTGx2d>1<(=jaAZToo)Y6i+DfEVOjQ3-4(L#n$u1938yu;x$5SA?2jyi7wr2PBDgSDDw%eO2dY-+ups3)W1q+ z-X(MtxVms z?UjMAspc=;JiBEG9>`%+cH&NY+33as zs`<=Z4|3tHsC(9G9K!{Mm`Vt+LNyWs7gup0CM47*V}!*}ZGinwCY~joL~*UE1eq}x zDSJBHMga)8m^NR+BjU=3{A-57MF)nBpPK&Tsku;X!hDOy@fV@|x4oYF?p58El8;Dr z@T_3T8XtP75vT74Uy6LqMBEf*{`JRJQ;XK7M1er4HOaZn#SYhBi5I-Jf`&Lw&7tFS zue$l{ev{1cgbj+Gn|@j{87=Yq%>18y*`O`0G(h5_o_9`7@^73 zS9+Amg~<2*&;GP$E(pMz3Vf8qVh}05rcD&*FQL6)V@+j%kbELoLol~EYTOu&vg-4$ z8o1PD+B-GxtzH*|P&>&rp>N#y-j@vIkWa_Rk8ZkmVIKW#W!Zazf&SpJhmN%D|H|LM zC2bed5Ci)Dn^>=pOQ2jMexL#!yLEnPwq@);juf8?K zG<@&&{qA}eSxR+#;aR?IF3a3JLaj4GAl)-D_YzrW9Nt*~OF&IvYGQ;AbfmKTAR!Ie zsZ8lrp~3DL^?7gM>ZNWss6s~hakOOx+-i|1quJs+#`_o@kTEq9oL0GS3e53-poU}_UiKy3po!m^avexiYuX~rx=X6hPA?cU%X0B(B(Ej%sm%o<+w*XI^G`5@v+sG1F0z3W?H+x0VR5uE3{S`S?_$%>9$&hY1lDrje|66t7f z&JUjLizBJu(A2Q%o_D-|OU!PTWxf=Cpo#K6e^Zk$Bv% zcqcM^D0#W$skX1IbaICKEMFv&XY~?hKXH$-8 z6z8NSGhoQ|*-|+R=^iXPNwJ}|Q`5H|Hh%^f=i-|*3RS7{M`gkw`?pq(?q>;cH)L`^ zd2nODFR$}_5NqtHBVO1gyoT;6KjdV;P^E8v+Q`0&nUyz}+;!-q9zAhS2&fk-(D=s# z@^d&)Ed_m&{g2^*hwM+Uc}C|2w~i`}N6`txwff@S>@o7$(?IoDvLJqr#v=}ZT0Mfn1}~L zt2o4nzug5bDs#qXL<=A|iY4xA^uF6oWM6MmOYj%(7Ck>iUJ-&!GS0f+ywbE8-@0!u zByN7B$k8(dNpLQ4-(=*6uyT(q=7b$TqRrQbQT{Aa7f?@BYL=s@$ax^i9rE;ysKMO3 z-_h-lx@40|J^K3iOI*vPO8f=n$a&-Qa#7LlfLXhrN2HgrXzG^pxZsp_;?D(wsz6V_ zU(Hrg@+w#J#^RpeBs|51?2W^Cy+WAUy$P|7)|wbUAu8;bEMtf4)aVA}cnE$c53_UtH>DE*5N znd}WIGUqsY521!q&n5_5?P$B?rKg;riJQ$#-=8Ls1N&m^A#`ZoSQ)ok8qbP!^8o>j zN3wSBM|3AS#T|zg|Hd2wU^${KHF@3-4@T7(_w7~HC;s@UAy4nraOy0@T{!p5WPxnS z87^uWEh3$E{$b!lCF}S(e%sV#IQ%ere-`ts&Z4Rp|Mp4X;$#Nuu4J*)O!;dI1;-&( zwJP_X;wnbE3lU>+ep=}oi$tdn-5D#r*!KJo28~m%H|IzW>L)GkR437E2j=<4eZHP` zyhG|d;Jv0UfTJ+4tK;0LTwe?c&_~bhepP#w>?!f9OYxJQOVyl4OySw4zsu*|mEws9 z@@0*s+=by7cF2|M7cA}(u{v&L&tN`~G}tTZb-qihKLkDLdxzAt0VF#|q-ZWN zyEYEO!czECwsp`B3|C8~BG_I>*1R!sIHBZO>=})t8l`vvlW4JX17=*GaIyRa7#Zg2 za8~u$bj0ATUP!TwH5$AAv0t=B;$Z1nJ(-~=@l=kVfFB2kj>>) zQ4)MckEX2sWRCdr=_Mn@P={X-ZJF&smUGce4H~X@%oWJ0RK|;7$iF-LTDlR@_NLPL z;^6{ZJFO?=yX0zj2dPjKAq_Xnx8zg*l@uQzpiMVW?NqWrI^6L}4qYR1xhNz4?i`l#W#*;ny&%3+=bt0l_W^~#0iSR_A8pSK2hEAMdGk@R zgG-Ic0rSm-la&weRaf+rk%9!?BG)hKmgM_~d_X)oHn*{`DpKO^*Ib))xmZP8JY8xq z@-LDdLwV(AotM-DlRPj^G~HYMDP<^ZQ zvmPAJ7Yvqywm)p=e*C;?VowD}XF=O=eq^ALiP_$V&AyvBA0l~qf&b&yDshyQ`g5q_ znY$4J*l@yYk*Ia(yjmVAn0-^~nTx^t%uV_-;g~b99T}Q5P#3ZIvuiU$Tg>*yjTNz_ z2dG0F0JZe2N2Q3U1|E@qk( zLzNuesC76-t39p&9-c=o07BdMo}{t{Vhe~^wm+U6#g^IvgSPyY&+{f^o1+(B%v-mN z%VH%RB&TNWq*C}8xp>kn#X+aU zbOJp+6EBl$0aMwM!}k7pcSjOUoj4EqD|a0%-Y1Y&XR-NQ=BYQEFMTPL<6g5ybRqLR z!v6-G`a;}x!<~MzUo)%gRMSUOZ+`d5+h0%*6xfVpKt|n{BKHHeN7sAR%-%`RPXn1u zQAFZZ2(9r4doVH*fC#P~f~N(S<2%0VW0jEb@_~ISg zhxC%1RF^mExq=)Yn!Bbf*|Vhp6WLK+DEWp}o~v#My#|O|)wUzHlZ8r|R!Unxlir_J zh3~T#P8Nu3PO#rfv-BiyjT~&pyo@(d&84tXq}yg?*rku+qqJ2&e=Ck+FYU*T&M(Q=cqZ*wpW*VKLvCxqeC3~jJ*3jRZ4m4CTajrVHbE)19O6T-YCi$T zNa@_1_$S^p+rzn>Ud;UDmg{zIz_g5AKLt(LTvDXzoFhjvSj_moeA{NUbHQyOdXlLpw+X`eo)^e+7&BsV>+j{`2a=>BI{5rYnN+oAZ4l%7Nb-uvpNHXuCJKa)&nh*^=^ z008}jPS6@bO*4)zMF+yJ{MvETRgCWQ+?RgiB!tM+xf9QYnBqJyj3%+&k0Yn?9*J}} z{b3tgTU~lx_Mev@xv}8g&H`c)6x~+z4c43NG|^uZON-Lo%{909>)r5gtxwB?DTM&@ zLd~ux-eCI@Z-0{yVb(3bEAoCZ#Y`1ihQ1s%Zm+U=rrme~Trb?rgA#6}(ccc+3I~*N;xKNx`Zi9h>x1uUbDT&*gq5pUVrm3^ z#lyp~2W``pV`}s!qfji>Q6n{!d&7T_x49hRfsP|$nbv}#)?OBs3~>mx_Mz8kF3^B>X)8wbM7;a2UUO>x7q zK|)54O<7JUtC~(Puygo&o$v{`F>}Z9r#q}9*s62G18Ez@WeBHN2dI5|sKm}LZ&dK6 z;Ue5%!}-$87&^it-ngsaHx3a^C6g@j(b*>*E1x|UEj^taf!}9CO5@x*2mIkMVt8WgBCqC|BHY7L2NwI?nflD=6#U^7>;VBJ@ zAhyV!fiyW+O06*|cc)}I4iYlAs9g&u{Bbr5O7j`B32LgYVru5_gNs*=~RG z>(8CY;^5Im5ZHj%tDe6d4b!<}vgEoKiu-e7f`s=m9gq31O=PiTa-Yiveq|>&Bs=61 zb0T~DH9eY!J(;Z^g?Xst#P5W+{ZW-KxrIpIx7mG@Qf?3 z^V%Y1?7l!2UsSCBMgL66Kso$aZRg>D!)%!uYpqU)2Qbm7c!T1%L#MDQYb~`NYp>=2 zAa0`vRaTO)2cCS}e8wiq+0@~VhD;`AqRg0JpOlys>)xD*NM&>8Xuzsd6`@!70a1Ec zjdDGsa=Rfjf+_J@ZFno|22!J9T9x3qlZ<`|S#i;39e(tgkM zaV`{Sj&AN0%yUfLv3NTg80Af}6M=iMBcdhl*5^B!i!mGvq2RVq?JqwYz}1Y^TUYs( z+mbyM5vMZpyOs~~Tcs?0j2^>jBm%!E4vkBOI#;F4fJ8$MF*PrGL#51ugdx`-b6kRf zz&c6HWnd=QVx36=B;p6GU?J;>xqOzBMqMMuio!7w)oFy1z}bey|0 z-Ign=rk^`!dM9;sn4465ZatO8JF-Rc)xwSGnt7^Mr|w2ZPmQ7c+|A~OWtcEN+LEya z4v93;aCY8j@YTi(iE3s?op9x0Edk^k4iYOS#J;BYzl+?(5jw+qIOvkOx1+maYRS)$ zJ{d7ctR9>`<@YFk>zZSqe!<&!+tVT>6Uo7NNq&jJk4l%ENW*FR%}tA3?BSNq46$_j z(q7n{3315H3N9ot^U`Efd@qX6c1C}3#8kI^&V~9>oXcUrh3NJX z^+HxYIg6~*o=%bhl?|(Fv-Ocm4uACS>g}lrdE-K$+HLR?4^cTW!ZF@YcAhSK=Y13- zPf9S3$vpf^&1?ItfQJ&qCDMDcuN1ZvRnpoe%d06nUkRmVdR<=8B!f>F$1bMllK7v5 z2K$%A2l>eALO^!tPi=?-9sB|<{tRAiqYU#aC*)Cr%iH)iUG-PLuU?5|@WaPcH;9E| zNo8hxAzw7&RS2!{Oh0A9ZD}}(2sRv+lU`IknEVIwy5vJ3&XXd?>5CE?DY2b zER_6gZ1&z3Ul)0aK|WIx-`r%Bj)e&$ZPDk}tGzpQujUIND!s)w6Kua>kh1)xbAfTG z*%4FA+(iyz*HSo)u&fAE9evXRG_cQC=^0+C`FdIuNXx*HpMh3$zpGhzVCtluIcuRB zYVwF_PO~^%Gi2Tp$eqUHSCC?qjGDbbhTb?iZ)8men6ybCb}BNeO`S>?c4Z$Q@^o*R ze`~L5Hp1&qSz8VU?F|EH12Vz}kEOiyIz1}PH429YzN?ZJbA)pp!h%U1!vOj(9eFf* z(>RSS3Ul)zL+>^xCPZsvxe6^SL79l^&V!1K93j9DIq_F(O7m)g2~R*~Wc=Bj?6y`KkjXHg4tRRgY~v#x9m^VQhok07$f=O8$%ii2$K2gD|@(e2=*xUoU&P>b}auuqOsIhvLUz_`U4Pu+70-$+(Y#6 zcjkIR6Ak58QF?%I1K1s_oPkUh?yk@o|4*b7g_RB!z*|pJ|0h6+ssjWgi-sv zH|UYG3r?kroxfezshe6K1`RJHDHgUFzJ>P>&Q>1{rBW1j66Y5mltN@hiwkf0WNQjqH4a$z8RAsqz9CwhIDq#i$MTA2 z3oAdes(7qNOV2E-(o#5a29~HGUF_xHx4hthNnCncjQOmAhYNT!Q28>N*c~Z?F^Bor zY~q=fE_Zg#9+mE96@S16=a@|e9prU@h-q1q7@x775Qq8jz#Mq}b-)~0AH@^>cg-Q@ z6-R(QEsMwI`CVAa*AiF6Mhhh6k?xDv0b)q1+UFP^#-6T(3&a??KBspIXauZpwI?{O zX7@zq9!(XxOk8L2F!!zYLP-(*65F>*ndE+tVo&i7ZDTZ5R|L9CnsO!qIS%g(>84A3 zI}=&1de`sy?m?9Wz@WZg=E;`UlzukF!Q)8EaN zlMdjoBH72=TOD0pV_@Bo?)444bOq}*H9j2gq15=+6y;h4q|eynrYA?d>*7Nsh2WYN zvau7Jd?kNb#H!JoZ}4PK$7_X}DIPUcVImDDIYhRY8=2wgR`gX|Fht$Ta-uR%^A;c| zay!445+lez-ZyWS)kiO~Z$GSw*r*7o+1*tDU0fucqWDBm4{oSU8F{w$nn`480_1?x z@**U5c(K8sRY75xtB=--AT`|qtg_j+hkd^swcC-1t;`}*cC#?m&DUD;2IZ#K3Vw_& ze|suta$G358&;?exhJ*$Wc{uQdD8crQ}uyc*|3mI&00I(UPY(dNR{P6e&kn zm8tZp011o<m9r7iZMDyG`%OPr9I^?4%hl8z z8^r`eS!%!5if}1EC0FmXYsVme=B*D1{M*cVOIe`Xj>SF3Lvb7)u}dxU5LVh7l!ugq zQ9eocqU}xEN&U3ryhS^q;F$?oZupOtFE8#?%*G>3WuxEC#QNv*S~*P@ZSVE9;0-r1 zNfF6M_;if$dP{^8@m+qD8LA~OY-OC9z5D%bp zicS~5C@+`!yim*m3(B+UcpX|KTun6fX-{U}ktD;OON;nB8wTU#uV}}*t=|$g!aYQ; z57q=m3Pi#2HVd9f!(&YLR+K#kpHXWAv!;I9+KsVAO#B|BiFikWh(wRk9#!0#W+EL> z&y8V)7Hbo7AI7Q!j~{FxYk(Wf5h=f*>1{{^z|Pi~5>my=AcWOz58R);jWhu2ra@pb zPcYKBKNt|Hp)syh2}R%|*}?T+dJ+UHt0r-z!+1$Ph@Qn2wM!Vl^sc^-yBxio;aZ-h ziZlgdKy8cefN5DStY2c(H_9zjqOp6^V0}FR3uRw#kf4!L2f=m|3M*tXz^kF5AFW(& z#gk~O60O$?G_^!=noz=fALHxLj zWf^n$XMLh93WY?$3r~#!qt6BQR!n+(7P@k}&(8+{02uV)2O_JO!m8%Ee6qr+#Gi&JojRY&L|>fj zwl!8!Gy2lWhw9v`)$r~MeQ8!YZ>GKr6G!&v+ZjCyjM&KEExpouf`2YTl1v1#Isft1 zjW=J7@T=hLSLS^7s3rc7d#~ZhKS|i3e#PUbc-S{#1o4ve@aPOX`d%^ancDO&oXyR( zIs~5XDY^iA=9n`b&V|6W^m@5o@u#Z&>J0xo;>oP!*{;W{##G0@?5fh@=0|`xzz@b& zf0xMic|y%x^y5peuDq*thhnk-1=R5%iM2Gr&>b-MLK79v2qqhk>T4mhr=AVf`lh#u z>KmuOv~}YL3LV^4SxUot*#qzAkF;CEkq67g0&qPu;swA*O{oULn3jig_6w(Sk+h|! zp5i->gPi1@b~=i$7Bc`UUTa8}hfXaW>-v56y=|3=)ZaAQWhlOeBSWEuLs}Y-peH@HWiey5o zqKDKGF=YghPyU#pAlaq9HO=~TwV#16URb1!>lsQNO{}siaiEZXcV%G$&^?K5XcP!A z#+&7y7O7;!_g5;ptGxwF{XdvD_V1*@4{{G$0*1k~QtLB!8i!ju>FUaZI-%7^b2km` zgvhNT8S@rIUDJcpZs*0i>|*963-~_01cZ;?2jEH`QtfK1^PYKxPB$0d>W3)d>8GHN z*0{LJG8CYRdk!6X%9M)N9RnISgaG%l|Cc3{anEmtU|`|<6VyxpG5gAYpM6kQ&>(F@ zW?=D1@U`?e6>AT9mg#;o%`9AU^dD*CbnH0~!QG6@uUfIq)0JLk#`@;`cgFp%nH786 z+FpmAVN0v9MoizR+ZSCz57y{P#gdZ982J-tQw$<8H)jkjU2*pcA~>d?}E^Y-5$9#;|n#9m{RdHr9iYZp8ug^7Z**}TZ=KuoXIM&xpxAFdbmmnz7J3nTFBhNQBsyp@%0OD%y^CJE z5WIO=uXf2|vF0H(=;2szb>A`Hb(wWAslEp$s(MiW9r6Z#zI14{m~&cZh?(n2g0%l` zk9!!|jgK)i+n3^B81y7!_B?(R!?GQ~KT424xhD`hey$QD7K3{lYf_6BpFRf6oM&j4 z#Djl+Z~u(40ZqLw=czV}Vr?s)UwQ-`Pk3**|DAyQ!|abrcRZ;F^EQWTVX%q%;gdE> z9q_fBS(~5LAIMspMX{^Zu$1+Xq05wY{hsO#_4L$QsRVA>yav+`p0B zxN}Lm*sLqO>(Hi5w{!Nsa_Rnl_-E}zGrXCkhPsHn|E{74``AfsQS?dR^RpdK#LusI zV0=~^-(mgbhgJX|7aY!W09wabR6tXE#D`ABF23qR0jrkxjtid6u4z60R_Ogj+&MalChROkGKZgl}DgLgdQF0cuS)> zZrk8a3X3cWJHjuk<0bbP`Nx|sWa;71+0`Zs>;;fqvX+Mv@G<~{hP^myBUCk+423{4dJ;|O?scV&+M5RU85%aP0% zYZ=QiQ1Jy*c!5OO?nmqSKKo*?bhVLBW&!WLOIuY!e8z|L5XjcKzl;{!L30twzsm7z zyV@RyzPm@O#8&(E!fkzO?NdAH*jlNqz$5m<5;aME-Ai#ZqD8=-CB`ucx+7|M4kNt&JKELN z+^@OGpFc=mz8K?u{BD1~yGi*1?gyj39gB#^Uu)riGc6{)41wqKM-xlk@TQ+vzruO) zGwusKtPjm^GJ3j%lUXetSl5BT-32R(wg-=o4P0m zi^b0J?XYoI7wpZhEo_kov^=4S+T!9V%Rs~}AJYZnK(e#j$M$M1f5qY7Y$33}L4OWM zkI(q{1^);LP*f;PupdmYcM^i^&03!dO1ko1mB-mWL#oEs>=L=}npgap>aaSm-p0Q{ z=4)^98qMpLJ{3}}xYN82+Y2Lo(TKpR%HOC`IkM7}pz*QdS=W0dac@G<)bqHxZefs}GS-Vh_ z<@yU6fsWR8!ojf%CN7jhH)Ulv0qFq45Wp0DSyj42Y1u-2aq>ZaO#(R8Onim2oKssw zy*R038l2&9msaep3xUXY6mf49^dUQPM076fjc@WJc|Q^S4QpBGmEXADDlAT$cz+p& zBGHF4{r{0q_y(3>pM8OBOajULufDKi{o@O@AENZ3QePuoPwUid@(JD&g^P7TT>;E@ zZMYF_6MiHZ;Wc9s{2#*ezsF%;{q_8n3N#MiK;sbK^KW~irRAB{Tw^B*DU*V}DdUEw zK_O#A^xVQ(bMtZX3@@3EdOCYxY373QWdfO_r=BAKwQ@185s7jzas*rbNTW1Q{jh_+tf6wEV<@bMZ;>r5P*z13y^dou{C`u11Z4OVO?LszZ zTtz2nM+uAcbf{N*l*Fe*DOWnr@cJh6hQmVcYs@kKj~#}EcfowfIq?xWvMPL(zUP9!^i8=Bo@cG5MRC1@tWjRlfDzZU%w3&lbFFH|oINwh z^jFC)L!&?=aj#awNlp8>SEF`nkfHijq_ekk|LDVbFF&&09eVonyu&0))Nj)KGY4VG z;h^}_qeUglpx_1F^sY&208ksK!a53BZZBg-;qds-;u&L$_Y_&vZP|R(VDlhbzyVBeE z?qRl99s}}7c$(FR0|uKuPI64^Trk%>#&gA8ZLmV|X``CYf6n^xB_@9Whk*w;F_=>SL_>9_}PFVfE%)_KB6OTEb z+WwESW3ds+PW@3qW;gui=d6!@&Ey0wX)ULg;lx~@XH*;4t+l{ zXnaaHYMps4ndK1Ao~#Ge7XU@(Y=nRkC_a%mmXSDE2JS?3&*M;n9y&JM=He(pX%QYju zRp@!@y{tK>u`4qG| z{s*on)gLx5^2`1If)LanHvhnNn8&j3nNt7xxJr>I7!-7uBu&({r1S$9m67moHB+o` zHneE`anbCpMD9!yUi*U(qt$qdm-(X))>H85FZ$B3=SzRB5z0;dQvG~5a_U^a6r=T4 zVaN0hqb*lWb+ex0^;;pGN$Jv2ki}l`z-Z5owzJF1Qdv#zkmc5$1y@6KDV^=0tT*MY z&y&SPx_{midiR8}KIqEyW)v{3d%?{8B!k!AyT{7%=F)+1sUtSzZGT~Q)BpVPD9lYpw*Tzr;73)Wz6=>Qj^8PmB>isGv1tLDa3~Spq(m67~q+ z7R!J4xT@k{9SYPvSDW3s@TKv8+m)%B?w!YTdlr?q!)Xof_hayD<(7u=txV3bTLWK$ zh=LtAX6IWxgLvP>pDnQM4Yf@{(Nj;&6|nWG>OM+%{3*!Ge5`Y=S!1GM%SYW=dPrzI z@bvLE{0vrixIcfp?_Yu_#lIa{!C_jO3tRs4$d0(`JqCiJTa(-AvV2l($m(mglVxTb zHOxEO`8i1~?x9;o4x|;2|g7h*be;wfJv1+oWM<+y>k=_BJznEg8#220)x;a6)Vb z5=`6)s)qb)2xLna9w#a?Ez-%sAnGN?P%+h!!-%S!Ey()d-Q;r=C>j9| zAKgVUWGN4_l^%(oH;)W;TpuctCR27kz3^aK>@Wt#ADK0DHd|e{egflAzX6{)Ze9VG zIR=#vM^Ia6>yJEig43k|*c`Wy&x-+Z#XfxV_#XgqS~F#?#*b}GL>^G}1d~r808jw& z+1TQv&ZZr6(wGdinD2`L0YKn%!gyci-np5H!!8_x2r7)^v59nrE8V-kW%!nE7F}to zhQj zUGlfAe$_8bR8EXbn@TP%9*!Ln`GAuXQ)eDvS}BuTU59Mk-xSse)oNw*-B!2SHhP!M z1n_evT%uH;ys&OCNGM5KAUb3j)!W}Cd&8@!#x?)hYnj2qH&vh~|yoT9C~r?IN7cuM)rCGO*VA!oBeg$6nMcW+^?i zq4c3>d%z|FGsCZsl+Dj@1E@NaP-e2eTzvH2|7zqN#u=PX6PDhVXdr{I&(m$VX!9wL zwhD0{L^d$zOvTNMEzM(Q@2o^!!qk?9KA`ihUKK|T`80?8CELxC%b7yz{co5)<^j4R zswzK7rER6OQss1UIr=5=lF#z8fzzeEWhhE?NVm4fW`=vo6~BDC@VU_i`?>MmrK%?k zh$e5C;`@*JN7P*)wt^M&p&@o#xxL{V(Fj`W8f5*n5F^KgG=yk`RVsaK-l@Eq_AG)I z<})n%%=$|aDA$EsO%oXri-jH4-|&d+qRVs#d&>I>!j5n{;6Ed$0$5DuJKjB;9tu;kV1vDZ>MH z4AXDqa#yoH-dI$Vq+a@xe=6}l0n2+$&cywVp1vcYnfyb~wfT~+3V9~Z?x&`09X&<( zR@z#@6+65=NP$wu9sTb_A)HSaOqq||lyl=xLoFJ!6puqKfLWJE)unHN@g`yC7T47+frGE_^K$A7EGyq9Jw!c?@vZbUH2gX}+8J>>td*tP`I4@ySHzY{ys?vF!oaXvY3uGPIGz3+-k+sw0Cnew*&k7ne z^i2fgL*&f;g_u*&2>nz(*(JyiwPz9crs%(hh5Jc@x_x2&aBQdT-}UY@if9t04le$X z3l&eeD21NAv1t432mf3u|4Nwf@dQ|F#KXa}c()g6qMrj4zf~~#qhMl2!X-#Gp$uo2 zV@V&1e$7-KPbY9wvX*eegIRthqYrVUrAcV-NQEJ(e~}y`!K?gL|FuKk{1_!iXM>}L z!DF#8xo_4@Eq7)`he54wE`VMrd&|HStEt~xlP-!#f?Ni*h5ys7Ss}z&*B_) zOCm3S1?tP)Z+m$@?WhKUsVf-C1OF3!h zy!2|KdOZTzr-$l5hI^EXGq)eUJ}KCjfPlb-j{kA*o}Wrx-w)nVA7}YR=bFPM+?xm- z$D~(BaILIuLBw82*mB2c@U344MqGKtFaoA2bYGlcivK1Hh`f-zb3PHoyjS4ql5h22 zg7I*h=**$`8Ld&>l8R(~qKn20Fy-aOS_m$T(sE< zfA#VF3U%zZuy)g$>QOc?R1ao9b+)uT-Y}v3$2XgLNwx+Fk!W=hLPrF5>+Lw0kk^U> zYLk+er7sSnKY`BnwVx8B)Z`n4-9I_)FzhGO-4{V-@C_H%lzDcm)?z;t(k*-!plUc@ zUs;mQFi9=U-&o4j1mwQfN`7MTd$u_CHbJ+fP)&X)YckeGfg;-D;(hx)iO6DFg`4l& z%f5iWxuaM_{?zN{?NwcY`Na>?IPo940QaPNby|=A&_!JS!0Qu9Mf}YX?oX6H(h9Ts zweo|t6RQrk;iJB;^P$&bscwT8!@&sya4`mP!!vP#LQ4C!-odr^3H#pl?hP$B7suCq zZD-hl2!x{i-xJnk2icV^=4ouySEKSL>zm(CSI+Oww=CoGua7bc3ce?;+}bZjU&=UKM)hd}7L@94gEX2-)P@P%YcQzA9M6bv zjR;HA;~Yf?6AZdgrcE=JkJQ#@8!n?masm3FOLB@8(w+lC>d(Vtex^n>g%29acfxuO z8JyKyN3zS0*uLKX~XmS#rCK6=z;`)kYmh`U%*7o zhKZ)+J^1Uq`=fDIm+TM+OFyRy33q5?l385;kg4?i1C6Vqje4$qY#s9KhG`}3p~0{D z5&%2%l3*!eq2F?hO8OQ@P><}YkBq|_pIPPTmCieE^G{r&xdcyfqAh0GF*oR+v-%K4 zHR^umdcRM-OB}!7{_%SOp?+>_z2m)1w5Q}d0@}(~;;`@B%kAh$@+f1@=$cI`svKU% zl*^yaS{Es(o(jhZe9vBg?YJqvegB+mkm-Sn+y8hWnWN*l7o8dmSLVI~djj+H>f_fC zf>+>btsjDJxL_G`8|QZ>HLQxPDj$EDiw?m11}+Vh$L>RV6Z@>IKg^|>yNnmLQf#fy z@5|sPe?+S>;5;WYmOIdO7K9G*tio9jwmRq$X%z6dNsX>K(2%LGh_4 zT&J=YNvtNj-Ek-%rAbtbOTevUM~K=WWQ))O$spD~y!+VS^7t2eT^MI1QI7k{@w}8> z{u1PPxt>J3caU@IcQ7(|^3Z(%YpuzC<=Y>S{&TYh;E4qBnD zUJmTF7=8zJgqt1sQ4yBux`u&S4mCKk>sL|w`!8B)xERz|2t3TI`}&@V_!!uS?v7wi zUllS3^f-TmI3}a1V;zPPCg=m0*g0o3LHY^y27XFxMV?6*5!p7MUwGc*b>@W(?G;ij zqJs?4#ZZr5xB8R4nV}CT{)xqEK`Zq;)g5Rr#b)g`6Z6>dDVne`x@^VZOpfC^bgrB2 zo+8)N6K5y`ow#F4LhFT80vXw8W~KhVI*AN8ZGGzn-FoFwHb4eQT{@{BM=gU7ItUyK zG$Xd78UFl0Gpy+o;ckkJP+!LC-3C{CZ{qYK(LIB!wo2>$>;c3k$e`AniftM-*I&Kg zX2sr>&hyP_#B>INqwB}Py2J6s@&VMujZL$kcwCdHhFg4%d2L7#qAnIEwFIKs8URIa zihEI}<6g;&BvDc4q{>vWB1L7^os7x5sb;E3CKvjGT8+#b6?$P0g^PH=0ShDdB8#+H zXZHD+|Z3_Oo37fMNYM4$Q+u7Ev8{J}ivA?%EJnU6M|blVU!tUVo9)_^Lx6 z#Li&q;Y9c*`%7~o3IY3(CbMpvD$`B^VMlDxxWKjHsKw$*w)bFnof`7N;D^G_+MUsC zk9M}xvPwnYRB826axE~4|aPtU(2)GNkx%urLgl6+NT?t zRgsqhZP8J;@vYs~JQ#9V$Ql)u5yd(*dC{}W#&Q%U0fK+ zyfh#qeQ_U@W$#n8*&+%o>Fb=sbihDDqhNbV0O)W8 znc%J1upTbaE~MWuOb(+rmo`)eCYKIB;J>(EG>FwunpdF z;3IHRsnr+ZZ=TS-4{twsbIeM+0%@V0TNu@#SDSv#3JRh2$vEB1I`NcfQh?`Ba*_F6 zjokr&5$Tc;_)L!0=S{ztr=TBoym{i=c42>2QlE^bp-C00iPwO-AqEwy;YJ$$6R-5Z z1--l}n|Z_KT%`8N%I&iN9V9mz$qOM(LRNr;W{iT{aqVjMp!GAib7v+RS5(vQo91&n z%MdwSedo~#3qYWkhORok7^Hj~+cKCTDv+S=!DgGDIx^x`gp*mLbw!B5B`h@VG?!paB#hRbDY7 z#-Sz@*HpE$>f;Txk46bs^_~r}*xl(%WcJ<;rkliC_Zf_vkao`*{PX?xyZe(!Yh~;m ze0!*u=47qh(G#-AXPBp}ccJ2<>Xk33W9(^wIhN;rV<-2O4v(aIcUWaNsqm0?Wq$c;_lS6lhUmU4PPN|L~{P$?$<0C7TH zfC+j(&@7- zZjxiV#))4#?2$p->zz?)KHr}atFvE_$z(`&}IiL+%A^RxI9{Z?6| zXAq9NFL=ud<>joUC6ebBS?CNkC`M|_Q?sBqj!sZaoE1P=yZ(OSFRUX@S3gtCRrvhN zjRT2UEkL~b@ur|sRttri!-Kg||8FW40;Eih+ZNfz07;xZJYJnn8$JI9mMG0%wX@=C zrUK}*Sp88=_DnX9bdRn*-901NO}M>k z*xUqIt|*Yl7i4_NfE6z_2>hVzZa#Qjm{=pXH0d>$lcxJIkaQO% z1ry1OuVOhU;tieNMJK$b+MMT3Gz3^cD3&0;VZ8%=!d_ilMit{PU1QpbnEa}T0_oK; zQgzyNpZ>d^spj3&FClHa{1shOt-D|H1f){U5a+?ecCg1aS&3|kt~d#A@;l|%N*NHT zvF3ssIW6CPgmbpKN)GP&#G;&sSE`EBOB{tCNA|jBs+-D{;4Sl+Mw;69=s-JEQRc7k zL6`{Cf+xOjVE7-$1E+T(7`+d(qx9(0HIl4o_H(f)$S0?>LCf={(^AZle{Gd4& z`AIC>C3;~tR!vZW9h4V{1ix_BzcNh1B#Vz=hA4?pqDy2rUO>XdKo?(yY+cmKJH>fB z`LL<(R0$JbDZR3F^L`=Zb+3?@=50r{4sm%D-ihA>VYE;q<5i73x=$)U)73g#+xJIO z#7?Tq`tp+uEb8DFs`=e^b&_;vUCVDb(3JPcrA_N6?-n1`#GTflEQi0p)i(-y7skGh z-qO%`6!|*-3xY*^KA|eGT72!fweL~Cni_ok4Ppr1=a4)~wt3s8=FyhCt-8h#$@0r{ zNmBX5;lovTg0#8uj^xNf%2b9T5tP&9iISY7>#k-WvyHs?<{Xwg=C~S+CcH_R?B&}i zePC3!2v;yQY4hjJ469^O+&c9;?2bxq9VI(f(RVbE)z%ACicqNl3FN~dv?Og9lKO&b z$#e;uEyqUgWVMq3m5j1d`|c8gGDr5!vYKyHQSkWm|L=8pa5cH%6Z zfTLM`yDs-n=!Y7L_#)co?k>4AqO?!-2YEG>w`L5hG zr<2WI5C8T|{3bCwGN;EFhGcYBq~tB6gwa5${;SQLwoU#ID6GgXLEFABSIZg4a($}X zEy~m)UZ7l`L9MbC>5A$Sk(Prz=Q>xmHdB@57={?^DzTzL$M+?Mh|AJ$@7*42&rxY| zX$@YbvEwmfBXUs@MD%cf8N=@>+<4I&xi!PLgiAHPSuaSfcbqO}v#4n3b0i&VtW~p< zXf``&@DOALSW_t%+V#fT7265EZ~2ZC#_c;gZFl3Rm7l8gEnbSPB$w)Pb}jE4=Ce73 zu}C66b!k5H55^w$tMRFH%ipD-4&8qxrhV`*Q4o*i3qM7W9zwH#%rrCYPpGgFPW2~P z@uJvPxX7}6?V8Ua>G`WDi&3l7$VCfrB5K5uh8C3&5zDYGqe!}<9uLYzj;drVYT--& zdZyN-OM2__{t63Ds*J3)nWp3FY3pf5T9qnvG?wyFe2p@UZ5w9M%N=s?f^7t;_FiSA z$DGk>KDyPY$ox_1VgO-!s&rI(N@)?R-*KVRi$fQgPXRb7U3u6(@iMjkN@KuAOmyB@ zbk%rOrgS)9-@U|$ZTHa`hum0l-lEtIDu!FzxB%RE9eUtwd9{=CTKhi1$IMXzdGZ5rUulh|8PMvLE$P6S#hUM{~HtJj;$ocK%V^*(I;7%d1egH&V?g)v6F?bdGKxeWvFQ57V4FqQ){mmvmkB97H|98?A;W)ec8A-g@ojn zk2vw|jKGl7CZJe>kl5v03D0s1NB>2;2wCEF^bc3x3q}?JNVBT9yU0nR`uTBQe8xg~ zYm!Q*vt>ytiFr{giZziNm&g@p#aX9wZH=V#D!x+L#W50!p0tng-odg#awytoo9T^8 z+a|ToMj|y{s8k#UpHd2L9f%s8LdG?!iu)_%h6{!B%DsXWnddyZT!`h|qoyzwd$>Uk z*CiqD+9Ps2cQ?{BRFOvJ_;eQ+Y)mtQ7S(JuoWdyn6IH>y_oi$l?b@E*XWY$7ebT8# zKOsFo&_-l+Mha~WTh^j8<3Z-*N*BMpohnA%wJQudoFZ`@W~v zXU&<~H=Ca|M}55rf2AX*%hOf#rX`I_*B^L6nBGoDcb?_fYF{=9RqZL31~pC9kGjww z$Tkt=&K`SS<3IRiaZIC}-4Tho_`R^~5UA*b@4nhqS>C@47EGy#qb37>?j>ZQVX6cr z&tcXK0KF#j`vhC;oro~!QI(fY?`d)(M7%I6!sVoe<31W>np!ovWC>#?Mh&X|=+_E2 zQJJi=#8QOW%o*RI?{rMk<;mA&Bheus%3NC6*Og_V=a0$pf8)T@<5=cWy8kN6e6mZs zaP~gOKPcoC_XZnmYDdqRxxwo}D5Y=7)O5x@wx3%Og|V}6<;vV#7L#4 zv+f|uL(<97F5HFvT8}tqH=ZKJ^8~k8F8|$lSeG!GlGU!Zc#$YmVjMGkSzt7q*&zQ? z({9lu_)aMso^Lc{_)GU1m4{VqVR0^0@u<<6*KF%6@o{Ej%AjpEx|#_6HR8n+p*JaM zW`#|G{_2vpiL~scr7q&dBT%gvm0KZxd%~U(n;iTZ+(LEQ*Y6DDz3Q4g@4o$dJNvUd zgLG`n2kV?Q{=`kmw<^vuAkj{x-B;S@K;(PJC^mdqx(3p;a;59p-E+`)b8X+9t>OB~ zrE}2zU3J8fxz%0FZHw|#FnPAxt^HE7X@}CHO6qW8h2k%lNT&xznrAh!C(`P?Nf}AB zXLC|=yHzatRi`*I;;0iltn^^nx}o+Z&35MBr!OlMHd|emIty7<*2WDc-uYZ8UlqtX zb;a<&ulZ^KesoLvIzx zR0cC4!ZOqv2?v>v5nnz1ieqHP6%tq`c~_hz-l(}| zBi9kf2-2S_?6W<}81K6XiuuQUT#hto^TV2>q3yadh{JT}IKv&MDDz1<@^6e3tIdSI zbQu6ruN0o(kp4XNQ#cu&3^0p%J&Sd zPN?1f%6T*@F}O-whnQYz;7E0rY$PX$Yui9Pd%roGXM!p?<_+`Nr*hXqtu6P!B|?_T zkNZ3)NTq{O6fQ;w>em`b)1-`Mm7ydqNHBGbpaUccyhD-%(WTNQ<7nkcE*MAaPVGdr z@L(r(f^-uQe+d{U$wS-zIweC#qEyq~nX(s|9wsAAN0hy3Y$b-H+n2^Jcb4W3^u@jG zV}s#Xby+<&ePZf*ATuGor0A+0A&U;Prh{8j8&xafPYdld}=lXFsiYzI&@ANo3Fz zh}}~%%zY742XahMMWovi6)0sY;Jcl_{i^eoyN$o?9r7Wsc^T@qSW4vdq0ZN<$(J^Q z5;mMWTB=b@M zNl^!%Q)8&24qKxrwnEaj^}r5np3P4@?B3uf5-V2i<%uwHE9{7d(tgZ~+B)n-YOC=^ zU<~P{?&{k(lLnn{B^xDOj$mlRbHmqn)C0EFCju}J8AKYPI!ryo&1Kz5Tb@RG<9vZqYAiajF%IV@TxafKdBgKcO8t*|!E;6#7%_dd>t}e)HCrF=ydpyfUKWm4+ZQ$k?^71nsn{1Fe8I77}Tj z4Ps0vU(D)S=@2UwX=&TLYI}Tr6BFOAph0@HY9p5$#K4`~>_zePD#!XqoN@PP!tid# z<_k@rxK-O(yH#wCVVZP&=c`$IF)@#|J(-qeY?amPGIm}$VMzP@jrGmm z!L5KP>-7NqlQ@0oivU;d&WkB(@WUs*hN^jvMsvm9XZ1Xn>K(L~>AcM$qllpeA6iXG z*U6f)GS|*Pa;)A zoMQN9B6atTCz_E!d&XV{^VMj$ zxm%KRG+Ye(#l7oL1TzFLC+UoU&k^%I2fZ20_EJkHMelaO&iA|EF}CEKi1X3AU;CbW zsUwr0@ACC+a%`xmAFHdZ+V6hPXuz`6xbP_dopegQXte^D4U$9_;LSFv#{bIiVXQww z@-`*c`1RN94-%1^;TzG%KfYHP4%kEMT%g`9q@5S5vnFC;tIY^%D1BKx4%G5g@)Th; z${Rxah(|S>kIXUiAr+c4_8WkkQ)Do@DCEyB(gh?Jo2ETG2Mky{Bl0QRGCmjk1zdtqnBi z;+^r4VNN?o{W9UWGne)B47@tHlWQBNy9jjJ)k{@te8(@*eE*4UhFWh)(T8U5Npg7hIM&~BO-@&bq;p?f7c z%u|VMN2U(-ggXT+bdBgSx;M5T!Zy*6Y$XdCBT3rBbC>-rCLP%Ixf{!c$@yMkAx`b! zF`6UpvLiYn%kr)1B;xhE2g;`iaNwoXbfZ!@!)4RR@U`rL7_I~P3Tu}$hjO?E3uXop z9QDy1d+O=&4Tcw$NiUr^(~W7+vPlzBM6js-2PaYiN7IqCydnZQIv3syz5aBXz@{3L z$g+CNWrw|%uN8MIO-p-Yzy&i3%gz;dOuZ3CB@JL6{^>Nistc_1Aby=WQrVQs_z}9B zfpSHb63pga@KrIp{gHMBeA&|HS>-?*HTeM6x;H7c=F4l<**I42NRBPrVUj>)0gV}< z+L_aNV06?sBv0_5y0JZNoP&TP?PcbvxoLc5b3Q`oF@xMT-17(1%kPp}UmWbxSj>Zsv0n19SL zAi}f4Ro>LPKrin|N0sJNzyQ`Pw51RRx)G?-ED;V8kSFDkUK~_>8bPJyo;|a)x;N#P z<<%;|0?Ttx@#NiXs^kYh51TpV@Pr8}2aNZZ5r?61n_*=`wSrw_FF7-eI`D~VsJl9_rAvOtO3l?Y z6z3f<7qjZ2uxjhz81+cl;a1ti?LedU-gtv9Mru=#YUPN>+K8VZ_u(9x@W=BQH%Cav z(i^w9hTw(pW6HJy(rRO?tc0iK%G zp>)^+(T6Tj{(a)XdgUJ;%o}Tsp@@G#-Kz<_|Bbpo6yHVt%r?a+OmYg-{c-8?H|(5F zg#=HI4Rw>_c>uM=Alye7iUi6sL+LAI=>Gr4{S<>6cIaU8#I~W3+m1w2X`y;*<`3?3 zG&KRp-Sz^V(iZf3m3?PPa`HdgI-!0 z%MV8vcMQqe9X>CZVQZi0q!`4b^6n^KdqVpER9Mnm3~n?`ku1 zy{-=;wF8IIXg;LVf_bsiZ1=U+1JrD)EBp4YSGON#pIb&Pf~_2l%_V#NP;0`K8-zId9Gxx7;e z^$sF=Cvf<|-*hTN-8zT2T#zIWNx00x^9wDX)v5W;#!m378jr)~y`A;Ke}gsr7gK6@ zwCSX2Q}JdC_8oGgesB#K-0kfLolN<&L7T)ZEpgk>B(FZX0hO^+F4`s-6kkaw^A87onQ14$sJ=Y@7J7t}GymLP+Z6l&#Da7{t?HH}q8t%DD)ahteh zx+g;eGGPA6%f$V@?>EN-oj6&4ibwwf@FT0$X88V9Tg^H3{a)96ugiAL z5B`qKC(Qi-C!&YZ4&I^N1mzNhnY~VqeKVQMQ@0|jl_B^k7wKc~ODl@PrMW-4UgZ}q z;}S8#{Jl!%I292$rT=-;enKKO{v>;&(W-7H)}m&F%~w2SXI92iUN^mue$DH1eYb>s zFqXcqcAMNCrP0CZ4B_-LZiguE-{6No)g>+g)^1%e{4dl}BCL-zo`ISf^*4L{U6<#h zPdXI&pY8M|25qHBeHeq!tLX93@za47r@L8Ue^EyM@0*K@*MDNvDTq|{zq-PN{|Kp+ zb+u8b$WM6X_g3x&L=8%b@^BHgA|Y;(#2{T4;|sB!jW@4Gh&1N;$QAxgK@Fq%)u!iP zopK#WjYeQA6c%1KRVgF)feH3}4BbA>%G{tuV%e$sZkI#MLs{R(p{1cM{FG>sN7F%N zwJM;3&tq}PEjhi$nkTBel&z|4n|@b$bC!F(A-}-p_z$I@M?q>yW&M%dfC6$<&C9=6 z`WW{2(EhTD{@WY8qT~p0|HBX!Je>J|>yPYiEVuJL0k6?M3(_|@AC0v$I%w|kx;#ew zf8Ypl=v>8Lu>I+f8TKT9A-UG92}?h~{g#%na*uQiD3Y#6oP_(9r74`cR@84bYlI<4 zS@5SB4l?H#A5l5jaWN}hcj$P@9ey>#aU&Nt0AKb(tMwxgmCdkmfePUW0~1~$i(nd(v`{ ztc%ZjYDP!V3;f+guULN4Wz@nWxdH`bxth0gRFK0Ai zX_1BzaNXz(4NgM$%aG#u5E)uyM!Q%Q&n_PqE+PpRe_xRM!4)YZq+c-Y)_LV?Z{1P8 zbI9uI9Y#f4M)C;6xWPz2JnVz}b-_5u6H69}^&-F9cujF(Bo#i@O+k;zhRSkRI&ieL zs4|%i^B)dQ$nM&=zr3B0zqkpmjH(*+&xszrZw;W*0 zlNaUc0ZWt+odroNKS0>MxJ)pZ_x5P)3#^X1S?)>2|4J)d{ndxz@bsZPji}BL<@q6r zK1L}7ar)iUd*W|=FIT%PWnUUPj|rYTC}(PT4sSd@G@Wec)DUl#%aXPZ54)#6on+1H z4}5A2!X+dfLCTwpvNsB+)|)RpxryFk6j0`gJ{I^UCRkyr_r1fSb`err-jX|CXXTKg zHLsl15~l>-sh^rwvJAAN)T->9MuU`tn!CkZg0!#3gcX*k)h}F1gB(hur2s}Et?$dP z*i>$~f@GoUD#wPed9>f(30WdI44l+Z_eNN)*l%MMHX0n!3bFK#&S`kBh;EnT8-uwKD*#e7JWdzl@}0oQjV-13>OFB~}_C%4+nya-wE zwaf2w6p+qo!6L1t+i(gy<+7Y>_u03joV$^a*GNfSHb#yu?dJ9l8$%}p_MsP$)u^`F z-bD%<0-hADh|^QX8+$sIeWM?z$9p%T#m0nYII5O)(e`1_#&B2uXfSAmr0;vG{Jc(L&#okOb zlks&Wy4XLx0uxt~r+K`6SSNwd(?o4-1e5Z#WBt0qO^m}Zy~!Qr$`esl5|c+9*v7MB z&pNlxq%t1cKeQ<4G{+#TV|4KOH0++ni8y#q(0d1DkW!-Y`!#4=Y5k=t6u!GNZ6ICE z^=Z_0ud~t8oCdjDY}0Ndw8_98j{36AXyDtpg}6_5L)#QKn6$#mQ@Dk@Rn1r+cO?OU z-#5VQCW+YT?%QU4Fue0eiW?6uFl!X&bDbLMhDyl}Z8AUs8+n|>=i)S^#E#$J46sQ; z2ATYS^#>c47At%KSNnskeS}NV*CI#k;?$H*ept3pDY^PtpUC9mN_ON(qCvvG1PBQP zGhRP=g^06*c|{;?SGe|vBXnjb=d!t9C8|dWe`?zK+@7Uwo*YMEkjcLCrH}I}vrr?% z-Ud*<>GZFNH<(q5qG(%pN}tTM2^c<`Fx?Llck*4VdZTV*d#TPO)+fg_f;zic2YP%s zAJ-tLK4*o)HvE2OJl9$V)UdMoXd`Am&Y-x;;J)fzn}m&rBxTYXc*hy%Hy4i427*$% zPooox6cTEK9e*74ZkBVFt_8}Bab0-g zQ`IfI?^Pla>A=98Z1NcIavZ+;Vb`--O6g?+&qmiW-+&fR}_oIR$Hws8yqQ~x@8 zYYY-yAiez+)43#z=2=5yDz6Z)4v91XbbDW|HK~wrN_4~*XrrvI=%izq*;Q#33WrT* z_fv_z*lGE?xP3Ie?t12qWPXw>vgA{Mt~TuvcfVFLi8@eYecwEPNjB-D{)Lb_fsK88 z3lm`XttSXwgpx6J!dE8>d1Ua)NA?*w^!$7=omf(~Fdwvryq#qWs5{$GX!*%{%dJMe zeM|rVhL?zq_3y35oZr=Wv`@5=q|TO*mFV6EBl?a9VS!FyPm`6@JXb9xJ~(jcBIb>E zA`G@Ar$J=uheX^I%-3Sv9MD}``n5ZCfUU1!?%6W#a7-P&zCYhL?d1*UMAf>VOTI~O zNRQMzs%qC+?ZeoRE^-S$&p$dT$%wASN^eD@-D`<$O$ILEq{b^%&I|&K?ftr)l}CSj7v)rb z2+~b$IMkWszsK4#4cqR=)6H%pIF*Qt#wwH}Dub-Y)3~F>M*?O9?rRmA-_Psoqn5RH^m5^CJ6^m-TTu zb9Tc)Zy_ zA&n&)*7IfQp9Z(4nQ;o7ruJPb+gWW;RP1GiG>r~CP&UcCKEgPQPWLOkc&)nfxu4g9l9Pjn4X7_nmB^6P=a*Zr!`a1y_a6VVVvwO?~Rkv)Kp zDz9Xs(PF7mi>?N{cL64plPx#i9 z1Za_w5`h2}{92xZI2swd!rIp2lJTkXugh@xhS~>v$cc24YqQPbL-jOb5_9Pkv!XkJ zQi|bb+r$)9HH!l=qDDO`hq|e6aar8rWv$X=*9{n&ma>m)(?eNkRHRLnua{Nm)jn68 z3&O`EXy0_nt9(S>Ju<%w1X)I*8~sFjd;g7eWR#&`MgQ$;pR7# z0PHUll4jru9Y<(y^_jkUDi!sGH?%%dW~riQt><47v<_|vPd27-uKAaZq{R#K!K5Y< zG^WqBT{TDX5ZYz#Em zJ_ltS=PCJp9W*rg3h&IXyQ=#`Y$I6)bMY59eJ~5vHA{bXo?F5zA3}IB6|7^_J$@Nb z>xY~?LtTxz?w2vHuS6{AiyfGf&ZH|#*>0{wIug!Aoh2K~S@=!#ImzT=-ehV{k*MtO zNg-mUeFf;DAIo(U7uUmiv(7)oHddEb;2lY0Jb-Pzz;{Qc7l;Xt9&6lI1WRBe)yo3w z@jG|*#qDD^^tpV2VAn9#vcCN3HkObjhcaBX`Jgf~!0aHFCNkl+)EPPT4?LxeuQ~42 zIoZ{|^3-U(g?8LKlS=aCw9#ymSt)Eyu-f%id?Ie|Uy6?i(}*|OGg|O4`zOe85@QCU z$kwFN*)LSzq~FUsD@br*7=A)H9fr?kgc2`YADSkT1SdMU3Azz?xzdxK932aBYdROUXo$dsL>Rj7UU>G$Dhrl`2Xi(H-^X>2!a=3rEgrhieX8X1WY z#r#a@c5%~&(0jxz;Gy)w!9FPRs zNp-^&IlAb?n>X?vw`Yozj|@{9S8t_GXBu!TgHW+ z9;gGVTtuVDN0jHql!D3D-Ieqt7f5)Cm3S$#>^_4|h-pf3V$svVn^42dC~p^qolSB@ zTx=dhtdkmI-1gq9aF>t5@bE}Din+e(5#&fNYZw|~AIdYap(fSgh(%TJLAv>-p(Vz{ z%&XL$Ak?^n>?*ytRj6wZ^2+^1!u$(hb%Cp3a&HQ%u1`GoN*y9vA;scP|BGx228H`PaKD(7-_Oa&4c#{bAh%!<<==_NhY0~EpTEU`7lI<^L zAuo#~`Q?yqa(b_j`w74oX?nAtXkFSfx!>~KBiN4me2rkT9t0`h8|77ML*YB+JV!n+ z@Lr`FV6AtpSZxq267@OU?WQp~^zn-R{4miWh_R20d3uD-F_VW}?#KI$c%CaQ_;yyL zS%}n@IC$ZUe>)azopRB>Q*H+u-efE>Fy1~ZDIq_OcC>WyV`!Mj%ARPsQchW&;;89x zz4@#TOl~ozNQCk@gMfrANJK8&l4|+}b?|TiWlt+c6mvyh@Qz$D7cKJR)5!cCXiW+^ zQBt=eE|oM|#3Idi`~btv#&|83^w$T7J+bm6H&q{=n-Y$iCLV( z5<=LV_g3@mSEuOh5354&)XuT`af1EhERVh~qutKFy@CGfM<7h5Vb5@NH~*?eIvZ!B zQN-J1DZDcsS?)))y>C|uXmof-d(UpmvVKWD2|=z(bq>)WdQlm!?x)I9 z!pddXAWNiuY@D{W5je);xMgK1Xw1IE^s2;`FiO?Bj=f1__yij`h_uHzMlYO|t&*Bz z^kVPrey{KX;WA;zA`TkkPivzJo9r=NA#PR8-QW|f+aQ&8?|(iDcv=)cZhqJ&4?nfW zisT%l!ac2E)p96Cidq(w*mlHqIb>g&>0RWfw~mxyDb7A3*9oY0=d%0C6N#UiicOPP ztMZ;dH&cc>29V*;^@_HBgq5Sw-E6jG2?!xUPy1G-S`?r66m3pX&xSr+xMoci6dBN- zsDLK)EFGeB>`^~oNus)1*oNf9MWX$*Mo)F)bxMG94k#J$st037x~s)7W??UX6RP~Y zGac@&n$q>t;~V{bpXa_j+wiw?$7yz{Rp!X%K?0Bj+i1^>^hIInhUaH6tQn{1@MIa!4`kBG}7vtIsPx4bQb zBkKsX1|J!d*qbZyn}mq6^~s;s`%HtTb@@i?lZq2?bu}hq~Yq64ft3?4tp2&su zEgFMe#wogo_C1{T4NY7=;%`%luh6nIvSrs9$4_`dwG{Pm2P;sUr}v*rIIKzm=<~jL zq?I-EzHL#O1)5wWY|(<&qP5oTW=c(YmmGDbtDXw=o{^7u!_@I(dugMs4PoPUuC(BD zHE)MHgbsA!cpdiqs;;wb7*k1C$0dKPTF29s#FU~V> z>Mrdf`3CEXqvSrau_9>iCS!z-D!JJoXdR#L6dN zkz?yE&eZCilMl~|CrG;H%sQ#og=Egb7V&G*bwl3`%+m>tMVKLqcyI8gQIyUR#Po|n}#L$;@uFQnl_SF+} zjebPu=@GR2V>y6@qLza5w;_bcUdSn2xRG;NKXz@GpD$UQC2Bj(jXBSWEsZUwA534L zfg^KkZCo5Lf=xl1(+N9s3nooZD8HvV&c58@yZt5GD}zf-j@YBCN|S#7K4XY5HVcM^ zaH^NT9C=V6GmZ>0)qgU>haC3`Y10(GHm02vE5S42iu`jnmr;m1iurNgT8$rUbAf`A zk^0*{b-yyt)Z{!HODtWp`cq3d@*m`~O?QLFA_cYg^!SmU6`bA#B6hL@#@jC35<-j0VZk0KgB4$acNI$G0IH@!^{K^ z!?}$aZY0KWczU%ZCbvybFW|!-Jp-dc@;F4e&J38fx@MfR-8+O*ia)&Y2^of6Jm46( z&bA~Re5;6tXB=sl_j5`f9xf?btCM2lNt#@6THn}FaCwG%Ms#KNQ)%;=#tcZ3&J=P# zgJ*?TgeXWeVPZ_)sj-w&vmbm$33_l*vre-)pX)z0XLFn9@xV#1Q)Ku?9EMdzD>Q?t z=VD{izGr{ok{NY&7SIay2-Rorc(a~omIDDVl^RpVRgAY_EtyRPX54A86c6rpw$Fl8 z>=1^IuCNQ{8*ZvJvnZ{fQn9@eb6 z4URkab71Db%7#1B8PMrfnl^kBj>SR{{@;@QOTrp_b?>wGE<A5F6)gx)c?VSjxDy@FjIg`|JoX7i$pD5Cz z?5xh9?N#Lf!sf2?a(6&&RQc8TqoA9P*S4o`q6J9dpOn^pN%$>X422@^Fx31H^1)vP z-iKxXMn%}Xlf|E5mJq1)3xOv;DFU$`USoVKLJX@MJIl#9pncmRf^044JIUen^sh=& z{^xnu<-w-sCP>i<5E@~JB6`ErLwrF;KQf(1;uy>!rc69o+0}gZZuaqtP=m|C)i(Vh z`;=fAufD28S!(mhfvrf(#7G6;64|dems(U7i@j@H&sS6DR{s>%HQ^KJX^NI*x*88z zvFa#qxfYx18A6?_2wX95;U310lKz(7QZ2L<;U3Xz+$$$YY|Vy%)UmchSZZwf6zPHADBqSIVx`h065c1#IMmo7mr4U5Vc}O7pA) z2p2BD|CYWTHFGH*{L43G)L|UUo5IHjJLLa+5&wj6hqI>Z6#x*L(wHJz&%{G*0igRM zqD{imil?WRlM#p(zJ&QLbwM{O-m4tZ!NTL^G15s~^~MT6p}fV0A)sQ6XUF-eNy}@6 zeGR2%4bh6r)xg^DfpmFpoE0)xP87+$5l{mL7VvE^|8hl&xJ=hOMc$0Ig)46zhtN^J z3nY-&)zkmha{MP%*Z*dvby}Z47@7|)flRRfU?pWZIB1GUVvxY@7B9oP?~)zP`Ni>i~qT`exFtj}%itqqLbm+HJ=h82m&@(f>o z0`0zZJdm-yMC(uxm)K}ZojR6#g}t~H{^$BB4*ib$uU_5b#;$k#^`lS{!VU)w^**S- z+v6DZJ%VYdESem;Cot%@Haaj{5Nxv`N1@`zoGebqn9O=go>gb`wY@VUD9||`<{0O=1|Ywz{y}z?&$AFA z{q^RuHx!7_P#6IKwne%!4#AYVvsY^`ILfHU(0b9gV#bd@t+Zv66cG?jIyt|0o0_0$8>BHM>p2S0pImo@hS}McmAQ>JJStO8Jp~ zry-JlM{}$SQDke3FD<*)o*Dm*Lhv%(Sj6~4#;$g0W%nBv#t;O zwbXYWXP0%ktsnkg`92Ze@(cZ}K~^UzsFJtW>f{Y9_4V%ej=abYZE8!6u6o+~{h<*z zD#YsyNq>^@M@4@Zqo=v28;y*HsynZIxwQt_G?XvwD!l)1g3-shu^0Y-skP4i z!G!%@Rido9k3g?9&^iy%Pa@>UUzwn8Bn0k&$7d#q3ADxcEAoZBiai=as`wXI7&>lb zXKOuiDQ(orMrFaMQ>E%hLW9g+YF?r}@R{uw1w z{ag1FYa^G1rPb-NE45!^7R&9&2&d3=a#mK8}H*)mVEUXyW~W}%}%#9 z;;pu7&6ls(F~FTmH6|#fv@TglwLo!T8ZC3PHtJdVY)9~Q@7kJG zj9)M?BpI@0zAhFtRROQiLB6w2&H?{p&ilZL=5CSJ{dt7jx$eqlLbw+;!S(V87h&aL zuoHr?Qa1x0JMr=X&HomuWW%xUefj7lASh3tC1hd|_s432N99&ab7J{pD8jk>R+ zLmukLd}3vPO9)c)*B6fduPc;wi64L1YkPQ1o(X>o8+C-1ddq?U?d+J^ z_eDPD3ZJz7VNfQ}qq<5?u?oqJT~e18Zwp-0^Ua(^>*tTsSCegcmk-<}eHE4CIs%UU zVCfvc3%-?%OSJkz(pQGS)#%dIRBqQ93|2(J;)^jMX~e~|)}*2yr3yvddJzgYX~s5qK_O$Y=MoZucH zxVuB}5ZoPtySo$I-QC@7aCdiSaCaG8_D#OMdGFrcz54yrr>6SMOm|Inotocc-JUvh ziV8eu9~!Fmh}HaysMYZkh!s#+tK;}sL)}pHIQvh-L?yHQpLp)&j1>dtF#x{x;I=GU zQH`Rw69mNC`^o!TrY&+isO7aeJe}KExLxljJZtk3DMPOOn5oyV(=bOOKfG6QVUr48o(c7Cef9V}MI-rajhQux+W+lLeUNnm7&E<59D}vRW-fo$P6wc7_|TGTK}l zo13XQpTdtMp86TLQ*0DGD0!!@#n2@G%L|;-!2}8BbyVvacdAaBd3T&x z?7x~L-83Iw5Qsjnd=$GkY%;9-wm9dFGu61e(O?i*la4gT_I{Ol{mR-7;>A5S59)Ut z_OQU5Oz2t?oNWxiy-Fl{EgAFclf*X-TM!1uaxW9iV}o>5vW=KlLm1qg<%Zdg0%r@7 zYpov7T}f7h`e`88_z+r7gN7XiKD9SREHwDs_UCLULs$xJCq$~Nv+m?P6nLlZsbd4+ znLZSo1TtUbiq)Diz_pIsjP#kM2ctP%9=Vk5i~SRRf?uop2K;!p8C~Y06I{MT z8yq5~5$ggW(#mqm5`M(2RsW*duq3`nr(IHw+2yVDA|Z2MQ+*d%@{z9?FX1`U@8*8E z(r#AS8iuUMoMq$q)A3>PMG5%GWM^$JSIm`EnHo+6y|%HK&k*>t`i9 z(o)Q)Mm}$F+-+91J14El!e*Gt#UN@vj8$LC2i1-#{F0ztPP%NWvd0*5 z6u5tmQVhbey8GOLb5it@nE_r-aK1J&aZAxL}b^@1#Zy5Cfjk+z18ciSP{;| zAdXvGZN|&kNthEJe-5+nE4t4Ft)VEErz8vuQ#}m(ilZC#Aa(3TLx(Wfu_{hZAufwKMjKsDnx%^9m{MK~FgDq3 zr7(3F?^L74<&3S{M5J>u;!sZg&#%Vh4;p0g?{M)HKa>)oQUm1=~U zh^fZAt93b9%qjYQF89lG9Z&4E(Drcp>nWx3nqPQTdIwluzp~l>vb_fZSU9hKiyL8} zOy989V=1*mIX;%>o)D=tJpzh15$&Vh+ibuf1ObuwxF;9pW4jWe8bt+KzE`fgF+G>Pi(e+HkG3cvtf8gxrmd=3!&I)lu1cGf zG>uuZ5If0N!+(?`&^sYI7N{1XsTYY}CO3-f*GQ1qjZA~glhm2l*vCSYlkk--Wj~#x zmhL1FKbmf~IoOH&@{&YI5g>W71FM|uxKY^yitt97$PcjVeV3My>IM3XxI#o%@P}#D zG>1Q+pAy48oekSb}|IVy75NEQ;u1)1vS=& zkUxIY`pJxSKq8V?gFY-+Ude0A-W0S=_5KN92gYJ*?^$J=Yzc4)!g@jh_3atSUrP8np8LxP^$Z4(EjSC8xP_u@CT zZrPSOh1?dz<2afsiRQ{T4WF~3VUii&s3c5{cN&&R$hH%wIPIj`B{?>|^2i%5@)geWRmJ=kt!;xSQCDH znrpF2bLKeP;6koA#QLh$&)o5ep}b)X!J@YK{J8!3ot~jVspQQ;N9EhE!Wkq1P7M0X zpS|dWsp|}s&%w^L;2c49`ErS{sey4$ULby$g_^Qdn75D#ExCW5@b}L?U*sxZkYB2K zK&Q(ah*b;47M<1mA8WPFHwIGI@R;a1Nkrh~iXsvPpp6N#Gz$^yL|fQHTMA~xkGi!3 zcihy&<+<1k1?%x7B9qi+}oJ-dg7*AL`2F`!g zXzE?0s$&;4>V40H5!B+ujH{#*Zpe->iT^PkD9%gl#$L9wJr5f>CqwQKk>D<}I!!mq zT0t2(mw&KX?PQoJDft+(l;2etnH#P(!sEp2D|QpeqsKDF%gyX&%%=l2HEwn*d|E77 zWzZI3>F7$`jVjDW9qKihYzPXMAFF!g)OaE*G04$b7G0C3A4_waeLj2N@NF%{v_-GT zb-;LK&46ve&yxD5<$R4*HBGr?V}=l$+Y(?ADn8?iEhD>`DAixNrisY6t_lNpD+K%K zj&ZkrF#5_yN<VdC%}nL%$1X19+K=p4Ruyt6m8|7X{Z`lJ`{iZ_z58R3wS%%^(E6_rpNr-O zHSOdXO8ak!r|Gn*MK3s%tkjzua*tII*U1w0&FvvsWZ~tDYrCnedaG@3TkxInLeve}#WhkqX*U<;cMYM@Sr;rwrunOhg|wMXdcdMkx$l zBb*?7QJK=5lN{~@yEz}K$-HM|v00}Nsh=UL1(%;{d$VN&iZzlJV^N4im)x&%}{r&cp7b}-MO zYi&wTbZXN$lh^20H8Vy*I+*Hrem-nelwq9uEQv>yN}l(Cmk#gC+yPOm6Se0QHu8Cj zw*=75^%1~$p3CK>j+PKdjztS~R) zKO%R|@3q=#{wxoPKv^WHZgLoH%^~V8(dfDy>ur= zh!8v67i+ubu0QYT$Zn+?Zprzl972xcj+e!Ckxv4< zFJi^@O3S>Sn~#RbRH^+;De%Wnj`B%rPHr*!SX*$9pVne(~Xv4%v(|7BrY%r`?K4i+*7OY8R53Wd?u zC+KvswkG^Efn>KVs$+WSb)!q;Ct3haq6KB6F}m5OyBKwY+-# zzaS2SfvKifkIWf&48(8MU&G$Ra` zcLytPgGj?q4Zm_=D_j42dSH*zXRO~i*dg^M#h=*NwHh&gOsJfTV@X@TqR{3!wQRXl z0c4vQE*A}D1QR4Q7R?~9^WEHJeNMk_HW~-(tz57ro3m+$t@Zz6)x;b(O?;s(vI66d zTqajIIK6zhDnrL7T$84Ob)iVNK)@Gmejnv=eoYU_(25~!)B)LLP;+7Yv?;;yXor*! zt{yl@6X7}=Zo$*w>~iNi&k^22~EW~5i(j!bX_*c{eL!xt&;eDV=su}O~u0hcS_x)|0sz>!(e%w z|Bv@1$QG@Iv;akd+!p~!*pHXE1hx`<_Lm|D8+m%22Q~JW|8bD(f40-YXn)J@ZRQzW zIw@Bu99NWUxaaa67Uk0{`(nG$R0c&=AJo$mo)W9}l7h|?ZVP>FJ!nPVic}|a5xb$< zOlfpu#SBrrU}eW7_hgI|zj1+x`ao4Cx)U=B&ZQGZ$z2ePC@POElYMvXGIjk19xGlC~G&Qn(7S zw#Ea4+HW#j|F>~n;jwn7PtEe47?DXtqCZjH)bn+CdLVy+vP%r2O6fyY-Jeodxbz#^ z+iic=Yw|Dy594LoMOXtF?03U3+nXKP5bp+0m}VzLbt>7a$F>n~NgAZgJzLeh`m@e| zi#usrlDH!qUL^k-OXa`D65#efi#UCA!1y&5AKvw~(ft1undr^oa!6%a0y*L5v)c_v zjNc97P>>1Jw?!ikNqqUfK;I$%upj?BW%)n83Ue+FjLfI>J%DrXI}%fU_C;Crh{Pm4 zt4i$nQ*qSO6(zp8s(3HL`q{ht60HE4h9gAsO3JpWV}{;c6@4mfrn zV`=QE@;|H4gneKG$|tUrL{7azdZ8nCb6iI;9mR#R5kW72E8VT~O!x)a`>?s7~1{W?pZQbMEy@{4}Be;a$Ydv3esF;_;DM5|jRXf!&MA%up z_Md>$F^bPj*R4ixT$cX~ zwZ8xLFMAJ&lJ8=nKmM=`HK|lgaiDTW@(VrvqwmwV`X(Dl0`1_5F{FEskt>#jtRzM2;};_{8&421j5b0UL6IX zS?;aC3?lX)fnEtdPb@hi-MQ+7Tru?{r_(KFXFj@NQs7)*VmvVr)O@;ZrTry&GeHW! zr{9<=f}NQPCh#ZsyPW!ZV1WV8rUiG=k83s8nvd2>(n?Sl2UrhFm-~tw9yEhQLOY^) zMbWn&Bz1u$n^fP}=AHb;h1fx0Ryw<^zK% z#gQb(hT1&mIv5*FbtT7VRI# z7!W%{@}0o+A{!vG!x2MF9HAq zL}(G4k_rxGg9mD~Dqf<4)*h9RAX=N8OSfn?p@q3fBKd%?zZfi#OAPJy_dOk5h{G1a?BV9$e&|G+}{=n<^9Y28fw z4MUf6Ki{+vdgTm@F~X&`*uz(8FuCe9@c`=^S88Qjo%EX#&~e}BbK1E|F5(NmHwsH3 zTUz?A2sE<1CUlQE;{8k=*e)!Q5D3um&yZ|H({p?&nq6-suuTOha)=GFuaRmKmw>a) zZzTLoB?xSj>iw%XxT7gzq1s2vO#Pzt_o+yAQ8d)q`&1~)@Q!>Nvt<53Nv@rrnSAl| zaON0|yW1elAs9oUN_N8UY=@J=5uE{Cov5!U$8*iB*1zzG;&o_E{U>=(nXlnwJs}=kpvXnWmgckkhyD-ouYQ*Lz7mV>uxCc~qFRExQ zeDQL}4fK-@)f_x=leBL>FHq*Tq8 zw62@FV3*1ZnuZAMr6es+|ov`*!O>!>lsO8#%Bl znlMq_sIB!L_UOqjp?;)Z#zn2vu5MGiXbA}v>lEdxwb6hb8Iz_`rM2!_j&`b0MvD{~ z-5GQXp@OJ8(tT8BSQc<0@`Ev0;rOD=K!>FaycA{DI4T6zzE9mO4F021YVV9E2&Vcd z)TS{4pxrH3+Pv<2b!fltt7;c;vtkr<$1!k?!X1McAxB*EjDLM?TNNX1!?O?fXy;Fa zGZDE|r#*!xdcme;2F91@I(sFeuggCNn8wyJy&oi^t}kI~SYXg%n_q#w7PK+u(iyca z8gA~g&)9C(4;r=(ZIl*wil!tJ+X*bwT`gL#*I;AUl^{#~(V6Jf(L%uM2YBlV^?1EM zEwrV}Q0cKOeMGXTWwCTOGgB4Z8@lbQHbu8;W+}}aZP^8h*SN(LS5Vcs!Ydo(RqlW> z;*^B02}UK)nPe;)D#FEYgPlvk`!cYUZeTZ7Ljl}Zw{TY*oY61Dtk65FUsXnXk_T;M zU+tq(;jV(X1cxozFxp3LvXX8;I(i8Ab>)<^Sy_OF>Aj?<>^W4_VgivLsz36XPbb{M1ArdgmDX~W~0)AKzqtISt|PM#a{ za+exg^Ww*Lcn75UrrPS+uEpvufz=fbrOwFd0gJog(YU>D>#YQ4}+Eedx=gyEt zcO`l=f!g;|Sk#%r$_=jZ*QLbwf^qlj41~Ni6L%T*ft856S_r^J*==CveubXU<<_>~ z{-)bWYLgT1?<^A+W;215j?UfliBJ*0{;1!kUgb9@_kCp;t7*;Owu@%!mMc&>sfoPy zkI2T$CVG;oI$Pptvn&QDck;3$Ch)nASq zxS;sKV5!ktp!4`Yej;W#;3LGg7gV;Fgm2E}EB1XJ$&RVjpJdC);b^dU9P}cA%Q4~$ z(gVqqHwBcmh>TqdAyb4{w1}<_H5tC|Pc~HfS@CEpqfCQ>HB;;g{dr6&ZmsMdwa8hc zf`{?B^9EiSgvUnn!0r>@z89LsboH(9oGF1tHiOnp8fvLXR(`iqEL-_r{s6vWg}81- z)Khy;z%$i2e^9ARRcR~!#4FKp$HNA1g1po#VdBv<{l=JIbaK5AjOilUjsY}#R7+GGX4W^-q~Z)uj3z4y)c1dXh|^=~W27zuTgM**%kOfMnsC?LGYZ(iAv z; z1wm6>dK>SiP+{p=%=%f)%Id=isj2{Doea2((C!9_*JY@t)}_DbtNyh=7wRY@zQZ*| zCloGIM`WOl+Q<6%jkPn(Wl94o+B!*z=HaY!{znrIhthK#@~v}d9ZB?&)G{eYccjNt z!vV^d#=bW9oFSa1uzi2<0?mNe98d)-PggBEPPB6SbYwVq|qMiMC= zY+PhYFQbFiuRNN7fL?Y7QQYdWIH;cb@5>>gX5wj^Q`^abNzCdQ7*LBP32557%Rjyj z&bT2ok^%!;$Z3`V*Nz)R__HM>#EvzM5qbE&-;gmxQY-OmlpiWAn?0u|V)DqFbyT;7 z)Jf)gYNlIH(0Pi@Px_gg*Kz=@ihxwhO@cxL-55u^;nRe8wfDodIC6N02}O&B z^_Go5x|Wp{I_$Sq$7ZLTrBjX2^u&+@o|`l51@&!abJ(#yeAV3bYHfJ z+eD2MD_*&9>XSBuAm^YI3u=?~KdnYL0@`up}Nr z7W&ebGMZFV#Y~Fl_w;!d_VjC6VMWF3SwSF;)JH=L^oRr#3)3^s3Q3EAx0S`RvAjA7 zv+Z({0vGY0CaLww+shK3j`$VB{4vZ-R4uDQOk7<1u_rbY<4x3-EW=9=2-7vqViV&t z>+Y9{h3;}|(fe!eQfs*f3Y;$3JQfr9vq#@E2G>9DGTHEo?N^`gVzou(yYm9`b7DQ` z>CLCItVj?SK1T|cPqS`S!f&11W?lhALwl>0E&*Yp&PFVo7(;Zlxiw(GmcXZ_Wjbl9 zP+Vtfq)d?+-w#3Y?GMQnQfrk*c{uR)rpD6Crx3%#20SET+*?nx--+^-ec9?xN)B(cgLM zN{mleM0qCp@Se*o>Cf?AdTnBuG+%P;njveE+XCu&?l=hQRxq>`HKu5N6_{7Wg72>yWO!Q&w;{rzJV}6he_{Joac*Im>J$)W_xS zOCo0#Sff)?qgx_Uiic|$I*B8m#m2+#SW8k4oXiliD&JTfLpMI8;G=i`$x3lUbn(Tk zD6^c)C(}4fIHR~SM#$~{+s(&JU&t2(8D1okp$a=URhBeW>t6hejN3y9`pWQi*(fh0 z9!vN8DVS54_xlSM$MW|>$nd>)NDdIQDwj4sDIbqqZZf9*ja&Q{+R#{xE;3dFU3p4< z7HMaKgZ4ll5OgkTv2|Gkk~x@2bH=|qKW1O-%2$_S{^Wp&EDn-{n6mxZo=9%vs1%88 z0o%*;!MBf6LKJYjq+)Dx*%%EK&HH&J$?hCtIH`xkW;A&Ax!}868%Y?)+Fy5;(At+) zQm9;$RLcjjm`bWOKG^`i3OK)AwiSkF(r{2Kwc3YcUZI`zUmV)xCcr1gJDfk`ky(yj zZPs816}i$9ZIQT|tJ%xAa_@8soW9!FnpWtmwEn)Qz{rzjxB)!14oh8_HYn zIML1!@qEO*cC9{CezO ze|TAL{^T=G3S(&TD?)>?%7aesDhMXMN))q7Z8-Y{t_^xQyl6<06Q z_VCDqZqekU{@SCG5+<0^MmHgD*!TIUgXH=RvFkc@#E|}Noko@6BC;0qrYpMMn zjy+ETGjECCDA)IbZAyReJ2aw~+hD*?1h>o}hlAG{l4bzG68%McB~6GqroE1fUO8vb zIBOp<4%Ad~zVjm7r#|^zW74b-6t>)Jk4|;{&chw0>@Z8Z^RmyT#`R5uuK*FN(zmh? zRn!FQR+>?Ml6gs5!rf)Pphy9HYPzL__`xgS^<%;yjEmQvI5lkkZfMB#m9VhMLrzYe zyR58Qdl5N}wt{)a?(eV~u;aI<;q|`>-E3Tt5IU#`l+j)k4zSNTc|C!oW1RjZpFDJ&YU4A-%sm8Kx;sqSKQu|N>5Xz@ax)z zB_g0qU!_SV^Kh-N%y~-PUdFFmt*rFOzxrF)%h{lV3HgrPb;%ETyqKH+Hj^y=BauJx z5_5IfO-Cm6SB*R2;AtLWy<)F^wL3G-4mN@(6#m}r7s~CX7JaiAUy7J@D`qeKfUBhu zLzKeW$Hb-e)(YMKIn0)jxdQd8MhlPTHJkr8h5HxanL`doU_)H%#}IBp!i(hY-3!fn zHngkeVyBl4&V)`$xW5BI7VM;Z8H$PI35mJ7N616w@&Dv38w{}c-K@UNuJFt+cB`_oHtLjUbrvV1f^KTFl`dG6q7 znOW7aFNuA}lo?*I9PdS+xZ+}YeBDy14A=Zhh1w=2A;DmRU;NPg#fqe&$2X=a3vRH`Au@=Cu^^B!u2PyXUOC zs#3@fVeo90A2)-7*J=MBKKs8%;SQYSUdX(wbruexu^hCn*4%qSLr~cYgLhQ%Y7$gy zqU{4NbkCznHB6XRrr(>@%|+TcSE}4MU71_nQJl;*1@a%n;wouL@)i;>&^a_@e@za~EA_axAvluaJ9TN*(1!us)@cq2xtOVM zc!{F6E|iId|Fc7h%2V9(KJWgs`s$G=(<$>jsnoVDzDaSmC(E3GLl4_5Lr2Ji+Hn#d ziv;jEe!=s^z+uK^;p>C#sp+SQT`bA-Z{60*G#cIE1~w#PTTF2Eb??(`Rc zMD%J!!-HshwtIWrm_N4Bsiqc<7vyg=O#^$2{|`FO!%6xMGXNa(fRQ2PVqm5isae#k z!*pic)<1cl=V{&MpMj>8r2oV87-ou$*zS*^=%0y*T^|ncD~wJ1Ui=;nnSb}Uz3f_s z07V`@@;rxURAuY;i`1QsFJK~xtDt`?p)y!m`rmrJPx90@0s+3|HB}ipp{Q=uRU%V1 z{zRh|^Z+|Y_GQZBB+HO)GxMjaaLxJw$aY@G#1#kSTZ`%WeVZiEo}NzId3&oCL><5GG3io}>Cx_E=tJh@0xH}NtIP^hUy!0O+_Q;~%QTei z-d~f!Q2FC);?BnF2l^(X3NNXCk^eS)_Ai}Fj&>DZXKusw&Ry>~D!$n?AvYx-7m?sRy(_C2>xbnc%0@Ef!w39+D@K#=554LM-=1%N@KSEg?Rdh^l zZ`Cec&hKx3&BIv+uSTkYgJsHkF3ZdL^t;duK+Xg8x(rae!-n_kS(*Dk!H$;_@ci-j zgyr;NfBjd3B=<`N3YVGXze=K!x}z{mR2Ae&p4M2Huu?Qp`fJ7_Z*lNO8D@TJWgF@m z`UY0J-w!`AH2WXPwk;6%1NL7F)j~Ox24z0?twl^*xAuShXt}uQZ83pY!JaZ(5c;@W zX4FgrQwhA)No_HWG+m>e4oBFW!zxubg9s{bN0IF;mRI zDJ|2;{YYz-Us%!tKjy_4aMk|W_wZkG5XZKA_{|4^-&6(rgM&|7;%$HaAjFS}4|`rM zs$!f+0%Mwks`AaeHFlu>syZqQvr8acCxEV*98vcwcdBb>0j$>StbbqM^uNzf`K_gU zk+P%9sOm*9(l0WngMFfk`)1RN{(c@pxyZbs&d%0t)(pAA8k0R2#eaWszG_UfRu_C7 z|9Ey`eWg&$?fjQc`>|{%ys7sVMg2UIw_W$*H-#ej#By0>?lUJQIbx#?JbCCf=>(Mu1 zS~8f_WSt`{;8$kns0=U0s+AmG$~{u*u03%L+lt4(1Czwf`Km#GJ+@R(dcVRF#PpqJ zhSd_J?;tYISef63F^8Y_aP}c?{;Nvkf3NeEZSB|Z0AW*A+hPB&470f`dcQg!WEb-K zN#_ff)YS#rO0trc)e)ACLA^^<6o(Lk;d`eRyl{YWsiG+T!YwAmx;7TG_|S7(_@%+g z@Pci-dO;*=5^`#O-9wgk|6+NA$cjp1$HG6fwcI)yfJS@O&@Bv9Y8+gF!EjOE{Kv`n z!&ZdDy9v;7PPzkDtl0cMkLrXBT=5vdkNW`K4wCntp$0qZM*u#7v>0i^{4d46DLby=x+Rkg@9n>V zD3Z_QQ9jXp|GX|j#m|*N#D`FvUk)MP8kvQrH%kE!v^LJVW1{v$odWl~wnsb1X)e&7 z&F6CcI)Sz9@hGNzfHvE6hv=R;#m3$CGi*Z}+|8poU;Ji&iDn?jh3Yg<#>o>1p27X~ z*oP(b1fvJ?ybS2=1Ot>@G|r`kbs*s;KH%bE3#I z9=YB!I07qagU2mRG)ixoXZ+xFQ+rM1C5`DZ#I9v^-h6T&k0>%ytlacahAoXK-9L}A zk>^6q!T%P|=$hnO;dNweHhv&`{@BEis~_Z;%m(Cl0(rm4ZfPXjNp+9#~X)|J5n z<1=Tnpc@*~kcWp)Tiiap=Lq_G2PaHUA59FhS%kN-zE=!Tqn%4nDp(PPJYbz0nbN`9 z-dcMcT=Om|01ft2vXK25B0MMCU*@C4`o;jkx}8>*?YmFqa}|$cVr~4@ zkH9?>hdWkqVA?dtILQ7)s z-YhQ8Tj>1h@~d$lHXUo_%8^%HYLlhi(kEYSUQw1G#f*f7N_Snj4K3wp23vyLb}!Qy_tgy zDz3dczg^evUrd6NXvMu)pxfM!dtJ;WgA?h8hq(G$3hM`bYW8{PJM=`B#mpK< z*7v^{33`!bjG6NeUXQ=_EszFC9qFJ$eIlVy(4d@0FaOj5Y4GW7aGdLGVo|&L$?^$@{dCDPkwEe&p%GQBgDfQvWT(aV zO3LckjG##W1O5e*oVl}G86)MTeDT^^JrEmrBRcqr_hdVP8wXm2^NWxc?Wt;Py!ID1 z_UQa4P1~@?ACzLI0|8(l8%P97Ln|Q~Hx=IQE4LzA=-d!-1TJATUh0^vdEv*r^_mtH zb@<~UQ`dBDET~8HSH%Hx<-Qk6h5O6T0MawBVIgj-g@ssCHpm!d{kbbs7P9Ua3_qfM zC;j!XQM^1!fg^tq-bgNdj9!3_{DMI|uDWF`EA53mIy`OyN^cU##e}o_gL|Bi^n|cdX%$?lGpdp3 zr=?(!_f4UJ63-58O-!PjhIB2bASKOC*9XuBf=e~%hP6H8iUqBqAK1r;k+yK7q2D*Y zxMikokrCMH(E!`#Puo7wJ zmiuStPkbs%m6>-|JCyi!0d1*cflC5!CD}Wb553$=oa+%>p^4fv7t~s^O?OTgSrdZ+KODKL@^Z=*-|akx-Dy0z8CK-BJeXp{an(&gUbIR8TBpb)AZ?? z?~TdhXO9Fe5Em2Sc2|GWBBoIfE>`6J!0Y{ZGLupN=U!734#Qh#d0v>0Y>3BA})W}N%?NH9RZbuxY5f~p6B*yXqcPL;+$!WpH*zK0+%QBGhqM-rc40Mh$ z=|dsg$9xLDy0vQH=+EK7E%!sOHAtnbi`-|qKs76=2;r=#oW$8#@4Zoy3m!xsB1E!6 zbWvWXw3E^HF>toUuzL(B>m%%iuYsH z;!k*YjLnvatHYWHPInqmlF|Z-q~-Q^fEki3_MCCzZFXyX>?6WL~?(Q2+ z@B8%Wq;V4=GV=Q3;Hk-MFumN+Qm_S!N1O4sD^!0|&lX+b+?s54#BSE9_)8-&4<<98 zjIKy~o88Wq#f>rH6|l?+Lm*pflE$2l3r%t5j|yq^0wEUX?_NI9OwIY=Wo6K2Yy5|_ z2o3EtkEiXHE(uDGEhRk}knD}``1H~Sm?7Cvtabz|f3{xPKu-5Ki|dW-P=*CKu!dKY zpJ&NlKCg8dMSGege6dqZ^GN-)Hyp^Pd#uKzPO5Bx>~9+Dw_1ohNrpQxNw}{PNj6xG zPj?8_ggh>AW_FdaXVUFa8@y*4WaQZyTfuPj$c{*;e%FLQ+@y7<-?E|=(=d~JlnJ19hiRF6U0-C4g&;iGD?n(_h zVQQnR*t|6Pdy%555|h;>4Lj-CkQpMfD@48`7JvN#*gjE?lxW3!>c{xFbA{a3Pti7w z9$(MBhlC@P5ua-Ef+yN*0!`fxb=`qri!3o zxea8+1X%j-o?tUKvBQr7c;8)fG&TjGDcbcV`5g%?FVPe`ON%9yihuU3N9~W1k(?l< z#-1Y^%1d#(G1tF!J#Y>Ztv8)2+Pa^jO5w)*Mu$B|=q`iT9#oGKSVgMr882XHEbnWh zH12M(x{&-0@a^Ga?W4Tj zc6-Bg*e&F$FW6=^J}?W$3NP{5({}Sv)FH&t^d-AXO39}oPNf!2;%kWv%hh3!eqqa& z`rMsvb4I;SOI{lXBQK`31jAD!<&u&{C}WDPG<}sdTAi>K8{crSXecjM-%er2iveac zi+gSAPw2|TX^~S_LJ)`Ni`NV@qemdT1;q#6nXtD0D+&!a+9x}L2%NwhS)i<+HJpCr z1zu$y{)6W9PI!+RI&z*>x84Hoh)wlXtBRLj!ZycL`@At{D64F|@U$(OGLtHZi7eJB z)1!{@E=}Z$yRBQo@Pxs-KImM%Vm&k`C4ysqzTyjw@}=1$^=$=0#!zkxW#rG&K5k!N z;>`1|-V3&(ix-BR)P&5qi#0>b7T$=kh?c8Xk7NBSykrfzg0$1Xu|u630)@*!=^j*@ z8sH4mzbOwCkr;E2SBZUbEw!)%XzyEbPWAxXkIT$>-jjVen|u3IBatKHVfkvi_ogE0 zWx{plS@%RNHFA;o8#8+k=A;T2{f9m8L3M1g@}WC6kr(v=IW@;vH~YgusR_)@Pg1PZ zj}G2(7F~1|ltaZ}>Yu*k7d;6+x;>4_F`kRpAgHB)FSw0b2Qt+%F+1f)2@qJne9s)r zqD;<<`LKa3f@s4qhD^Krk?*kxRg9zvt;gmAcY(YHf&75|V|3c&iOnKWrM%rs6TFW>9!1Qu^NX4Gy16mDD=YR*V6c#R3 zE;U2}o%`|M9Ff^%XB5M)$T+MR&*DWxhWOaH#Nv!Kv#6!$tQ|GDTFj4o-T4+I&x!c8 zjDpd4On5n?vD^0fv6%IjWuMe*-eOuKo}Y9QoXg%-F4%izR%Ro&-b>4Xx^Q;rLimeA zL`e&F9Gh2vE4;O;od`eHCTYX_@GZ}$ z5bbaxl0P_HCB;FPUJI)}^l@oFYKG@$j>0jg8?H&hkm6`b=c%=ImA%;k)2{;4= z6E%>ZHwp2ogREqS--);AYi?3Ot;cH5Fpw6uTWPVcx;{#U>0+sGm1blky2TvB&Op`9 zDpfdJp`mG2az*3JqSir%az*2`z@p-|VTqGG)&l#McDbOsyAsE3g&M}7CcHM5VT?jp zVr9iJyg}9RZS~_xRgx^w79!sL?HSTwc`@f{f74DI4|{m+D0}sKukGmLm{Y+E*Yw2c z5`S^Ct+JD{6K$u7?o1Ig)atskv$B=Fm4!e<1{;%?3@6zKFqyyrWt zJ7-V({NVz1I#)TDeXLyk&GdHtmBxL%#rX=hxx+Bto>XSjocwGH@U@0uCHT0$8_Ck; zXsMt?I!`h_ql}+GA%r&7zpk#Q#&sk)^Y~ZGao6bVy69?mKX$g-;ObgtFFk_#0dASp z)?TLMm&h5D&L-+O}7rX8m3ewxr&B3iD;)?i*p(x|(@|gbXk|gUpKd940B%m2GIoh<(MU(uI~`cZh!P z4tS91$``S98i)|^*usSU#SY0Q#7R{bfpVIQ!|I&b4rk+}Q=w@~*NVL+yw5@9HI~Fw zAL4iYC@*qPt48hDgzVN}WcTaF9gy8P(Ixs+RcXxM&!3XCH zoZXyrzjJr@?%Cx>PfhjEJ>64pRdv0OEQLx)iEDN_x-1-fLbBD(+G=kU0yme`<#uXq zy!}$7H;lPGz7BIkYoxXn-E*8I^b)e)3pr!I)G3ki1<5RXU}AQs6@SDU6-5}mCn^x$ zqtE1z_2Tc>AKrLtMe0LKCdY_n&n{+wRW;j_e6*<@gSn9mgt!5_lDPn{%O)mKOkNGi zjo6zHsCo%&xi_w!K!XzZg~i6p{FdH;1Ex1cLb&0wdRebQukx8A5wyQgSCQURzUFg@ zr=TLb#gp6Wi(4I@;<8gIJ66=$$Zzdc@Qcocqmn^WPN6K~Qc`s(_~$$3jviKfo<7kg zy(<5mz|5igU}H?@{+o?4AbRvofgepUOQS->T)`f>Vk;93WxL%?TKutk3&A&^M9fc) zg_^F?Isbmv&Y)`oa5{f)-`v5dJiY3TOg0y-(=6-*B{Dv(=Ob{6H%ldvXr6&$6LJ_g zgB=doQ>I?IwnL2e=pAg5qIc$gRk>KDvO&EXq8c*D-8pN8WMNlec=a%)vpLI$>yBO=9Vqxk)#m14(ZPHHMR;+rE+LC{ z(2Or4pV9uww=DD-Cu_^QSX|C7t`(2)1757PBiF&ThL7qj*V;`NevAjQDPFQo;+K>g zh2Kl%|8k*VuebCO*dpTOqyGnX?)n>eKRHaEg&wWejt{v?y!ndnL<57k)k-3VEMNmo zVfoLJc!JI+bKhFMgeCKW38b}~;`%elXU5U7#O1)P*X<|}m0db+<&#LIHCM;;m*?HG zpT1at&}Ii48D2yzp6i5Y0=n3e+>(;#w$x`D-pXtR=u9Tg6|SP&mE(2QG<%)fbfoP) zWRtLzoHnshsEf^mlZ)jwwsJI$YACTwCSiv(#@v%>ze6Ti2VtE#sZuk%@c&XP*j3pm zeFV0A=n;|sv#vBU216`e{fLFYoM_nxe)IXLzUt$67QUz*)fXE{F360hCs9CR+$482 zx_U)g?*E^y{LfC@J2~?+Dz})HI!FvvSACITIipv&x}HBfSN#-*J-1CY&e9yB4Pt#+ z8xPV6)2h^iTheYQ-1ksEHwhkGQ;R#>JTJQO1I!NsKoKgbV0z3)8B2HFU@@ocO+EkL znBa?QE*Sq5{4`5{>J_W zCjG;4@&6;pKaLgmbE9d=zXN-~9566CnEt%UeQ^?)*mJ=OZ^_96JGlXx(Mzf}qLY+@ zZ^5iGx<;Vp8fT%m*$Lz9Qe&WgHqDgYjr_m3(Zy3RO}$RubFwLoMCUNh(Ap<8;GI+# zuwb4NXSBfP)j>hIuFKuI;%q#gjnGqDu;(^S)BMNkzK3E|sN~vh73d*)vVFI!4^E(_+DJZ&GKk z{ep=+s8#suJb7L(8A^I{WKZdPFtSuSTUDuPwCOT*=QQ8>Uyy8v+j<~DKu?iaCrtf8 zCACkg?SpgQ7Zk*Flz1G|#oMfCmf+Sv_W7qHlS{NzF?P=8)-+3sX*c>ss+JxfTsmv!v~K$agU-{5Ji%|c;NyU2x$8(-mBmX z(f`1)18$t4ZymBM-#QAoT(?bAR8wRj*>JQV#dhIgf0gM%9oCr5)v?UF{<^=e-AI5t zOYqqYH^PK;NORbi_9$TlVV9LD7QDsQ_Gu1x%C8-3P)aUwV;=D0%JY?!&OM`LP^5uvjOccx+(fJEj=xH zIe>q*a@3#+pbos?iPf7l+BtJlQ_xE|bgUSKMSZVg3*?LK+Y_ylaL~o_3E~tN`-wMq>(Bs=7SXa028f9kP z!>MLKZndo6VbQkS_(}<0e|>HAU3kl_d4IsCcpZQQ8Zl#64@6R4havJ46SySF1&=|+M#0Sp2+j8LRZJDnsa{kqv_&~y;Z<` z_UO8c$PH9Y{7E>qhNOqQN~g?c&f?z24`5l3bu{gUck7NeKq@m%#s2xnQj3>i2w=f{Ls(Qe9)O!!^0GBWZ<>rM$_o%CTfzT>uQJ?`Sl-ZpOb| zj(Ve{j=O&CCK6c|)?cyuG4OPELahuMLndcMOt`;2DhwRd>mE~O&V8aVGcj49J?#@h zHg@=yr2a_XYJop~=vz!NNs9W{*F*q-nih{H*CXvdjLdD%_~GA*G$Nca|4>=~_hWti z=E`M#q>r7Fku?s6w~W0r{aYj6blfRLFFUnmgeX`W2PT*3^5#t+v8lB!ethOJXnyNB zqBv+jncKljKmK~w%Jw7Z3X`d0=4y)2;*N?hmQiC*a+d&sQNH2gy>(6qgx-U4cr1X& zsAdv*7klXLVN8W#ao`gx{WYFwRnAyozkoVCZGCzKHLr{YMFF*bmk&yZooXA7F z!*&fKv>=jCS4#B0BGv>Pzrl5eJD7L&Pl;Qw_#U>_Y@dAhmXo9_ypea!%4lj&4TbO- zTv?fTHxJt~A1r3oQDBfB9MN-xTcCNkN}VAETSNj+(QUHO^Lb zb|6Zqfyc7#ncs4?#dO77OdLW7G@TOM~Y*(So3?-32Fy8+kb8r8TNT!cV@%c zl6jKEaHgc*VYUvkBcdjs;?cmG6^e$~*fqPqpkV{>=2lzU6bo^fPEgdWz*ZFnocCa7 zCmYo*go}vb)qJXMa!6;MeW#X86w&ml-3xKqGEgdHLad|6^-zfpD^$^GMQu!XqVV$s zk-B|a=qq4*2PZC$f6+ly_|=4w{sh|XA#IAMK(w;bE$(-x+-qFPM8-UsRQyT1;Cn=y zA&;`s)9zIc(y5)YZ%*`ycK$tEa4r@Fyh{XURN4XrJUTP5hZ)0}Ia4G7G;yai6Rjt3 z2VTh0$~&Q;vF%jIQG5=$ptuME0HeaeGF9 z<)JbdNBq?)f!X59MsuuJdD#+gX$rdAQ5v%`w+Ujbi)EN!VZE|hH``3bbZppab}SQq zRG&C&-~qz-RI`x0l#zRYPgl&ldf+pYUH z(T%JV*VKNzZ&Z8I_MI#IObY1YjtXYu@^qv&1T9cBNyQqUxNcWGmrA~lrx*6Yp`Y&r z$YD3XQtb>8J`k@;up|Yzxavs?tXIYMG_9Ny9sFEgRyxW`#W; z+MI2-h8RzXmvqF6VA;8(X!)+W~sz+c*GCQG3SD79bM znjoVAiJmW{a_ywz&O0%_NzBHZb8tZVRs`!#ecg)N#$Jn3A>8S=i8< zoEw86l(st;&ZAIhQuxk(QDb#|Ih;MZS>$-hNu0%s%TWy677Z^_6(;wTB`Y1mI=SS3)JTM`r~kqWzp-IKny` z1rE|T3Wy7e=S~)^)eM%;YHJ_tZDNUXyq9r))7&o$r!Ab&--mKRz_r`2ZS*`)QK&*b z)GGF_^+cZ>Fq|{g{c;<6;+;sFrfwc^)Wbz!jZ8Z_aj1^6bT&@u3I+0hv^ERHMilQm zctqq1rA8$#76AwuZaCQHXrDm1g?>eE)&WohyBv#g9GkjPc%~&95!z8KmO&rH#}l}{ z3KmHaK6>s-DD9B)R=H_Q`|*n_3Ff?^H;V-QM^BpreH?+a+9#2lxt1wY-(>MeW&G$AycVrxLy30HkCm{4Lj0>&}v z>#@)KdFmbg6((Ah6=B4~mkCCz`$}%0GDL&=o@XknZuV4!) zO1aR5{s%qHg1b-lrw>^($~EsJ4)m#`?r&4)4N21*n9mG=y6@T z%Fnbr&b=?VLPB&DovZ8nO{t_N%JRRd%y*JS6I=45N6cMNfb+YG<*N% z?4s6kVm-ybp|S#14x9SK!?ifKQtrq20Kl<3_qjbpwcMo!!|V45EOj{Wb5jj{sQZk4 zZTM=rAIm>tO}Ct{yCFMG@VJQLpR*oKHLrT1O77dlGQ9Kj0e%SXv&VyIUB+tQ_s(9N zjx1Nc?+2DTd{Yri7|$fPs+ccAf$|X{HK(n*>2Mg;NKqw~N!CX%O|I_(=a4Sm>tcp$ zAXSDJ73>tAsX*pAAW(_CGiZUd&4%WeYROFk7cX+P9At7dLIl4Z+*XWu!ZpCu-^?A4 zr0`CW(4ei^%BY3d95rrV6pNW_?t`$g>;dmOJG5s8)j|h63^F@6%{jX^sZYu;9|c0l z`iQT8N53~sP}f>OuMA`dNF#c{u-x{9B4TlbaqgtU#%Ji&eCr{i=sN0H6F+ZP=sFg3 zoYlU5<1w9b1(HV=LPjNe6(bnZpa%zq-rlv)LHnc^U9FW9=Bjtr=Eia=MDDKDHYnxx z6JE{gWYe?Yde6BK{x11%7PSk5oJ~Pvb{xgq<2y+JvhX?fSNy!zZPRv{y6^jDDU>Hd z54)lJZ1Y53JLCx=C5!KbYI5-PMB9EKx~!|e2<>SzVw!Yk#;F=Oa-7|)D<9~TOEyRG zoioOn^w3L`%H)_Ko$ZZ7pCHa*u2D<3IM?9Yu9;28xez~tn_-#7BFis2?)#2gI$gU6 zL*vmyfKH7hm)JzLJ*hCg@?>%+BRjg#ONa%uI+T+t>zPRe5nkV?2d`>SMvv1~=tgKA zMpTKE+9XeP%4DsHkeT0j(a&wO1A8(wt^`$1;|F)bX%8D^1g-*Si58Zx5llt$@J6$% zv;-{QGUsq}hM0avq6y_`zd%1+=$?k;8HH+IKh2gQk2nP3XE#-8@}FbB6OI$r9A<5u zc%hh-*1KoyYeuj^H8R>4>=w5*ib)qfWHWu<>b!dC^6g???d|h%UIsG70@i`)myK%J zu6wB0lZi1CiH3tmAs%~DiP3iES1!Wh@3(*{b2XBKSmM;6K8Ft>>&fV#wfA&i-74}} z-fyitR1E?Zu%Y`mlT6@^ZC^(@4pL0GYniAunrtR%ms>TOjGeQ)G0MBL8(CS-Ww3AQ zxS@w%#(sk?$vLWVmBf>lwb?;uUw2At;Fm1jJ)2I-5Kppds`ldv7U0SrM z+;}f8XMs$XH;Oh{<=$0tYOIbg{060DHg>2I8UwSHVP|Q55oj$ zt$%yX?VqifckBsp)htkJBk95%$UbIgpi)R8aH^o)Nb25#icHEo#Kj_vu<-|eFk@7h z?Bl2;^=5|bsFc6a$nM8Ew%shs<)4UAYhj#iEBYjJy28D&-MdZ@F7LO?8hV_vC^l%^ zM_C0gBR3k_q?ngv)9*%=IWXkvBBqe1NX7J#SpAh_Tm%JGY#5W48qNv(x~StTCtIVz z)>>Qc+#Xjz5cA%rQPuP#F?J&st9>seJAh=96skd!NO z;ToVkU6N<-j2ypDPU0r4mFhO)*`3b-H{xm?=|R zn`2MoCNVj7EDB^QBk}Xs&CTOM1|#zjdLpjt4@Bl}F36JKo6yZ9mlA7_nJ&_vlX552 zhDg?1VKgpZ>u#x!1)omNVK;_tnap__#7ZmNx?oGXa$UM4>{`^0XhasAq62uap?R0y z6J4TxR>-MUJjgeuddGFl8&lnX4Xp4;dwp`%jp}`qAQ>@0NS-piT}c5ma}qB!jSDqV zARFM)VGhN2KF~^RE)F{bQ3@%;f-xW~;xLE%a>eu^V1RIV#wey73#P-)z=Or-)7|yt zr8ykmWlvzj{bRncc36u6_V;`l3-?QCIaCkJ`R$0fXwo7$oS7H~Uu@IF8d6_`SD8US z|LUzlLyjAu@7)2=#(BX_oMiU?O`HRnxgCM=NKZmB^hl9=M00cvLZcn_ByGiPs^TPq z=rO>Y7-C;{GkL7zn^-Hu4LQimNZMbA02WsyE=>x2h&Z|zz+gR*b*YDU5<5MB2H0%Y z@)SdkJk#vTUA=?ek0r zi@_&&Z|hv^Y@609CKzQwyY9qO9rYnD<@Gn9Ty~+ZTHAMsw(lb@=DSe_)m=IPW&igg`U z!$4(YZ7QZxw1g?R0W-hNYW}}aZA^Fn$e+il5E~Ny!#aKz;fsgN8cjOhe0-%W8GE$s ziz^b6-#Ft}z~|Xm=-!H37ayjM$AVReVaa4ZkGykQ_@{}^3edhLWZt^K?I;inosFoi z<(#3pxdq+Kt>1h>$I@)X)ox;d#@Jy;!dqi0^Y)LEiVFXYVW7(2&F4Z1Q} zJDVQz&*7r-)T1rGZJ+GQJTnq_wI9_HcOjz!$1$`Gp7ZkKUwYeG?x=DOnDf-K+e`4; z!0Az%piBJC$P9mZ_-}Tepa0kMOLs8{&S~ z$|{eWPEFiR_chZKB%l0;jM7{FnL4Vj2VYVT_yI^f|KE(z{zP~CTQb}R|6!qfACjW= zOJ?07_O<*Q-wbm2)STi~nigzD1tcFrsscXdM+R@K(Hmj8C~uBtf{PSaq!m_*Tk?FT zl$dv5VS-_ZhuOl&@}R52?E^Cb~(Z&%|iy@9Ts_}k!~&mdvj=M!CdQ>JlE zzt@xwlgtO1mPd}rmGZH>fCyHhe(CZWmxz+A7LSD4satXMZ^E;bQyhcDQ<4psu{O$7 zVb#Mq1_53t?$yO!*@zo^^=EM&hcw$6;CrqnzvB{eaPWU&v-q2s?^9Up<}&j?G17U# z`m{Q>a+U(9-gk69#$yk{^c5>AoXP1z`r0n7uxnH6m2-`HbdU7kha}z|QlghW{Dz0dB<#7p z^5S3fI^_9y2lsFrkVGWdLVoG~{ld3oV#JGJYJJxze+iXMjxq9EbOYehjmL;}4{>>o zsjZN26xQ42yaknq8bgLgM$5P;V?;WR^HlNC`Z9H06saSEH{{CyK_xf-W3qTIgf%}a zrU3@9t5$Xrm9&u;!8fJ+x?Y(X-2Dm9J`!0;G0eGzftr*PS?Wplx;bM_-P<>}vSb$_OKeu_ zYt*-J_bzGw=)2`d|7HXH9*SrFSHmw{U@(@#e4ciAlDb}FcDf7{&!@Atm-HLyn{J6( z{s42|*&Tc` zV5Zqy?d7LyJ1V3$7wt7;Q9Gz((wn-9-QTrAbu3zrF|mf>d-GfWCC}z&``?Jb)1OiO|Lj|;ywIuH zI-N1=Px0bbj;2-WH&qE#{z~}Z(VsEgm4K-6pem92^!e6!^`G=Lx_SWT05C;L2QEE2 z8*xiZ$v5l9pTjgKSSY&Wm)HoFcm6}t z{;kbp!^On1f35aAI0#Tg2rs~QS`Q(quuF8z)EGg93tok;!nyAma@dH2Ys%N9n2pEn zmP$0?XHOrGFGQ*wB(j@eA7S}FJ4^7*ajGPng&$L+vs46usHdN2zUi{ln1=WGprsaG z?_S@EnUAyyb;Vr4K024%Bl2xJH?Q15ORd=Ij?0Ot?X^M?53nJ%vj{dfca+r@Iutf< zs>NB_TW~|=+2U?eTXYxVgp``bi}ngaqmKzMv>b^+C|3sEgn%qY+uP?T3Rtz+1+3IShuXI zWHL_mnp-E^n=NtK+5aS}vjHx%ETYWcVmo-EbFsDE0b<-#YW|{MKg2_ zb8l~Am+HC41M|G+1-D&Ql7l2;o|V=K_%t2(zS)MS?2md%O4T=bk6HUOPGjz0%>^G1 zpVr7AJ|%T@v8 z8tURZA_NGN4-9Vg?v?t@Rsk+uA5KVh>*5RJMz;6T&zUy&(@c%c`mOb)yuYI)4}L}~ zxC6?r$c8UC3N%`_MAS7om|qM_ZLz@X;TNsNzGhs>j!wg9kzpNffzUM_O_g&vQ612~ zXrz~_H|fmtx^hv{JoPkAqBW^htC&}p?$KpkklfU1gVSlQ)C^zi#Nt84&6EmCwZD%;_$v{2p&?Ql2?GRG&L(dw9Y_B|H28ll!gX1_xSZcmP42*Q z#au>smNSoLavw@Bob;*$Ev2q$A4K;dAR0~}=ej?dVon63)a_)BX>5KqL71dSnTxo@ z3`g7%ufoY_%Z18-#AUh3L$D;-wp_V*Nh`rk@-PTd`{Tt5uCdM+r~ab>vR9KQ+|nDf z&HVK2Cc4U;(cCGW-j-A;H8weI#pRr~m-ltgPi$^GJ78WL4gd~Q1ODNc{{M?z6^~(! zj5%&f^9S&o?F;{(oxc~$Cj_ULwaMF6>1cAi>B#iuWPQxGno`5xu?eMycB1MwJd0aG ztT$ad%&iBtu9HsxI{3|RZC&$v{(hb(1Qtg_N2Jd@qLMnP)IyJn%TQG!QD=c=G5yEl z=;ri-PJKHwibT0#*w|3UA*LQe*YJWePJHS4f$hA_7l^o7X_wAq+gZVd4*+KC%rF#f|(ObYep^HWUK zBt?X~GrE;0%HcP+2{fG7HV={iejHS~4;+Yi5IFHz14hPHGDUlNZS5%h zpXROqx>6y=>+$IV)v!wO`JboNZl4!*94)$L)|GXA)5t4?>UNS{=amk1LhxG&dO8`MbBh5Ph;6(LWp+Q3kx%C(lYCXb(s~cG&JhTP#F{?hJKxKc9*p((}MxBJN@I*Ey<(b>~i^8zK{vWcO{>J%rP$%1R810R55go0M; z5DNie}fWDm`+mJ*y;ybrAKL-#wS?zjK2MmZF;< zCnyLbtt@GOSV&-p5s*Xmk3gGl)o3*%{?H9g0nM0L` z5U!2xW~MIO?q!?zOop7GKKaa}h7DL2dqh?Axbb8>sqIprF)GV9;v2`7iD~M8&!Mic zPMV^6$YbbCjmtR0FT9{CLMs|#W>FRFhW4j3!fI_M29Aemy;PK<_h#u+==?9V5dQZ!=QI-FTqW8dQ1j2@@1nN^Vcfm zq-08=cDcu_xu6ktbD^``I@l8%$j{++a5AB})eHY$4zvGzF=7b&fz)-MQ2So`7w|qD zjk+2EdIa=0L!wm-T#YvvoafWhICc8uViXqQabK(2tWM21xzCD|;)e;lU?}2Wep~!3 zb*g-LUaZ{d-Tvys=_WYHc*_OI;=HBh=d`HwS6-fVS`p2ap#fE+bCZQz>BDKTweyPO`({+j9>%6DqgYW$DXpUtScvz zNwoz;R(|~gA}8k}fv?~w(uu^dm!%7?li+#}wN};TLe26QcAm1a6YB~-5000U>2rq* z3grC6&uT9e%hcr{UR!LlS(bgBxf-pJznFDR7G@$0;q3DP9LySs<$l7jFWF$?BTkqI z-@(2zJRQc?dBtLH^xYfd#}-I&sy_D=I{ahn#BF{}c0&LF4#?wK@Ey#tsUVtZj50l} z^;L7yHOqj>$6-iz!=X6hu*b7LL2F@-^GuZ$3_gFMK{th$kEKlD(+FZm=R4zey@XG` zK1drZe^K!%v=fNy3Y9YQe8Jp<{@an?vEiNy&>hd%#WG z8}cOevS^d>CZ?&);|s3465gFFU=P%$3BfWP+=-f9kb};Bi9Di5exL0K5j9yv>~|ou zju}cv-G2c@=?Kd^2{nxkOyCD2c(ka1KwHrHCrS>(psd^^0& zdaARmR)>VlA%avMec`W9>0r&N++eqDd>= zaBZzxM6EMv+^~6tSNyjf%Z3fFwt5eZJE6 z3}~gZ=G=D>B|ylEsgPg-Y~iId926>fVQ zeAcNAkM8Ax)1>H?V-gG(jsnL171&Voz@wndAT|-Uh42jDF03LI4Gi((-{$Oz=7ZilYt`tLqEp&D#a7o$s$z*vro)F0`JK3a-g=ZyUY1O_MdLo> z=2K)7E`&uyxrQzu(OBPyMZCHupp0KzH_zY1>MRl1YwZ1$H+*v5N&`G~zdGo74|LZo zSrubB_Vj21&Zq+B6?*+K$>!Ei3NoG5uEk>KD5zPn782PsrdBdtXA3!I2}qyNV;A%u zybFw+sFJa@(|8>{_w?2(xN71-IO%f!_ztbCz47x$)5a%oEM7HDb-T$j!mu-SH-V6G zSVouQ{I4gCKhj|x4VPqU>EV91GnRpYnoK9pgNV7{CBd!@^lyoUlbyJS^`w@?X$vts ziE`&Y6-}FHbu@*JRMwUA`-Ps`uGbHb=+EeOG0A^T(=3**TydDaFHW-&m3Z503T8tb zI3n#z#AWJXy#c=Xm@sc+`$G0Oq=&wth&akK-xA&eZwGX}FZDw4RxuN?_+l3D9M4%B z7=2s#flNpvkc{-17=sIPFDm;CD^GN?f>L~&hTOTBUE`cs)bCm3Gz;r)!+wU2r*=}T zoZ)7i^?Nv1p`s*|mM_tM4BW47OS4!bvsQLmyqn)WV+omy+^wshwRPwkT+EaV)>S(= z;+p5-`esPc>!}We>8*`5tmR(fo^YQFqm&>@JH@+4vX{oM-X=qS$s(ItbS=uEW-Nzt zW+j&HfeUvVe5~`uGoT`s!Js6>^%--Knz}B*e3p~_hvto%qtMZ-+{>h}`_wm6F*-!!y@-1CCk=uwx9h6xaH0 zIkGy2VOxeSD7;t3#KnqNs7JVrlBx4ag$_HVeGrNTml|zP-VmwhH|xhSzsmI)5#h$e z-S=b8#p~_&qSg^^SU45JgKG|#PugtdN0oABVPTR^p9&NW;!m!96*O<&EQMGjF6g4& z2WdlhcW%UP)G7D5kpMS9$iE)+OkKJzAz$ZnuHv~x4}U8EIZ;0{7T7UzJ~iI_BIBy9 z9gA3|Nb~a+6nK32vB3?isi1Nf!IAFrcF>!P`NZ#8FQ7VqCaFnSx6B`Ju^>V|K*b2lfT zR<|LSBLo#~O&uz2k>uvvJ=Tbp^5T!$S|($Rt=B#BSzbi3DRz~PCO5Q4cgOx8~I z3~9fZ%jj}}TpIsd$VDeOh?xQDBX|AR?AOEx?Bey*4aO#Ykk4h;&HP%@q!K>vg9#$C z7+_W~;KK(JG={DGt5w{H^TPfN&2Tr$Mh{(r+Z0vHh%EA$1zo*J!vgK9Jg3KS{kk`8h#q|N5cag};mj2cW5D`#17M3gGR)($c(l8oF- z<>m~P3cgtYlTS^w-?^(>Br?w$ZX^M!#J|hFte_NDubCCZIY+p@lPo1>KY>mWgy7b#W|7afTJ%7yi zV9c|gTy*YtF?={%m0RK6Ij>9N;!m#iWl<9Oz_L7F^PC8Gv5*qjg3bJl*ecyaNDmVh zM{&$gN{+~SPlhsw2JQ!@18Ge}S)XJwR&=L7O-YaVM$?O*vhh9KrhPl9^VE-a8+(qX z=B4-s_W~jjmG+f1;}yIk22;XZ#_RT?)-3{W6}7|(5<}(;3LsW%G`&Hzo6@u=bD)|9 zGQTo{D?dUnB~z=7f>$@*=}S-i}#4ab%#F#Sn(u(NR=%;1|}5YEx&#`NLzBi zrTnzcIfDREZ3P9*4h|xnv1$8Nufq<5Km#w2w2em1i?B2M70rMqSSW6&fJ)qf>Rnd> zN47qrP=5h=Z7DCKxq@ZH#J7P1F%OI$uwvB}a$LZtKB&@(b13CEx)Z%CtdUwCCT|n1 zY*2Se0jBS2XQv!fH*l;R#96eJy>zS)9FUiLSY8&dd z9V0@G+OPTZNYs^s4L4T?LrbO{6-C zt%P^NK;8nK<*@#!t;AI=fO&y4?G`JyVbLZBOt@}Wt==P*cuaCn3{e$tKA*X8<_?$=k zW`cNK2F>zIl^oecCj*bqBmcud#IFAF^6fCbM1g;otcGQNuy1Z>AmvlIb3UgG?02!>oiA`ksBBmH zfm<}2)1P)!Ze{9Z_TBH6PteYLE^EZxldtfn*v2^-RPDg&r(~t&$1*!jykV7_3`<5< z{TrTx9#%^r?MLZ>4$_!7-D9BqqboSG0S!O6$UWpgPjCIKl-zjC3P7(rD*PeUw@^g* z;(;CS@XqdK=7VuKvSJ9~-;KlNt|G_NUhLr#7&GxwI_Gw`^q|pkVp#qw2ld|YD7!Vg zrLp}EI0$dB7Y&Wc3P-{pNO2 zz+foPrYsj>X{fb`6;ParxCzJk-rS>!6R2DEm=w)27I8FyOblL&l!};p_9ORRU$YLv z#wA4q{w!4dDh=2_BgJbLVqPeDXq% z#vUgfNi`(x1#8oTbWz_nF-daT8xSt9v2ersYVFVHGk+T5wzB$=>yyGAGo^ z(;0$cxGHlSI$o{MMfUg2FHmS%R9115-N;^+E>2ogYgG~>Ox0KVEv$TQTqt()Kr?I< zv(WOQi=E-AJiA;t!1@~?lW*cgaq=U#i`}Vf`{uP|I?$@whUdp}(am2-xSIlxA7-Oa zn(Tv^9KV8Z$lWpVxi{V2S!+Uf$l<08bp82Tg9obyE9If2DR)YLzFX50&TTqTv z15r}(_`}dDEzO_B#$VzA6Z_2#H#NF&I)0EtL$O`a(_8XxcnL(u22;LAQ_`j^04gfF zYpJ=TM7S(KRrfTNqwb`2k4MY#d+1kyf4FnGfi`7@4IVZiCL!?j7LY|4# z;N~8_(dnI80^1YN-!iO+#@WT#rEuuhOiPbwZEHKNM2>m&0*x>^f%okUreS8Nh3>5y zK>G`bh?hfin%9q6tve;l-Mi3Nnic2OBpL6o@~+Q0tjeReRh%Obf!b?QY99U6wr_C_ zF1#b$J;JC4@nhnX*XUDLj>!|Y)@fEBx_5qmZ`D7V*}bIn{^WNyOPDc8bT%{LIvuD5Q&=doU~cGE@uylq&SEQM9P z1FtFWlgdp1!5{Cm<0}2TkvRKr6gIsMLa8v7?`+sjmu_`7mzu7lZ#1}_I-{080??vv z<|*z%0Et7%qv8FV!7o)_0m4;I+*%jPXGn%zJZ4+LzH2D1=qCmOG6@xrqBGEkLZm({ zzdLYRHkd&3VdA^i=Uu%iEGSUVQg%$t+7Y4+ZG5W8Sz{iRHlOzW4O-Aw@&IL*NFMW2 zjs^+S%67~{e#x2JXFO$<_+E^9ICC)F2`|!YMMXWEZF*=*?@4=>1u4DGd+4W^`C-Yc zY{HK(-%zuC=Ae}#@H-1Ezb86(N{^o7rGablj)9Rx8ivCXawGt88?UOa-SVt>CS1@j zzmn!18n(jNaw;d&;2Hc>kvFvwSwc3!z!sTthKiP#OIn)y0^9hVF#8WVV08r@e=U+pnu*2#A7ExUdb!&Ed~KxBa| z$7?!ao?6obJwS)MTW|hVZw@qEBefuHj5nS?UP?(*>h-9zJ~O`xZ%Kr(Kd`PmLo9yK zHg%LV1w)n#scZMR5TcH^&~e&}8U z4QA{dh~+RW^mODK8N-K{g%M$E*`e90c1JVHS-moiydEp^B49KwBbE>9Z848@`?|wb zS(p0_Vz_&~DIa3ur$`%S2k1FKmmNYY8S(B}v)$O=T*cGbriPDf|eIbxa z2*dWO=?91b&pQ+GB;!h41jOIZWQ7I)_`*uKgmmY>x8ZOJeg`^)d^7a&66kr9#Ue(_pbA4*D)Yd`Bqg*b<$C-09M1B zh*Fs13MSMs9gnK9I_>=xAq{7MHtEEqK4Df+yO7V?0}kg^swO3AA{u1~8ntSQPw$Sc zBj*G3$l7rTIz#5LpJuuL)0K1&U3FVN2#-r-IL0JO(o`1R=v~oD9v`nD{sq%s`X^pv zdnyO6?AJ+Vk32&3M0NZ-T3H7vEDzTf_C*Y4y>kG;n{iNl4A@sOVa>GCUK!L- zGkf`Nu0H14woCF9V;xN3PN|jDeuuXV53VuGp#K`JyBK+BOIAVCu!W}{2|61Und1zO zox@37M2gok8162Evd}J=H(c3H1!{y#X_H*2+db7_pC(A@t6J{oUto|#LY&K_v zS0bL7Ww%xTl=Kd90Q(Xd*E_m#r_WORIxU0yIJG({{~Bi8<_A`|@#c(VTuY)BC%vVf zALz%*0 zWU9pjz52L+NZ>i+VQ6aV!~n|=)wpGr0Oene6pCuNTA%7H^gig#-Jfd+ecy7So^infkY z!(6CaPy+a}mfGb5g~#YSttyi^DQ#nvuq>SOt5%bRo$8(0<`w5v3-aprT-#Z-SS`JG ztpM<(!ady;P6I``S6Wol1^5Gs=LqSiGFFtDx*>qSQ!q0jM62i|gW__RvQ)k4q{E)h zsutQGhAFV0TXt}pexN%xUyYC@98vFKa#j<`2D3#Heg6W$oyc?_%`e6>W1UrMkC>@$ zm%}%i%QaiSNUE7nuY=r(LMh8AF{uz|0%yCE@ul*p(UZ_UK1rZ*&<^sU8|(CuMawBlqW z-EtS0N^7vFng$wkglY@@{Em{kq&pZuFe(XFlxGU6DOD%nE7FtZ-HIf z9fw})mBB>G0+F=Fyvr3+Z^%fm571N#-+6Rzv{^%@c~oVU-HUTW0&Z1XtzIDnQ(IT9 zT=TQ(aekq@lCY;hB2jYbL0jB!_IQ)`f+ud??Ihb04%hgs*1sqeVn=^AZlaNZTsWs* zHC-Z!OPHl{^ZEi>i5Hb^rgBCfeK4ZBRJ+9+lB+g$oE&J2l$ysrk>g@GOmZzb^F_Uc z0qEXfw{LWNEI1M`qehds19Om%PT$^Ld%(B;#{&K46Ee2)KMS%&O9V*3{yGm?nBP|& zt*;;1$CjE6_C8BgJV$ehiIl8mOyYp+uS#tJTVG>*PxQ2wk^On3c?6R)0g5e3L>bGK zB4qm`()N3Sy(m2Xy6hhB^hpd~7716EjX2kn0A0wpC&}m+f8)uUS%K#mk=Y(FW%lp_u z5jh)~*ZCQvSNnoFds|ppt;|hfo$*Mr;W6hvMCNnCVSk14$3P$vI3&=JJvBe*lD+$j z>qTy(BJY)?01tp2U*<<}&R(E_4LN&?gPHsM$HRF!bVrVBlvV3_n>Eyk{H10#yc=o&tpBR zBw>oTjkw9pWH9ZLJ;^gj<+XcnI5F8>FDhh>EaC%+Wo9x+DZ=Kt0Vh&FOF{@NWgXwM zoSmQJ2wVJ`SIrYypvrYH$@B-u56Gj@osPTJH|e zH_+}q`5dgV#5ZQTBXtVzybT^!Z*n#V)KzU6NUI`fX#m2yToWj@MxlCeQSJk+N%1bD z`0N+rWsObC(w60pE2ZhPp{a+^?OoS_v1PIJMiXw(pj1nDdc^Ou(i?3WY^ChXs`8@htxx+Ik?;KL&{QP`c`r*BZyCp37Iq_2`6r`~_o;12xq{gqn8cwYD(nM=fXmM@ z8Ij*F%3rV}uVY1=(B{&^`;o18ojCwgcWY5heDpsk2l|74qVE{_3q}yM#jAyXk%CdQ z!97caTNT^(?8u7RG4n2NTr*|;?m$jEM}&flsPEc6sE5Er-^GqJYF8<;j3q-Tt3ZOx ziRglWvn{o)R>;{>R+J)Yzw6p`hVmHe3FnAPc4SBfnpelDQx|(NC;uxtILVB%tDxP? z^w@W5J|6{V&>rOS>#{oRk(_Ge^mg8>h0}zZK0Vs4h*a$7GB0@V+@}rUR9ahiQiNd?(_Fog@9_7I ztMW1Hiq(V^yJnocOA4i~aB>dBEAG$LSxuXiUVw;lWpQwY-Rz|%2=QJGYRBVRcyrBd zx>BIMx*Ps^Hw~N6mkvMd^Da#0Y(3ifzwQ=_~IkE@G7Ux(SvWoNkBEWJtIhs* zQZ^~rqPHHfTngE2HO2QfN`k)4c<`eXHo$dvb5`b4JjE>Z03{n7cHTnj!Y|z=OsZQg z>-oO#7aVqRU8< z@c@>L!Pn?y&5XbJ`^Y%xagE4kUv$`Lw?ZYr7o*x;;|c-k1@PQ5=#CjwM?6Z4F2$7> zin@@Z?*DSf-Qfei#EUSgSqa^pAH1QR7@9&zxCZ1sc_2qtP;BuFf z!SX_VWqR48IrsswK_-Du{YILXU92L2a0Vx6*O)mBTGujsQe9UEE_(2cG0aW9_k8YO z;Th{2pF2+W&3-}XnXrl<%#|6ev#f7s@*0xH&j zi-}JE4H-;DjFL&x4O;|@Od=Nw*6wFCuK+#5eI+L)!`^S;5sCu%g`7$3txzJC-N+$TLs4O?VBk z{WmEbzk|Am$3LdbcVi?}h`29Yf*ZNHB@;afez?V1SSxNR@$nHUAFk*|s)p0|DM{v`ogDaJFvnF#)OJa00KOoh4QUu5GR|;@>2T^ zK2^)J^A3(Wp7lXGH04&`5TLy!OUNi>Ud|i;j2-V$a($6JA;Mhe@!YR*{6B`qDSJ;! z?;rZ=+SuRj7Jo({wf#pR@0t7fck+8EAin*3^GXLVSN=b^%p5MPw+lV~Z@WeIcK*tY zrKn`ia=T3K=l>T<#%UFH><+?v=6Sthc>7z%I{@NYcVz+A70rNd-R5K>46OodxUcBc%m{r`| z!pYR*8@S2IaAN_)i5F8ct`cB2wlum{39z&>)5;7|wMwXubQ|r{9cMpgbNX0(zH0Zf zDHJFCG{K|emmV)=U9YM4(5?8e;%G21lfQnom-6ykd*G?>?p0aMIj#Q7t^vjW3s;9C zo)V%F{y)|4NyN>y>7TgO|FE1OX^0`~MXFVZ0mAcT`39rjY}?|yG|`F*dh@k`>(~E=DD)@EI%YgDCscI(5UA3Q6z`h)K695s4;b#@%cRV!2Bxm7 znv@NnRThuUaGLQEdY{*XpeHkn1vq@#x8^K%+=+yv@qC!?oPv};+P`fCn;8EDs@jgkCA#BV8r5r5BtaYK z@0wy3rj6lUx)i2EsIBC6}>b7usI+Xo;MC;-u83w4R4^==-5VSUt#Itp_0zMYgUe_|PED z$nFV2&Bdp>$x{n_@;=5BShLex*C7EiI<-i+9PZf~PW8NA%Xz-8w9(cFvwP-D# zJTOLTGfCH8q~JGIxqaDXML~Xg{(^P>g?kHSlS7E_v{!h%Rc91HfZQ*1a~lmXXLWsw^{uNYldt;MX-sdT2tZra5VoV=y5I;9pT|nb7SpUd`r5)3B1D>%@)PY?d68c zbu7B1dl2W!@orW?c_kwR9KHm-1u*5L z%8ZTq{c6<_8%Y^2;Kf^VA10>gix|L z>nAk0uWjP3sXeyLgT~x5d}rR>`Byk20eQ|iJOYg}&@VY>mdxhvpgCn}`$sbD4QdR1 zOBW}CmP|%cQ05{p+flJ6w~fz6uFjd03$d>ElaSJ)Hh-z(i4-+@w&YYYyV@=WJcm^d zZh&012CB0UZkd)?qw=PP- zW5R#$D=DA*%>mlj4}jT(Z7idDnYzvjbnTsSD5X^p;6I=VKXp%xI#u+8U z2baFnr(k`Y+WIJDY4!W_i)hM-q+R_O}HS?$2JSw^zb`#b8W6%u31S0j>X-B<$cLb8hmGj=!%}T z*<4-+Y~ibwUmY&iGZ9<^W534bWc$g4r_2?M8p-tQ-G3ff%~lsl|8?LM z-`ahy73k^Kn#r^QKfj`t6R?kwQ26DfldjeO$=|N!F{JxGsHrFXB|VxzqmxpD$g1lT zT@3x{Q5f3(xr%Y!hr`McR%PzZsbjpT+|DJ`$xd&&O>o!e9RpnGq&Lod^_SS*ZzY$W z7Y6)5%wTckGoAMl8@QVefq8t-nLV%C*R8@kBxp3rG?@7j$`@IaD& z@AE??R_}24LA6dP+-bZ%Q-osJX=!yO4x0BIw(0CmFRWwV6>L8oW=Tu0XUBcG%GE80 zMlWc>AX{nbMDWbs1?(qh2X_K8^1i{=d-@nP`feZtCD}7-sR^&NSAhnSrd!|iEtWSd z`S9T>bk*Qv=IOnMbHah#PK4-!uORr`)LH2hoT{p^187leezCP?EhCB0*1XM289 z0deyjZzPsTyr)cD>l@YzFIhjSH}-;$uf z?Q9mum9-E#SE;^#S&B80^?QbSDq)S`SxyDo_)yl36_%uExi92*DsI}?=~=69sCHJk*Srelm9Y_dMuF@dJp}HI z)7_S~DIX-VI9;%$Dnq#}_G0Y#vGr|#=bG+{{i@4C`06@F$7kqC!_P+SJ3UFik>W*a zzmpVG1&18|pF2qtKA_@zOSlyl64zM?uMwZr%Le0>MTvZD#I(x>yhbsvi_HWZr*xC$ zI*OGyszwTORJvzxD3-K}%O7yzNs^Ar^|4d;RvoT_Ii*}$4$)-jr(%tqR-Z>(4qHnk z-(JnfU^X;FO4jP-#Xt`25!Q6dqFP^@dzb{<$=>kzK*$b1W?V7Q>xF#}HDfKns>H{j z_m0)~Hk6&aW=H?d1ou8N^7TT~@KH?AcLCr2ZQts{0I%7~BP3sZfob~~O*UbGn1(2uR*!7K#VumoQ>5!B{vq9;M# zligcLIy* z5yNPS#ikum8Irf@ri^Jf2qlPAfRQk-`5r`%XQ7a*Se2=VK|5t zM!f&Jp^A9kc!X&BZ2*rd6L`&G6p89WvQ1j>3l-k2_G$%EMYWt~VX7*A>a+Nf7^d z%7FlbSL&VlLDGhe;WSmde1Netz=2ophIvKCSY0$4FIm5bn3TiuqjRz%_>I9|dB9n` zRu2Z`fwDfs@JJ85YIg*bW=9-&bp+udGjs|&a93J-^SX&3NAr|lZ*3XOxu^a0$y#J{ z4FXG8I>pUXa=Fz|*^t)+1^V8UN9=`u;HPaT@7HIhnZft?Q{Y>~@rwS5A*k2iE!qU^!@D^8)OOVXwj`!D- z%ZM92WbXD03xRCe<4}5G3txt_)soiJS(Wtec~RrYW}%Y%cfJeR*0zT&4;jh9)|)%G za5rjMpE24N)Ecm?4hYR*Vse*SZ}P~8bN9|Hgm{CgMB|LFtF7xQP>&AG1rB5^ryHkX z?;hU!2p)Snd@~l9GXSs|7E9#}yXbx;Wkp^aCP@b8j5pxTSABtTw+P_Ys93r?UYNvE zeSF=fu_to1uv4gXNP>DYbW#H)KpiN;J_~J&QmtGmuB^B<_wZqMzt-6y_zF$<>+Ljw zu?MjEIr;*Kv86_LnJ{p@Hya;*g{-U3rTeZ#L$A;E|;|384RL>cu2c~k==+o4g-G(3F z0$~%+o;sgH%96chB>-z#=6K0m+*-kzF_ZpH+?4lRhJ^V&L;4k5!J&N`V_z@9QoeT8 z!`bSQq{fW(0+{U1(nv3=#zv_y;At+$Y-&@xve~#O2l~X{0C#4!9EqizqnvcUWc1al zJkwA$c4mHiDCY?y9R-UfHhV^DP#Ll}UXg!26qj3=r=^L5X{BFu!!H(V$>O{gGaXwd z3%kiuk}|$j-YyBvtlZ|(Pu+I7rqk`pRvR(yhg^tety&%4KTsZ_shppr-nzN8+m-*c zS&Bv?rc2nz??Ocj4Rh3p>54sZ)~HQ~rW=^E<$dehUA5`o)x=Kq%l+1uZfAD=8=HK4PWiH)=0@WN_eP|>%7R!zQP@jLf@f)*z9 zsv~dVTN~-r;UDZbwsox5>Yp``we5EewB64hjMDLCv+$sx7zp$j63pN8_eT3rt?|D7 zeIzOQ8@-|EBaHTIz~#X8PxhK$6tP;dF`^0|Ig!<9Z-lsAxgSL7OeUj0a*@X2+$PzF zK2n||x=IY#`?Hjn3wKPy-jnN!R=#}P^46Mp9eH9b#(bYzzMqlLK``TMDc79E8401# z%(fR~m%l-W0_AOmG3rddvw2Q^8@}UfPd)7wu_RqfvClap3C~hS4L8=ggzaZv2W#|u z3UEFQ=4nT(6L)k^!Px2-H3@<$2CIUK`+jPDh~;&LA1+}4Q2)~3HtL?v{Lm4@`%`%c znt|D_jH-Kp!^zL}Xxvx;=*7I?_}+{3i5kh{*A2(G-%vqob9XTB@}>XQwum^#vEmQ* z{g0UhwptHIkDwduR#?K;ehi(6g=x3ZjaQOs`t{ATs&?HpS6vJ5@SXzL#7NBjz9=&* zrzccD?_R2c=(WEaouYH-1mb;(w;jflT7N598*b1ss`#>I9h96uE&T)%X#2EORK~0P-oxhS$;vGRsECJ&^YSDJBVyN zl4(lz`MR`!a`kG_Hd-W`TJrR;=;8}UXc@@h#qS1n7XJxNnYHi8=WW|^$5RvoK=|0l znDq6gtbK4ZNtEp^)VE*ils57pzFncaMx|4|vlzXHk-lN-;ruDk>Kt zue>WE7xqp$oi8j!dM9*Q0ZC{XEH?Iin$h&9uLp6v#NE4nMYV%Zm!|3g?HI_nnJY6^ z(+`4*mLc}I9tf@u^jy3cO2FLHCI12UUwi2h^2bdhAj~`dP~^T|mEqm)JyIrHyjq;- zGRJbS?0M<>*<}}OsJbQfivz^QeD%f@Qh&gLqNx*~Zea{LmesO3M!LWJur`)OC)Rcz zcoKg<(MtYvmfY)BD?&K44dNrX8wyHYC8wx(Y$=rr40Y|tyEX+MSF>?a-D6*P4xmE} zKXZ;gBN7`PjSs}P;Fg9ZuVgUs4=ByuA7r%`>q)dA99()vIMUVeqFN=!Z;WXc&|XZ= zT512%D&VacK<<$CSi@npl9Skkb|2?d7q~2caf(PtXmDsD44?&{CcdzSYnH!cxL(lE zHa;B_9G#CVk|-e8yRehsBDbV3EoisoewdGG|ym9+TjpZV#{pIAtDcu@@kA3VNw zwV8=rbMvOwb>&hCjJeykn2Z>r0yw1Q)r-oMw*>F_sSy@!$e^tAHhYnm&}hC?xw>Z$og zS|E>qc=(=nemMB2IM*K{09JsN6;l*L(^Q!v5P_2T-xv^}AF|?0Iig%0ge+WI!W@dr zvxfCmxds@Tmf8BpsOp)8?v@61nfT@=X4(?quyzvGW#dxH_BvM9GyUwAFS-l>KQaqZ5T;f$R{hpp z7J8W&X(;50A66*(?>0|Pe~bxVqtjgoW&9J*!2W}0Twal1d{9VT4mE)lLqXZd_d2js zcW}drSDYdK*6f6IYuNvw$UzK;unBAEr+_`pd1f`pL(Mc1I$A?~QTp#f9XugXh$rBJ zZax7tjRagIsOg5_&W`4DSXSbwzTF~MP9mxj*7I2#=9aK8W#CtdSYp|H}75!!FpCv83LpUNw1BA!|?07^9cNEq|wc z+2w9NCNi*Q*w-+b`R-p`(SH`QkN+MNxV)GzZ40 zH~x6WI;3d)QV|zc1Rn~G8w-7?5b5&$R5Mld{^{`4>VJ#m{?Cm&ci?2lv0eF%o&f@A zu?tv#vqUxK#J5|2`7|EI6lS@6_94Ek?1+QEmjjv`wLm+&#gcATPWvcc|E%e9=$ zV8O?lKcisur25P6pHl*k8u5=zzs4Pk)lN>yq||~9Q(eH%pID^!sJ$X+XxYKH_?~5r z=PADE<`jkRuh%$PT;kTSxlVprK36buJL5kbr!BJomz7ihDte!kdTYh+l)QZn{g%Dm(hk zG-%dUyR`__tqoPpz^^umY*tB>y8Ny@Fsi*^Dzd+|S2d~kG=qYlFz5 z-DTXhbnX}JgzNaN1K018y2)3D)$NkHjLgNne4p(agQASjG*t=}Jl16NK|vqe3QmK| z-nNIh$k;sDg(V^pYsE-#pL($OUrThqqFalOL059iD)UcLa!i$etdxm+mz>)T8Defbd%FGKOnQJhE_EarbPdDP_$lb%HlSG8$m%f;G%4z7`hB5vSn-4jISo zR-b1>rdM}fSK^K=8iL8>vqe+yegOgRTfc;nlyGO3_d2@PV;h`{u@}ky8grK~k=Q;R z+8jLS;M>t?;3Q9RpO&IRn~IkS>X?Y_ArB)lJ7`-q{`>5f6U^I+t2OjN^4`7`ytHJ* zkio~*gBktYA@bE<-(uJQt@|0q^kQ^E^^sHIkj6|pDu9q4`2NID6*VRp& zRjx<8XQ;`u*Yb)yJ7`XFN7YQ3RiUT?>-^nH4-8M}&9LDqZ2Pxok=2j8(H#JCFyVnd zm|$(70M`u^aL>Yh$sA`FTq6X=WHvs`sM8#iW@T@f#U(;P!Gvzuj8dYkRQty zWY@DVnX=eEt1t>U&J(Vuh{jKg> z2mLRv%Sh{BW??BptCz$R1Q-K15kbS^)SV%SVwAB*@RzvF`}Fn;!t76hmhko(nu;)ECF2=;{{ z$f9BE)Ob+@C2_)1)kDE}717cUi}qY-cjh}t!qS^2SwHE-85?vWAd4A9FW9`VGo}QO zOdnolx`ak#QjGIQ(&4@sNgYm+c?glLqiD{cTZhy{DVWkD$IcNzCkdYKj%r`EC@&(D z7)=cQf^(Vd2umY7N4kbXtBStxH|3g@fP4!25wB%g_ukCmgOcl{A3DyA+uj`D_)SNJ zv4B-&M3p8Hdy3uIV|3|lqkSULNcY{t<`xTqA73Q4jd*1$UB+qSGwrJ`JKxJ4n)+|E*uQM6NA1Blj zfPQak5B#Qtv$WT#kAE(*->Q|Nc6(mos9k;MrrCl*gsQ3Tc_}jKPTXYCncsr>U{)YF zFAs|~$dNF#Oiu)1`kZP*1&gCe8~Ih;JR=wj4HtC-m%Qb!f-OY^b*&it>I?_!f`Pdj zGVL6sC669%Rb}=TZJN9j8#qb?6D`tXjvBN?`>tcAEVsm}5KcCOKnkgb$T=ol5pvy7 z(NW~&kmj*ri*fg5mW`MR7TO7OU+I^}`^K}aO#Y__5WW4&#)+3l`f;Cv+3bNFU)pgs z>+zHFgaIO_3=rjk%CsXZvJjO9HA7|wU0E)kTau;#&^geo2eb++6}V5u7Z?xRojdm4 z9yP^M0F}c3Y$B{|-f;Y)FbpyWT9UZ!v^JZluf{sqq1w0f$aNCl<-Fnp19&`%&QCr; zZu%&=vD)l<$7|5e9(pSh@v+UdoXihv^TVI&JtUDX3xK1f64=c}du;N-+>cVS*i}{Ny}Wrbm3TJAoF7j6zC-89%1}6+IGF4! zmvlmde6b|=9%!RDT#VwW8JfF5PEJODR9$iF${^Np?4p|rF?qp;26KuL^)7@YI8 zG%9sYVJ=r#w^^mFZan9!rh1>G$0$RMj9W2`BlrOsBwJdJ9Xo5vFJB;9sA|J+{f&nU zc-UJ?HO$=iW%NKdq$JPpeN8Oye(+jP6hIFa@+qTq3UX@diCG?Mx8jTBDyQxqpy1LT zxFYcgsUhsVO+V%EdalJPd@4TTlNbv{v9N228x%yS9n~pXeFMccGzej*cT;ZCI;l~^ z6bb)!Vqn;7nX7}sjG73S;LoB|bnhte(<^Ep>a?`x_V z9aUt?T=k$!N!zBizg+oLN{DLZ7eGXjEq+EK!zKPGHzn2j)FK)sCg!Z44qrXQv8RJ4 z09D~C)XDK05ng0KETk9+dZ?{|F3%epuKCa!@vz$*9iWW-Fb#a>T=RGLkAK?mO4tRW zP5s^{Qx8DV5K1Ok+c@rG$l_|3F?+%kS36IzI`**1kJ&R1Fi4%!Q{G#G89fcDgj&|b zu*E$6UZH|>cU@;(`X@Vq_V)^vv+HlV7{5Xb z`|9U&&3Xe*AO^xHqCryp9=QY3*VpB$@nm&a=z9--Nj)H`< zV9CdPjZcwYJSQn|wOI`;*?h+YuU|M}vASUUr+StAxMuqu1S)K9&@z=)il!vo-2#?n zm@;aLMHSs0q`kIW_@J9Bfh>&W{MKHgg!?HX0sNd&XvG$v1B#JK(zc?mX8dReD)$A_ z;t6>7EF!s?jjbiE#Am=l(@KM6>IiuaNaKh$1+>c=x)}bnUe)zu)Q*~B)QE*)t7haE_{dMG$515V)8ozF2 z=jbGSc+_-#P1xCZ;|D@rH}annn;X(PJq<8=@wBzUTfZAYWB zTVpI=izTT(diCB-qMRmy0_dj2Cs#PVi@${s1MQE_o2b9CK5P!1;O>tNpZkspB?>Ns z38x>AC2fVDldSnkBe5V$D6==^)`jaS5;Lz@C}|ZPDPA!VJbjduck@H>CXS_Jgcy*d z1rU=f+`JA?WGF0#pO6Fm5M5kPV((1kAG#=hmWjiBQ%2o4{z}n zv|ahCr%zfF=XwrI1}f&cpG_V{CAg^KfhBgm>8<6gFfTc~>@b!)PQFI*!&dJ$^T)z3z)~gttuOH5EtD0N=PTUdFtAQtp3kDKsN{WHq8O?=~ zB2g=$14)6VL_o}B=0Waqxw}fe^l7L{MuCi83;uvc2_)nxNN5z$PKV)<0=pXWO{vFO zCW~^u^TRkD@7wt}FI=r#3x5upPgPh0Q+RncKpyldbby{;5~9Pn+a>&#$+ULPk9XJV z0{K`Vf*;bnx^j_PkjkPXht}|S701M&zUrSwOBuntt~x@>qfNY3wu*bo8jS5R7=+`( z`FwqlHKyTxx~&1aV}Fw6x=7;!dzpp^-z{8^gvBHV9|PxsTtNM!L!9Jf%&b1g`8jb} z)WFbdN|&Tg*CTl7HRZ}-%zQ?e8gkf&d*g9peV0+5!GX7S0g=~dl}S30yEe>Ue)33) z&X<&4MJH8mIrIN;>-*8|2v~UOV4nCKAnt`s0}q!gT7=tk;haKYU_d#QqvD2|W5~n@z8yO5lStvi_&TGQ zyb^nNkS~?m1Uksdn>_iVe33vH9r9?nl#vj#H@ZwyQGNbPmTjcOUXwDxB0>31R#+8C zI&f5Y^pKEGK`Pdgez+k4Fu0KyXB(lO$p!Jw8@d?eRF{pVUMqhUIy$^Cd{P3k5r*Pw z?Kf95jv!XpE2_$A$1DZn$D7F&;@C?*j@L!59Dd|7p2|+}dNP>;BMe{X9-3H#9P*5` zh`23ifd;o+p55itchqS&dh@*~%|fhzllob2oQjNLWY};AAi|de^2Mqmm6CGCF7VNQIga4R6J+zdJ0~1Zm@0Mz(3Tyq(P=Bgn|N09sK;+jxI#7 z5Kq)soE(5M47ow(iq&Ht_C|ob9KM_p|l+tm|p_?LlV_le1YIK%m?uOZ5P?Yy$X2 zNQK=SNMBN=j8c~PD&nEd)zG2S_VI5F6v=1T_a)49{8ZQ`=o7_%wx+-#nlm{4Q_$MV zp~V6udwYa<{l43BMHiX^H57<39MmYdif;0W%kHrZpLP748)>nqx&Rftu54L$60OPk z)k8QGi}!K--3XenT;@38kp9=~U#}jY;z;}MpNI_{WE5OQ$T>W77$fcOGa|hSt)XOm z%s3ww+8wT25#)hpSG9;HNP%0l?S!31aC|q7d^xza8aX^U9da$*H>{@p_CYmK#!qjZ zoMg@J-H>+kSGwvdNY=Ki%qk^>4yGtIHX7Mx@27HKi`y;M)SJ|wqBNd0j(%L|WsG)MyiDurSH9KIrEw3C z`PLy|OYPqArht*fK+p9X=9`JPd1R3tLgx_YM1rS4dE}kV8O`@2rXfuuh#4Hf^OWtR zI?575j~Ix4bKMA`0nm#|{oWfw=Yu?)pEQPFw-v`!;vr<%hq9@$1i^lS$K7huCQO)^ z@8`nWH1|G1*&KvjzEZj~=WdR&zIoNo*v*1wIU7HmO3HwYLrX1|b5@=1stPUO6K*!=wEx!?4Fvtfi%g zyuPprbFFr*VWQDu)sjSJ=CjgE_wLK7(w!jHzH)nwqnWGV391_E&o?|{oeRqNC7~SU zLCNZ?S%oesh#mPUs=EHFjP9ccYD(slxgksrL&a-LmWzqdI}7x{fvKDL%m)Hld|_=Q z)i**~3O^Sr+PVw%l-{`&BG1ueo7NWFYU4k^Aid8u{$NA0A6{#j7hj#xG$z*pWc0W( zCK#ZKP+UGR9KW^u?$8^@0lZW7Q@6Zs&Eaa{0D5qdU^XD}7Hac-^Y|%XQ!(UVkrJM$d-rHnyXW)IwAv*tSJJ`y+0Y^2wJuP~aQeP+I-4ok z3+668V}r7E%JAIeAztaKG*<#Bwfm)~bnzXy=t(Kf!ri9^vb}JqpvT$T2`MVbdjh%y zdIC*aT_u!@dHm^F2?496_B0F~;g(b)u0XaS<$EQ*Tn@=oUk^aRhrQE<7LS1UbChNhzDmU`qfT9?v9LR{&n z%h+rgHA<5N`Ic`zveSA!a3t-FUw-eVe~%ILAq)0zMvuFhi6scGJ5>TXo!}moBUyTj zO{%yx--KKmF!3FA=v-8MYrFfeA~dB~#T%R6%e!rKIdDDe5ez5rhLj>EmVAmGgYpe2 z-!UCV%PTyAO1X6i_)BGc_&OeA5G7tWY=+eBL1v{Ht$HWEGyH(FBN9=XPQ;C~r$0o2 z&TB#$vr^xL@&o%{zp=%;(MybaFMsgTje$Ns5R-;S2r&yh+5~~FXj^?5Z>(u7@?51+ z!KvsQZ!=xr#+88IB+}R01aA^4^Us5&&LoU>a{EfT8qQ9%q@@aKVl(K<0Jbw^M0^&3 z3zVO^RBa?>x`UK{1#!Ab#fG2$l-J`l1d^1;m!@Z$aZy*Hr3+O{F?WA0ORu1H zuk=h=zYjIR)&GJ`PKji^L=k(O_;gY0n+SE4D*%bEUSBGn1KF2*1kHftu& zKET)ufzS-MI8(ECje3noqMo1e-cW>291$Twq`sGtHs&&{l~T%FwL&VvkZ&%6QA7nz znq4}s+ap;A{R^Xz3SY*YMHUb{j#K?^Kyr=lF8`xL&gMvn?p1h^%az0OV=+69v0)`D zyZnY6fK-s3wmgr@o?WaOEH0Ms&Xfr!vNTrJumh;PQ4~DUWB4en=06xJhbZtafAH%B zFQFRmR8FwNAZP_H49VDI`!(6!xAHGra%+b-l?o5CBhWq0K%q(tNMD81?sv!MU=T%!hq% z47YI7r<;jQX{}DpXtOdk+M==k-v1$-s0atZUp1&VAzu42!a;t32WRB$GZF1;LyEhd zvfG0mL$*4)>q?T|z06&Ltb^qv9^tzSL+bS8Z%)PSG)LspDyIsu$}0mMrR|bLnJ^SZ zE(LviWgiO&yo%YInNx=L+=dG+4W`J_<9j7aQY|FatyC8Dg}+zMQ;-VAOy#mD;C)b8 z=ry*GE3PSFBd{`Gq41ybXL-%XGnbo_H09hja-m(jK)80pA%M2p9oYslD`{A6DN z^0G#*1H?<#E_jO~xhfv}5Ba%OqK#_}dAYPI+*oqlPBzB(cWfNK@hCnl9CsR^dRW|5 z#?vcWGBu0*xa+5In}7(`?F?RZPlOs1kH0Jo=PsHEas}Ob=Iiq62=H#%x4K2%d^mYu zr2JDIY~)MNab1whtH@R2`wVqa>$nYIXWMw`kjEWD&ue12bB&&3#0;^@hYddd^?1T3 z*m7+gLZKTUNF`U#&vqENE9Cl$=Ax{5C%6U<>h9N_l~7~q(x-eZeKf1_l{oeajgbyA z6XSgT;Zwu|?=KGse22w!igr)orzxv4#DXhW#iJb%T*Kbg@@$D8>2sCYb+?LV!wH|# zT1e#dNvbJ9S>C>p%I{DE#>7+4WRV#ekY84*Nipjgu+4KbcI|Nsl*g$3e50vvW!H;I z4oaxd@GVU%e;AZX4OeC|6lrnyc}z3%HY?^jTiRGMMVOg}OW|E7zMCLzuH}j;&Ac>( za!NFI09|{>Do2(CXW*#ebak?30|HL^8w)+V=`+Gn2=7i}%th07#N8uIh&;8mDQG>d z({}7W-*Q9D7tuG+nXeRo*9=_0k3>7d# z6VtpaMAY|iSd1#E0@uFNJB;unnUFkb$&Ca%;TdilKH!G~j?~dv@z=?g)r)q;xV5o) zb0`V(m5o~;I0+U14e=<%z06A#VH-4)5}pR9kP9Wen(c3u3XS3u0>xJJVwW1Ks$Zn` z3lD!zRXWunO_e*Psur0Y-0koeGq`T2hGT?#&1m@LwmNhi8mJ1zC=+;^#2Z%8OVoe* zcKkLzjDvuz$R(l)F{U`HKGw5__V&2z^TjZ8w3RCHo zk!8ErZ_4xeiJq~Dd#NC4q!d)S+bZ3|%MdZ-cgmgMj6VkG42Mkd1?nzhf|Ll)&~g``FA5~+C!ww{vfUCEc({_~9rNMn#8$_n0GZ2B+@eP6pTEdIr2IOP z4nAYtcKJqCc4HFDA(xG{aGT3>A_`~f-F0USPuCSP(KL1UWWwD6P1s&Qrl&e{_ASH_ z6T?0DZDN!5Bz)pIbQyJdqMHic)pSG5=ic5b=!1oEQKburabYY(G=lkPSZ+p<2xO7>IwDyjaCh=uX}>;IEx*y}+R`@W@20HOewTtPSLbUKxoosGlsK55 zRG}T|=!TZ2^c`c-o=)Ba?@H@bZhI1`X&meHm|*huGw=$$6%a@07!PiNTTSw%A514C zON*oE0;SMUpc6f_f;g2~9Bc-FJpT@1#s6|asckBoV65u3!x6GGLfFaI0LRJ2_fQ=6 zKz4?28QRGg3&L3?&dLY+jNcoqFSsbh6>}}9=iT@`$E}z7Ql#ynz@(9i)*kdeoo8_ zBL7~6`mh{7WhC)Ls)n<&l+8;miyCR7)C81y;|Dn8Y<69E^qa3JikB?-eCym#Jbx{6 zi0K5&HbafBm8Vit)TFPrlPCh1H5}pko?g*Yi9fSYQ@mZ)p}!!qE$ws*i)FLx{;04f z5OQuGSV`Wo?BPeCAs|aU)e=q>Jwiy=3DP98UW6+!4cSgi2-E*GhZ9LINjc80?6Z$Jzvn z_P+KgAgWP5PPmJz#VEozBP?x5ONfU0i6ZI-n5TeZs|q%hiHUr~uDw(Rt=5GoKJGI!~7bf9uM^bVqYWJ8EC(P!W zLzMA3qPxVqax>q@z+XbX%e70EC$=sfNZ4Fo(+c_~GUp@NHY}s_v!Vtp#VAn~|NVC;3th^Nk}e#Q(=&|F!Qt6x?G%i^QcBtFQ~fkC#IAYX{qt4zM4p$X2z#l%Wo)&@g^#uq9g0!PMp^T?d+@%-oq3Da^ZX z*IlTNWboF{+|Tb{1{F>n*Gx@_CE#kp2M%36NI*Kp4YdYMNAa|vTi4L5#x5Z=leu$Z z0V2F5s-s;oSJwgJL)jEes5CuGM(=oarJxIFQiz_oA6`ZztCBgCqz69(c8sW%jy?PC^`G$oy- zm|Zp%6QsUOSE$ugC{)a~rdG`93>fY9OZIIoEyWErR$C;L7ROka9cjf$TSnyJna_RD zP?2E2;4z)pgR3!pdKn~wAWkK>_?_H(KBM~lufMhv!-jyS`OKafXSW(P&+yT4uUF=_ z_Zy7_Z2WwVnL1hNJ+v1cWs4SN`Fi+z_yMn`JD@A$fb`MH$ho_bc;2nVvxv?74!5(2 zCvdaAfn5=s<-?u-+vRernWh>mU}|22DbPK4*{)O`4gfRcKE}QJQ!e9Y`)D=n}8^KP^X*P`BA5s-R<*S&KUjD7{)^uTtgmVi?hjl z4k`jUqLn);f-HykiCIUuhk;o+;pIo`6TK!*vXy&lUvM)3KR|3J`=Q4CU(@V2zVT-+ z2@tI06M=pW`{^XPF%w^`LJa;(HmTZM4-MBi;`oB{2fwx+-Jae<>q@vO~% zyVyuKRY^^>&tg|MUj7meHn)`~0Z(O*h_#u9W`5HosoqGvm6q^)iV8KZJQBM>Y%?xn zXRDl{P$;S;4(ymAMQR5jD&C=Vzk(%M(G{Q+yABwQlD!*A}lL zJT}&^mZyfVr85pS_e1h+z=kNGST2xRrg99TH|gT=<#lB~!OW0Wr zh8gqPs-TV`STa^_N#GuX4{J4hK_Ng}P}pKN$9GYoHf?L_{d|EUF4Lrg`~Fx+hC)gN zmG$^Vu9*sw#%frD+A(gnkMUhZQq*M=-E}?LI(eU$Xud6dlBh^E=FYe1ybmRlfw-7+ zf~$3>n}&rDddxO8y}YzNwx`LLiyvnZ2OV|GqE4^`uV_*D8TRW=%P_;tF$W*vDn}uJ z$7^ZhSLj7G<%RYHe^x+eLCo4ul8Vlroo@AG6Mg4Zvc~X93Uqw_Wj3GT{pHg)fAhRn z46v5%*o6|f57++WRWztsF_Qqq)KypZGdfa!w-Iv<5?YJf6vlG8xC}-b$q_7!Z`+|E z;~)`{-J7hea}RlWx0ZY=KA`n)z%_RtS<+5^C)`bUn|ntUoW<1S665Bt?^7_q^#uYv zQTVEp=VBdqE~Jy*uJe7)ld?`$NafT9mc*{Kg1JuK7T2A%W=8*J!GGa_W?Dyb$R22a zOaEwAoa|Is6|Sf}Tr}G=Z&FY&ee3Gh!Ae1t7wJsTI!Sd@$m)8wB;$J6t*ye7?sO49 zGQzM|XG~a&bPPC7n8SCoC2V5ipt8T&+CAj)wSL0t|0ZFTL{hIK4VpoGx%DUy6H3J2 zkwYRQq~AjLz6vQ#w}4U6d%DncpfEFXSncy}(#1~FT^)HRYd{CI)V@QTUV1n4klm=^ zwMo1~-f^v$b%F{=n1!fjb}hGH%{LRZEN;P5w!w`WNSg7DXof;8*BV ze15asropYU-nPCOpB?qOM=l(^f8;VK4Yhx;f3km~%ZSSC#Nk4$8R%%KVe3G|qx;@f z4)RBhAELKp=vg*0cUSu8Jj@^3VXtpqN8+sWF2MST58dgpe>kJL3Fxn8O;IDupCr|h zX1!$D`WLeI&gsgk1W<-4WSQ!UM%WTP@jC$h{ci*q@SasY{(q2^ z|1IN6xkx?2Sa8@^^uoVV-DiE8AQ9y5K}w-6L%qk~;&cT|;)DIy7*`B?mg=t;k6D3T zw9IjJ#65FPuCqXkA-VNndKyj9W4Se5d!E!Xi<%lwjM9FwvK_LYwtD8ATcv8{zSbj- zu#M}>%L8sFw*3>e}(8T&-hloD4dG}A31xUL>+f^_?wpge^@6s zEtJ3LpEs@q)PG0US#s0(g>2H4g_SIZ-ArZO!Ae5A<1_W545uk0bip?Gkf`Z1Kcm4V zu*VR5d>CDa5v`}R`+u~He+zl$ppI*X|B7eI_|zBuO=+)9g%;+eyM`iuc?T*~8V@k@ z$Mlv8m8F$meR}-mZ0T+;)na!|pus^QhT`?@yrR{yv1Qpi^ChC7U&geYB-Nf~t!bI@ zi&F(jnq*(?U^iP*cc2a~+Xm-NiH>yi$=NFb14fA?=5CZ3)k1X_Zi%NvQ@BIXsMQB z|4`j7Wo`u4FG+dW^TJjxpIdrg|5#)iyqTZ7<$+vzp+br!44GHF8JxJ>x2mnVp;(by zR$bvFT0JUm`g24Y7e{BtFWeajk@yMre;~nC%$ec^XPxMEgajpFz^OEW!FGJBUh9lL zjQT+#DG`FqUtr@sIkRe7RLV&xhxc|OpHnc(eOvK>Cxa(qgpWlAKkbwPjNOZ?ln|7;7Wze-G38emRyITKWJD}I-Xyv-R-&V8f@;Us=l((nMaD_CLtDZ?UfPN19Ig7rB|EK=BHLRbnUB% z?j=Z#(3UJPZp*Aj>qE3fMf=yS&Sgj9!${(bIX8#}GE_<#UCzBGhvanK`)GgKr*-iK?D4^GZcD~WRGlm*RhSIw%Cjv8@6Z6 z_?3v+*BSS}y8mcmP<80e4>sc8;@kIXXn{MgD}!T(KF*(AE=7ruJxzD7UNi27oosx7 zi&xzco86D~9`xoKa$G4g2O%UxUwY@4IwJYjz_lbAZM-ha=HAi1yaPJ8nGUy#!KFN` zSjcf0J8FEajfkVyu$G;N-MchyUV7O?guuN~vl{vv@OvIhZ~>RPbGeH*ZW@_|B_#66 zz#2_X&Pzx-e2Y0mSbW^ESC(Y3(1PDu#DST$E$@+dMUFiYWYU+&E1HM95uKnVoB&)- zX>%9XsUzm*?75bq4e3$pB|p9(inp8fG1}|BI`N&PE1Pp5S@aU6`Y~=^VIXRh{y?a} zXfZ`EYehN8^mxYRtPJ!Rznc6?KKwn`^<2SIP0Lgny+ubIFZ}Hkl)~+KPR%5 z%OC#Smm+N{Ro_ketKgR@*~@y5T{Yiu+zF0mQ09xo;Ye-r}uOr7vC8iz|Gtx4_ zJTNq;7S`qYoo}ppoZi-=eMosVAVG{ROHt-`U+=1S!s_>F%#Gu}c=h^7l~tO?=gP^hmA zZH^s}Uiq?S-dx4Kil_Yb^C_}i6+zQ6cy<$Rv~8)=8ZosEyHJx=;Ct?RHFM3UxLn)x z12Zb^bo>(z-3V%K!zz}-(CkgG>q(kI?>0S^M>=q?K8kc|>m!BIFZjBacDVaz-dloW zIf>3)SDI9AJdx!L>>tboW7PS>K@_#L4w&+B1?QW6hiALT6ca-oOJBQ{ysaKA76S+? z-FQWYvZ@;QN@8^$NDz6w)uF6&3<&SUt*vq9XQC?XPi2_w_v1f=Oi96|Xo$P=i@Mmeg2DhC4BQeJ`Tnu~8nLUcD0U-oo!Nt3$w@-@$G^I8iT&Lm+X5x)-5UqU zbJ0IF0jDu|1c_SoS9(q;ROMqEN!H=}=Osm5wAyYW!BLcx%RNzNwqup=dT-^>XJx)7 z1rYIBGc^srW5mefT^8IcFW?dRVv@OnGsk#EBnj^1-Rc;=Buo4By>davnGvMS+Z*T= zOKK^1D~%{msj~z1$mh#MnDgv1AGwyOK?b1qFhstBDUxR3Qw~u~ug?EQ}k;6hm;bW|lK2Be5XdzR++V@?Pml zJKC63BR5mQ!1?8jx3%-jXPa9!{VOggEe-3KtK8eG!4oi*#U~KJ4g&}fq}+&8jN|1=E>N0 zQ=fS@DEk(;U3=GVn=BcnS|F&d*gM=0TB7JLX5-xKu3_XHt$8{#D$4U*@ecV?gQ%pc zIro!h$5qX4@_|n>5Y_N;xjuw;PH(*1kZ(MYw4hIB#B|Vm`xsrC{8vsn-V=&(ZW9{A zL?FL2WFo9@2l1^KJI%M+vYp)lYJ5=}WbxqG!BJXZ`9P<)1|Ca#u23#5`t(lnmq@ch zw#nyX9hhn-<{wME^h?Xm` zx2bSbImFmj@k~}P`0iSD_mAv&5l8!}aW!q95H2sfO8}P&WOW@>#GESdE*mMN;z(kF z*LdNTFiZPgb^NPE%xN1TM=l+%S*dj^NSuP6r1%7D*W@5^XGE^Xttm$0EqWh+J!Ws_;y7 zltNmD`3CQUcd?NH$y#e_AFj>oo5cXE?`d<50~p3-#z#V9HHV0jO(?VyL42=56iMGk zHcQwtr5EKCn^Y6_;HdL0yJE+xgzkrcB@`O=(ZV~zL)*HJfYrWtbqQ`3aphqI$NEX8 zs&zTrbB>5@VqWAP+^-Byg1F58ht>o~9D;Q=ch$?wsI%qs9f!}df0 zrA>%wZ}Di5#g>fK4Q}s;#-LZ+(B*X!mUA{;eds#F7H8o{;T7Kv)w`707*0ly^*tfH z83DX&vHZ}9ZQF#dCcXgASWrj?3WQw_$&gyEw^Q2SJ+t#Lw=J_-pUMQ_k;~96@+(zB zN$k>RqeAU=@KlA{oglA;zEKOv)r3g@kDaA?9`ru1**@G!yEP+o&OdOMHE|Ftt|oYE z2ro|*^L2`rB)<8nw$o(~_qZy((>2R5w3<*R!PwnzXIzphlBv*OYMo~_Uu~5^pd`tW zw@{Eeq0TXaSeS#?vn0C2N$b%gzi%X;A7j;25@xDRuCHE_%C={8s_s@CUpKG+$+QUJ zd%OB=QT2Udm)GuWR`vNghpy`AcE2NVe?_Sl@ok|3Wzoby&4EN|X}zF#kXT`~qG9@U z%XUihs&-)_QfB^{EPfyh_X*p&1L7Ie1`U1o3GGIHO6#Mw1)RZ;HH?{Y?C+=XdpHJp z84t1}y!FXy^JX2zc6TpZvEYS)t9k=}Y{jxSzYvLKXu9RQ?a0pNDkF)PSO|{W?0_9e z`+fqz=4REul?)Dv3#1~8z7@MQaNlcOM+Ttb8(R2P-N9lXyPdjh_eHP?7bp+erZi+i zA5OwGG_3D_UEm($KB#e+wem=3Eo@OA`TngC%(6%Do`5*~C^dLW+46u9QU;YXD1 zq=-5Qf$xFtaBgpRZo;Ecw6eBQ9}LbTcG7wn@`DT}>_hJ8*QdTR9JLA&E`!g~!|p=S zJp>~au^vz1l;+wPt|w;^)7dX+oFj?b9y5NN`QF3X5HPhJZJ*{2HsFGl{_d-D@daVA z!p2k~8}14bf@?gW?1oS+vss?2OuIxyaJDQCa*1e4f|@QKVP9{ejI{&iCUnTwg8*V= z4&1JCqPC8&!D>?>yFdzX+3jZTI`6sesQ7OBa4ddh`f}VcG}(TBz`nN8Qf1iImX(iI zdzj0`?x3E_7~t%ZM!N;-hM@~T(6a!|iCW1w?E~#Gu>l8l`=vNy(W>1If`~UT$APmG zGeeTZdCH__?yt>^MR zKbKD!QHjpgTpA@3Hh&M~G$Oq=Ir2DLOl3GtmAo5nB{eJt^q7aS?ej$)ex8CXi_fLV zFY&PmZ}GW7sCRDY4-r#E<9|pv>bRn6SbsQ8*lxfN*K&(QK~f3d^9Vp(o>>Z*0tH+; zCG;f5>XK-5aeZ2Eu00e_LxcUI%7vTtWaNB$#>7>7WWEBm519 zp%w5CG!PXM;9=;8kth_Do6PX(aYzv9P^cvWA<%Hp3fR{aGmr6QaZp=6qAJ9|!;teX zNpwAqb_38PqUGLFqlP5-e;^a{{Zi~e&~^{2UoS4EKz0zTd2Z?W4z4ds4s#H(w1mot zgc_CX3PM9;P>`7npI8MfVvnrHujE}W?elr%@tUPO#be%R7=KV?CKG1s#=RNzizH0k z2>$Na%^HUe;~GQSHjOh81rHND+bgo7f;*9b41yggDR7@t(ODXAF!b?FbfeQO2Mwd3SPx9r?3W68r_1R;H+bFqE z*OV}SZ9=_fmL7HX_#ICoWA2;`-e17w9_rCw^jMVs+LjKz8uIgdw!HxC^`ZPPL|?p@ zVk_YUnn!Gy7-MS|4jbPy%Q_`yzDGd~EgQ{VF`LGtMp?=b4Q+H2Lm-aBMqyt5Yjugz;rWfM zWULN3Sv?#oge0C0l0xlo_;AX-`$Jf05u(`}a)^mb5U4fIj_^oLUk;Kl^tEBKl~ERB zpYrCeusM(kkMG0<`f~%D$s9;bt0X1bqqY@EVWL^NzY%BZxrd3g=hy@6x*VV1%H=NV zYPDlHLU~SCg7I+gF380wJiikY=)d8nj{#|2ES< z!oL?s>-qBEev^>C>`bJ0B++AiJ{wcx9D}DOCyU|Iu^9nUG#hsg=}&a!%c&s&vT#CE zaq&j~Wn9i3(P5L=K!3BFmDohzUhMSo5=8zx|AadcB)Dkq+nh8s4+!CkokRnfkDMD> zBnqODtYm{W^#?^NEdGAJ;@F-Fv7-ZIaTKVJI_=jlZ6)wK{TB9`@>+0EUk_Jx*`vGj zX4C^(?6-b?p%-67e#?ule{sEh4DRS5sIv>_na$PQ;T4heHYgW8Ivglw5Ym@t(3y*_ zoBE1bc?+7VYi_FPHKx}nPP5pDgybIyK^}@5Ji;FmbcXnws~C28u+zo^Xcn@!t0Esr z-NNh<^+{o;;wfiUmJIz4^TlA;9p^AkvgBXU?kNZ&E%-+yDVoChEL?lDO#+1KUesl6n}5FWBceOwFrt|% zEVK(#;6~cwDwT+j8nb0eAa-T^soOf#X;0mda`~6Pw zfr8E_QDAN&M;o#$51Rqfu*kymeuG;>b&g;xx&p7%)i+VV_OKP&3Nk%raeviV?g1$Y z2eNBQg#bQ8RqG9hpOwUs;|U8>iC-zV;w2_f2J#&O3Y?F=1Rwk$O}T1}JHb8t2U>Y% zCN((l^@q0Aep@vp@CnJm6~uSDel2>CG7`(uHY_{XSD$xlR4ZbwOr^t42)3H#)kKXQq$&aVU&_ z#lxGDg5@6&wIN#+d^Br&c@=V@tRQbRa;7TTwBRdR>Me!`hu)V`zd27RTp(lgv($0h z(M6W8$>o&0+-OKSAl__Pb{S(lV~!&A4SlEQ+9Ptp;!+YPM;9xEymagEOzXQ0s@Z zLir*A8iW&Yv|!!)!6ZCChx~CSkMe42a|%67_OTW2&DKt2PgT(>#tpG3eB5La?;%aE zJc>Sfu1pU)>4UoE3@l{zd?|*K+QLO$?(0^<86~EJ51;uW;VPVcP4g`^1j=#XPB9x6 z%KP_K+B&JRol1YWF%i3CQO>@(;FjWmy;mLT4)0JlQ5E<+do1RTs9&*7(j78*rLw^c zt8mXj+`4eMEX!13(QB@sy{gS8x~m_J-RUfec0o8v$NEz^bCbL4Q-X}a)Tr;Ov~l!9 zFLz3!8^*3{@<)?szS3g+RPLa+;gT;2PjFDD2SJU}{&h)RhC2S}{(RvOwADtI{ zL2cc0KKF;7G^%yzwO(5RHOSlbB*XS1Y1<*3BN($7W9{ap$R^6U1lSDN&DQ6tGx9b3xfuF4kL7^$jV|4jUu5)?I(9b8C(d1Lebwuz=3LJqo4Pw;7fx;D(u3D>@>$kvnBSgi`;itsHWQPA z$9nU28YA32G4)<&PP6`=VYtmh)ALFHb*s@(`3XPL|L3~@B0ll7{Nf-1kS~V|{=P9* z3$Km}y+-wTOJNV zkQ`q5Nl0pBmJ6#*8Zn7a1S;tE*_Tp5qewAt++8*R&c7{o*Ce*us)4V+P2j=eS#ORD z--x-mV6^j`_PiXLGrFyFI0<>Pd=iF4r`Eh4U~uE;oq4E}nFR0nZo!?VHm}qqt#NTU zuit85^J)wdWD9!ifY`v?Q>L|!=QJ!AXAZ72nQq@WOPyfD^7% z*?pvD+&YyloVl3x2${oO@Y`D zC41#a+Ca5;fIjnN`@v4h;&MZl)3F`p3QZ$vB7ZkqQe^5CBgKiq^gZU|c4o*>kv^z! zwuy$l>^~CkOKvb;^v0l{{I=ll^!7#onf~dMN@))iAb~^`RXmFf*EjV}_GYn|P6JIo zEH(hU+6-}>Rc1+)vm_~MkROb-g`yyhHh#@+Lcim`aO4qu|A`gL3 zDi~YxWg~Bl#JIy;`8$Fe+i7DXKUNfutsmJqXCK2YXCJfLtpGhh!oQ5vtW^)OsIXYd zoJZF>^H6vkB`=9V9oLekNRg#1MINPx>yN-{Y#Tm z{PwDQZUgwG3XdG6Z63>BPj)`BYW58GBSQa*JH~4;x4wSS7V(JmSE0Yr)-QIL<|8sG z@ld67wVbT4Z@u29Imj~1M2~!oyAAbIsJhx3-HKi`veT9#NHc-|>YUQxBIAJYZ^En;ET;L6aACNtcd_RG<*+PjL0Q+bj|)*Hz9wecDFf&r z-p*Ie6;|FjjQvB^-8t8(e_UpSXnG>*Le%JDCv1yh38~i#6LpqZm>3>|}x5llJml$xWYgdBzd*Q** zoc$JFSP#9$iNPQN8G|)}_=B7rG~oUCr)L%Q?+c#@FsWcZQW6<4B*Nv(i06OqUn>^Gt$RSEjS4_&DNPbTodpn(*+~ z*L3Giw+_0=w5H@-P0pN$3DwTGSKKWNZPr>nT&^A7v8E3#E^cpPZQB9ub%4%gFE`x# zo&LJz_mlyQkVl4Wr-J6Ujv*DM)rb!E4ag6eb$O!wSWlMzHZ&hQy-%z{>KcYl$jG$C zL_6K3^^=_z+eN*#X(+`++Qep@p{tdBAMt+0z8&427Ut$r#qo;uZQs1A_uPYWs`n@O z&7g*k`4$^YK7)g&CP3G}i`V%#FFg@iy;wFy=2v;LzurgoQiX&7cA)QxODsMyjgnR! z)%de%s|zfi%Mi}Qk5tiIl)3Gu3AoeTn-?O(10 z0``#w?T_3wjcg;|ZBa!V^w7v&;3}$cg(v~95E77{gJ-L7w@w5`EX#pfJnyaw0bGW0 zF`R|@oR8Dq=+BI4Dov+zl%hsFG(e^9)xl9yY(@0>N2HZrgpWvdGuHdN$K#|!1tVws zFL}Ruf|W0$e}OE1rrvz-c4VZUWc(S>i{v};!_HeG_PP^BQwA}4nfT5bZy1GF_ z`Y8dz&m`9>%p5kV-TR0`$vyg)|FWdEryTqFG0iI ztJ(Swt~)}4iC56Cz~DX7nsD#;_1a&-&}JrTG&&mJR3)!-Up22=|HnLUFM=`0%a=nm zIWfWf2i4%*FId{^sss8hl-%HcLw^N1UPws8_EiUfWA6`tj-8Pbq z318jcs`f$&Wiv@1Dym6qJ*G8&obk@B*S}G{_jT22@do(Rs*PdXf^`1_Be`Ly1OMgV zlKh{T{+OB6e6d|BwM-iLEHL$j0=SWYu#MqpB~oGLU#S`X9fib1eA z0#=2HrkalS6!@pnaoI12mACiS7ejf%-iZZ5XcWcBl`&P*v~f@7x%yRY1ePD>y#&Up z4S1d+W{uq~j#5iLh8zatg`X@HTwxJBBiKK--8m?n?DT4TocHB>-LkDOcEW#U^{yrT z25mQ_mCHNUhZp@Fj!JK8x$fs3%sVUBJ~Cfr(>#SyBwgLS1jb|x;GYSM``gejN}|S6 z!#@6_3UVrf0hdQ6T=_(#7k{gGEKGulF04Vdypis)sO{($7Z}{29h{Rs7x@WkZjSsU zJs73{{8e+A2+j7O_n%o?{{I)BoHNAG%I*=Rf}3bU5=`U>0KC;358>{v2M z_MUz?Ww06)E8mTkL48ui#dX#*{jBbHwnR1&@1%Qh3^pdzJAB<|cs-piJ&@-BI3a&wy%I0;Fpw6h@QAC$1e9ITL9}5p zCk%LU&3_4q9y2$PzXmO5h<{H1(-jd@+xthap@ekLu9rc}#sAizrRw&t>0fG03x@vR z(QlWSKT2Zl^zdv?QNZJ4E*TmVPU{-4WOV3@eF(eO?;-jsZj8*jUZiv0~9XI`{XH=6;Xv&Q? zp)Ln$hT-+MW9EGCmy+c=n@6zM=?O>!d-JMUSTY(mc4Ox~_{~^cjR9U?tvWqAUFzM` zmKa11P3ONpCn5afoM5Yl<@oK=BCosB-AUD4K+2x=*c;Hzhc7aoTe2$UL&oOc)NiAL-Z(eB|iD>PN`2ESScmoA`8OH>BE1R+H{5Rv6 zFRQx_{vn%tO1G>onW;QRY|JAV~XD9UdJrpln)xQ*^^5+e)bi|m&jwI-&@^VzauSlzC z=*^I(Zs9&C|_UD51=(!+Oi^vj2 zT^AHCNf9$jaTq~%Nssc80~_Ux5K^ALXZ$~cO1mv|X3LSirkiaficxR0UJsSjDJ+^O z&NMZk43ADy2K!y>k0{kZa@xFEmVVc~A=hwAVx7f>5B8zvxPCTjVwVE)rew9WRtU z{BB%cdY-c8LyafEpno+GCjVBp6OD*iK>occK?qbWx(9Q$lLZ3};ZfeaIR%gTrKh=w zHsmj&a`(zZ9Us=w)4TTlIXO?SUZr<*R&RH<68}rY0Dlonn(YtkuWU2A@Ts?`qV$ZF zG56SVRSakSZ>y}!Eq0>jZ&1HHFc;Ht30WzBe&>d;%Pn8mT@y6rxJ>|leO9cmuZ1T-nz#dg^>kVL;@eEpLoWrSZE|BxY3tyH*}%#g-r(KY z4G3&;C`2`r@qe~8o<-N?dz2UTfKypoNB(X^ihmu_x3+TwZM^e@MZ9A zUS7`2$ZEF`-CBI2r~!I1VJ!e^s&A^emP(>cfw!flPXRAIf>%E(67zot)VGX8d@hdL ze(QBik_HQ-YX&zUb1Xl>mck#(M4<{R8QqRi_ygZ3$BY}ANG89oY|1FVqxq z)jkjxT~6cofR;G9ocHd|K1_lGJA69f|n)j{S={ZdD=yy$B_Q^V+=hx%=b-94Q4U zx!wUDOmY6EG{F9z$<3?!P{#+u3{|?PkmnM<_9Z*9(-sPP6aE{X_ad%rysS&XD7j%` z`Tq!%?2V8R0_cD%Y3_`#4_Zg4IK-z|3@E9tl#%A&(1}S+;G%z~Ju){idp5A^pnzpo zz2a~565sBu{TBnk?0jI{JuC8*RcNx+hY9$_ln-f5&Cj;JI z3bDMLMhr{(n6s^)M}|+nN#kN9<*{cVgmQ zt~(Ux-i-8AYjkkI&{s%7hP~UJ-a`MS7RR%waff_Xf0=Jw-uap_KkCF#`Ro>LM1|a< z>2bOCy4Bt&Owh{6-zU3CwT}_WR0;BobIL? zM#`2WdGW#vrYiY2V2j`uQuBr!8pGc8868Q_cn4(R;oh~BhC3S=irrP*GM?QW^2N=+spQr0X8>|j$p!dR3Q}uc+>@{7c5?4Q3L<#<-^wK}Em+ ziS(CnSVD#3s0krow56BZrvr>Wqt}JYKp`^n4FSd)FglIjo#KAO$o8_FH{7VVzOeEkw9S0sk=c2AX- z^B9_kwB%=WC|X0#My?@2r_85gZ3D&E=(pQ#f4RQk8D|KGzU!hN@!oy3}=^m7YW%3a5YOlP7&9=>YL`Va7w-?ZHQ z;SOWcN$>)yl$0;G16FC_Dmc0iP>^;32+zkT#ke(Grz|ek)gvQ10F2|4?Sg4vGC(hb>mjjbrX)i7N3mvCDR9nqt(0AQq1}if= z$Lh7Jt_?gv4VcnZo^L&!BHo`V{%m2*3IeLUM3Vx%*f*;Yjh-AykF938I%EjcH7_V3 zuf$Rsy#||G^PCBP8u%~s+Y{TrX?EepC)A?HYGN{3Ep$>B0a)khrBMR4#P_m4Ble!4#FdB>urdPNK|3YXS%oG z`s6$}0Xs7>+3sP3n%olr%C{3%6^{Wh*&iVVXye@JXW&zf{`uRY7|NfUl5}w4NQE0{ za$hbBctWwk-xf|ubQ;jyIR%@%b^JUxB)2&7=<&C~GVVi=x=K>F5WX?Vm#SqS#!a+j zXAe52Yu!LvANm)A;QM#0v0zy1TdUS*bs`rhWtX7xOSC1Irq`vr47SloUM*TYMMD>(AIo!ZiqQPL?r|YFTy831jAD%JO*9GgQny%`k;+jiCn2%DJdyx$GukT!w1dZy!`Ck z85iO*_ElVxYR));Iy!~%M{7Bk;WTj|SPrhf`?pqn~T5Vg+Dcz`BVBqilIaQT@>VBxL1&#mv62+1mx zQ?S3|8vnpy3i^MWJr*peb$%F3D*JjuE5@avqpbvk48&m@lBO?Vet4U%mOC%cKG?^I zzN0b-eZzfzNH}M^!&8yjPFQu|YtQ`>W!Y`A%Lj zZ4FiR>sKMA9+RD9v5m^Unpj0a-L}s3h+c;0+Try*p9miY#TFsIUTG;RRH2W9n#Sbp zU`MZn3?EH&SWLS&PRqFE+CVp4b1|vVk{XLnMXa)S@Kn$*h zS9|Q7qd9d!wAcKNT5fnhyG~xmG5Ln(Z7?`hFKe!A6!}5(5}fV*Rhl=QY&qg45)#)J z%KdHD!$ctYsEoWijFm=chlk)A4$dDEu)T)NjZ&CAhrI)xRIxzXy39bk0)vN~inm89 ze3S;_FaIyS+rN8G24A}^j~As?5>$qHA9i|~m(K1;s@>h!-abao00ThUb7;FItJ4_Yt9lhw;`ep79&;G)a9Zg8p`HIS3|#(fms=oCnYh3cP5<|wJ~4SdEcp>t2i-dlN5?HUr;In_HnP!W z5fZrdshs7HfU>_bEG~Cszlw_vS!235ANi4!% zcXP?+G84pUrWS8jrV4)Wtv58$uu@N5X{Fk}hqf+M?zuV&Q|NO2Vsg0S2X0z>mmFIe zy9)aFiLAda@rQZ{FJtxM1;2`VGL(JnFt%E^_?)hxxlY{k(j7subYADWiw-xHA@&XF z)6;e0@jG(2l@kF`hv5>%3)Arm?^a*@ADgxeeG{3W0ZXl6! z8|XCfKG%HQ6-6?KMFFL6a5)LZjvxB4Kfa7Wnm1hZfpxI^j2p` zEjAi2VlP^DBm~lL9WgdOF7c=!9v8F7gN>+(&{7?R%bkoQLBj@Sw`KSvZ^1J47X3E@ z@-k~PSJ(HN6v4?gtd$omQLRcG8QEgdo!J%*%LVHrjeVzUJzkw`aiD;0J**wWF>SQV zeWkxH3HYJftU0B)A$SGXRjhu06Em{%!4ad)%o^eIiaaH>;QQ!lVV5J&3UgOkWsQo! zk}Z!r$<2W95T0Nxg>%7&(72jqq5m#{ufQ7M8}|seBRY;Vcz64*Qw%)~h^v&fnPCxH zC8aj3Zw@2vaJsLdwM6dLixwiNM#LCszQw%iXAd#Z&{3Dh_?}zOlI^JTa(s8@&@=0> zqiJst-LZJ7xP5wNdJTl<@%_~567BR=7I8+lCv%~Sy7qEG_Bw}sW5OEMAj*D&>-9dh zXs`V*FKO-(?n}MdQOva@C|W-eP0O1drQOgi(qg*9$T-<0izIoUIWX3Pk!n0L+E!Uj zuEU4beAJzFM!-m~L5-g}E)#KOBa@*kEQ5lOz+BHPN2Q?=j`ljXg| zJ+EEVWkWbDl>v;AnOZIPoras+)okisqD;1}`HdG9F z9`+AN+yyVkZrVg~%q@x0{```DHG9F6TVEu2Wj+uhb_8YC!4C=vycN42=*t=Ci9cNwl>p?lAuL8er2jB{q+I@o96M_!nvJl9t61Wsw; zgxoXYHHuiFuFzH8DAl3(jv|um#fEuZ(R3+0*Ft$)akRx&^4Ik!zI^Dn7b3JN$Lx8| z5He7o5JXXh|Dzx*Q+$zVgE((<#>rJTiX7qOqA*xX&tFy1_o6d z!lzY9O!sKteOh>D*_3m7duH;%*&d&-?+9trs9j8t;69}2FMol~4bPdOHHM`j=yE&0 zM0{eCql1kLDLP>;2kU3=mb-lKZj-%mA9Xg|yM^w=MtQpE=NMcYH$E3#X}`>}oUuFU zS%nBP)fF}wp?Pd`JUqkQQWPi12ff*o;uWhW zYFiZr@Y&j-k!Q<0QG4RHSj+oISNY|60$=9;l3!lfXfPY#Vs7Cx&Jb(bwQDgAEzM5#pTUh1`W?Xab#+;O<< zjzo591}t;Wb*-egI(Mpkphtc5Oy=UVyMUKh^Y_)4F0o#h%S$T%5FgGA%CTO$iSg;? zSJBJ<4HG7wHT;1I;}a6JVL#!&!8?VOeefuVAC2U=w3%^7&(fP;IZn+Y9fH+OUqOe03h`#Euz5$dabQ4WO%Pt(8)8dLG zw|SAa9M6(`GF>iOP{9JknBy=Zj6c+RdA!>Sx9L48?}x}l!sSQeK9Fs)bLHe1IB0Wi8mXsZP1yc zAK|N>LItyS(K;@SB0&w&5OE`XN+P(dJsRS#@j!TkYhY zKW5L|>MgxQZ@0|q8Fp}Cu6=5*V6VP*7AvTie$JQD>@ISCVSv(T++V+w_=kcSNbxn` zd5dzwhxFHWnO2#WYB;{$Ozy6cFw}9P-;3W8I-ZnJX$3hBz`v2!+22_t!$f_I@MWLY zVf?>l$^J_%+}H!(t(uE0lj6tze9VgiFJs&qT8B!=-9UxAZ|9`~`i{{1HhYT8dkAHF znb&PaOOG=_ndW$n5o~Ao{DcgGou@4{G%~{+Q!7&<>iO^C_nPR9q{n0uQ30uPVd?M! z56*)|B?rkM#o_gA%Z!2=kdFGeUPgV*8iWgJfA;hylNA92R1gd0xim;M>jfz?K#B}iOFMT{m<#xmS=6LBL_@Ibw~Fn| zomf9imxg0*pS(Jr-#8N~iD%Vl1i#lR*0tSEJsKX~>w}Uig!O*8L|@|M4Kb?`iJl=J z&8#L{J4+SRlRUK$@jeANcnLP8YVr_W?EQ_9s2X&B(-4_~;hb;dr{Mn=lDDp#T%Vxv zn)pE;WSVCH?o}073a33DvHhH;)=wuFnSHSAC~@2S1pjS^820L)QEnEOqtjeD$5B>m zt`-7%Zp*x$I$Z-xRsWXtg@%@M>3|Q(Ag(f&)|QX>mif&2oxAZZ+iJ<^c@~pzGk~U( zTe)O86rydzlYZcoc+KPQqwpA$FN5W-JC6%&93e+%W}Wb-nqs{FWC9dJ zcJn3Ws)g(Rj^RL5CJ;M(x{NDLY*j-Lr16Bhj3_v2 zAI08NwvPMM8#6aXw8mu2wsKvGN998yNMS)}fzsk5mT=1Z2oup~PC1hvo_1bDlX8@r z;+M4QMeJ4BiUF&=c43u}vqB{-$>D1Reo|2fCI~dt*^VFPi@6Nf;!KTzG?LGC=AHh@ z$o&u44WW%2cH=%D5%Hs+_+7~~4GC)6&MpHC_1U>D|8p7|T-i2xNcTbwcZS5&Cw5=E z0Z)B~nbP%nGFobP(oc>_zGwfX&1(hVtl6i2iE9__h@+DUPIk;bwvfwz_QA!gfQ)q; z%vk}a$8$^9(7cKz9jj+-#Uf9K!D|&!ECUtrdc#q500ALlTkmXGP_ov<=F=sY&eFjZ zEpb;GK$)j$d7YMmSIjK2SmWxot(SWwY$+~TCG4$(M`zA@U#RO`;L3ASaX=bZ=FHUU z(Bc1O0nn-5+znsG34M1S@xSn8?9~w{p@PAABs_k*%~HIj3(j zC$p_IuKBVs#IlOk7X$Gof47LGKwfqU3>WB|zlRvA{G|nu%eJau+5=rUp0m~E_r z1X(iZjBR^$9cmokV8q+KERd=s^B9>+!XEuBieU#2Wu1TcakJ&uUNgXG#a4*(P6h zEf42|Z_3s-hp#gBp@GV)j9uI>?ULath+4W1qJ%&?dgC$~wP$-?Tqygyyt{+VjhePB z|DfPKKKS&ysoyOoK!icCx%&374p5xmD3yb1LVKJyYULx*Kj z*U55H2WBELCn_+3{_lv@GGCGjME%+u)CCJU1-&2>8W})gIKVIt*z8j5YB~10j zC=~<$*-=pmb0-en{f>fl9Q19Wy%)At^N_1G%+YWB67DR(vN92kxIQZc6Fs!#HCF>r zb@Am{Pk6ezCS0(tw$C)A+IXQ$0isTLby9l_*7g>_(T;GV0d>s_BFHN-%9Jb9w^pk| z`)^JEm!aSAInhl7Dfi^vueZ}S&TwC|9BC`Zcm*)jWLEMRTHN2NVjd|^`w74y*qbdE z*{r(sBseR#%xiU@{B^yDfd!d_(6Lx}Y1JcQ$tb3xikuzS@CH?6B3-H@`V4@O!=`(1 zxCdGvt6)<{4xXXhdz#|{!@RonHkHxxcrR!LEGJ+goMC=7FU>?fJkJffb_^~ZG}V~# zq#ZA*F@i0v8lBZIQdM16Hu|NJ^|)UJN=AH+OaDV_wEus}UNa|eAkRz8$&&D2@pJZ> zJZe;5WfCzRsp)E@XeO=TP=Y8~FJH3l>|U$Uagsn>61JDl;n;kV`+|vpJAg+`8@g4y zg7NqMN##2;s3#@Se!>277*0&KIPux9bJR&}BVuA=V1eKWbQpTpidmgJ-nFq{Thz^V zZ@QdGnWlpl{Bj=8I=|(`r8Rj2zE&#_a3+{AZCtak2ypD=c68*1XG~XG20sg_9y!X+ zZyo-Auzjr>N9cv3%TfKBD0>J!d4v<#%5>p~AMwi38}-X4sTU!p!|=jyIgfzvFqA*+ zrieSBoYG-nC-QP=z1B=VEqm<*;XSO@GYetZ*B)N_=;(4If-hOOV~0tqEp6FtK(?<- z{4Xc>RTHUr{PrYg^sOKQA-Y_LUb+y2zpZ`0dUTKFN2wcgvgfApzdHsW;uSgvZ2?v( zS~LX#8f!botN5veRv~MXHt-kEfO_K@8d0(~VKjeG-&)~B^YtnaNNQ(uCHed?JWREE z933OCr}*Hks*uy|+h-FfkHco9p>;P+g&JYptKjhCq*t4wnJLu`{QKMfn+g02;hNmF+YUJ|8{ljNGfK`g{7XSY=pOE9DtXg~K=# z+3UE-Lm2Wr3~?7|gJnh8Z^d*|7wC!c$&sYmLE-#AtLA<`46Cvx~Bh$%+DK6UO+9wvO7Y=XJmqMRr>h@N8`ML8(wOgBS_0+8QJcFb=!HukC zn7txwIJZIDsS$Jf*Dlqi=nrS=-tt2jOAo)?IQ;29uUTUMv=v8WYno?IkiA-I36a~y zf2o~}4<5Q&qrtU$!7`Woztm1PV0{w``|oNe|6HlRn9N|vols86a16KH5+xhXV&+!< zkyw`iqyD>e(|WY!EUi-?RmiXQW{JBwix#VS3iFeedP92>EA_sWR=wk`(9MzR6XJAsK{v+yf}=V20aBcdJ5xp;DxsbY2;lKTGb zH`%uX6=Pcc|HUx2;vJ4aZ8M*g!0yWj^BOf{Gp&~-M1DSH0Jhz>}l#DRNM}63~?Y+ zU2zzcK357=iAcZcL`9gLSO8oqUSE@hEID}?4al&2h49Bkcx~&+%~_9$p#29y!+#jM z*G}9dOl(varj@@51)j*0pnlm|$944)Y`Gs|9@{MavIsBFyQ(|c6SO-Y@%uyzcy1N zVZZEq_n7R(`KSix={wBa8PR9D$qQlo-u5ATpn9o=0q|hldHwCKs7%kjgSAE1 z_>vEGMV|FE0AtbRshQ1;fb=Ap=_$r9H@Zx%x zt2s>kU!YB1uPd$>>w&eLyUTCDk_TvQN;vt|PqF4`gR@ErGNm5fu_b5=112ogl*qA6 zh4J9xD(CL4EDmSC-fsxI_1*Yw#3tvW{qoFTCyRbF6!4Vnf>O#%hFD;5HlrY`W%!E}-!OE(PLDZ#S_N!HF zd(W6zSFh&=k-cs{Cti4yI;jD3S38FoPDeakjtZ6J{1dVh*?~(g;uJ7;;5v&6RrR@^ zh|j6>3A`QYqCdgyyVoy_aqG?HXl{jI)nA*ESw)1KA)t68`0K=zC+u|&XRoU`3+~16 z3A@F)Gyp+(l2FxTbw}M%7uCNraD@EG0a%_U_PzMcca(h>Nf{>}{FQ^c%;%m?Fe%q7 z@2q!o9l|c)Jl00p7ji-&k3v=9aa$k0` z`*uEQmQ8gLI;x`v()~p;8!FwpLfY#FUUS&hV(Vh#`!o9oR;!=1`gr^6Z~Ax10Ccu{ zhCPLjbXLbM`<9rNyyhwUpsm{+cTV^$68?(t^WTRq4*Oa+L~)EbAIi_DXhRJ@@H4fD zN2JK3po$aw2TtjJ%=6fRfCd$+N_C2en1Yf7-M}oKQ%*rkhDRsiA$PlZZ;N&;6 z$#Y@*q4uKX&Cimo+QG~B76dod96lVod4)RL^-bTA0Zo7C|Jqt}8KE8F7_t6+OaH8< zZm%|0C3a~HA|Z%To|c$UTQaNI=%HS7m?B7-e*VC^*?so%!tQOUru~CI0Xdxt-82?u z5?`z0`RON1G_Si#?5t*hxFR@fc1#}NDQ8LXdROfxpH=A`E;2`FIm+S|r|?j9lXC-& z_h)?X-zR+=3wp{t{x@M00kP-I<1-N+9M)VNWKLN{`Z=_PoJKiHGS+V^CWL?w$=9vc34b-R_Lh4!sX__l7cM7x23HZM3=vFtfBNF z4s4D(9eS)1vRH$@TyMm+#{iwJ9>ej?23Uc^n%A;J)SA~k?$u6&#Ug6w^HsKZQU1=S zpF>W6prol;-POPE2;hx?LaCsDd2y&j^X{yBpklS8^iJYGc<2`l1QEI3Bf zl+|pDN|Q>4{i;P5tRFs;x7rWP9~?zt0R6oubS}q0+a}8`A5VdH@Yy3 z{vWC*MzwCUwBM+nem1HiEN9PsK|l~JPCes%oei11j0(O-tU40!J|U9$l*zp?%?ID> z);B?g|1*4T?`W=e-m-sDuVLVgeAHE3%8Y$@k0;m8Qo>Kdk9UP)FE)UW@wAc4!baJ)dy3NoYsvfg663P<0Kej&EY9?kCWA2mKJ zJ=mOF$aXqC(xaimaFhhhZ1-3IHaR?qg|9LqiXYO&LWnq3({P^Ye+`fRrt-b;M`M5o z$IrjK`VCY3qmvBVMVEWaeTm#&Q#!(z_eLbT87>#0PD_piQcs0-0>9P+v1}>h6DtKd zn%}-cLEG6WM?FpYt5SJPn$%jV08LA-P8Ok&lh>-5u3^M#eEiw7+f=5mLVYf?pXOB! z+ZXZJa>Gy2c${3J$cr{mT!0bdpKw`N|ABb6=Y8My&3-~_ zJ^-}-Y!QHRbN6UHyxZLyEt-vy^a0a*ZdAa9O6qhDl*A8jLN?6}`e}b>hO~`mWvZg*}xj! zFCnk*CqF;aV+w-Y56d)jX1>Xv^Y?N#RDL}sM1`dFaROVY&)x7N<_KBUiqI2!I$(Ou zJyt_V-hoJx#z%&e>UGBPA3vImi42WvagVwT#H9~xQn`uCz*6t`^OtqHK}J*yD{FU% zlXuaV9Pj*nNaXs_cF9f8FU|*h8r8o^lX7oDrSqrTC03aCYY38?A5zXEw)LN@hyik= zfRB~sgwS_YNAEy&Hxi8Jz_|EBQnx4@)?W<#?>e!9>l1%}a9|!yvhMREKl)ncGt!O? z=Dsg_85f#Ty^HWA)hjCNE#Ebp2 z;R%@y`v=X<$1`2VdwmVpXTC>-qZd%zLpS9Fyfk7~eWdr9++T=GzBAJf;Mni9C7U_R z9grJ!8D_zm3b+>9nT#d+;o3bXXgd|y?K0D|tY3WCZ?EC3 z;}n6zWJ&7)=S=T;QR__J_Y9vW zC06MVs3)Ew?>=>Zxw{CVM&nNpP;0)p^kj{+->d|LDdr!?f)Rv?LS;2(rVICUij zl8%9|wEZ6CWekhZG+=}m?hDD4M9nP7OD+&njzx1wfJm@pbP1;AV~R~ZaO+JIgWSx? z6!*_qY<6_)7#5JAL=M(45Zk6;W&HSu1MsYb#>=vnm-brJd+gSh-d${tyGKHmHBiL} zHO-*V*F3KuYqLDAb@4b+9_@S++%UbRW4{>H)x)`8kT@o-L1t(aPNAZhZwQrfL*S@# zD>2cco1L@vtM2H@$Xp{hw}v2Z$vQx&StQFZvqZ-m*0;Kk$OeikEY2H`b-bpMXm~2= z)5f+qZ8&XeJ)YgD;&1E4^*#8t5Qh!o9)suqjz6osYJF%bN}# zbqM$igg<}6IG2$Fau#OAFw=j~`SJDBVIS7lY+94wMa;|Ir`Pq6@qVPH+GFQ{j9;jq zz{tZCJ}#sTR7KFqhSX?xi^`&dBVrEEeccqax@HVtcoQMmB3~SXB-9NQ~Ii+AS4byfW3@%I7?fpugX)>@{>H6ik28VaNB7 zyuDY{sYledN7S*~Oj}RzOXabL#~VdF zJt{D9F8|R*mEi{5wiCGKTf&9^!*@QK)bhPGUZ+IUcg}eBwtuqwzZ(}T1SJp>^f_x@vDV5Om6aH zO4^=p_@lR>zcG1y z2z5;b0u`%6LV7bB1zPL&BOSIIi;GY%^6{s4aX!6oqS^R@ZM%sy@apZVq4snu2*Ey_ z%Zn)dD3CXa6Saz6XR@z=%&8P_lL)-pff*S}XqT2E*jGGDYXm94F)kpbwej5IRHy#BYcRpnrf0>-`- z`FDwfTBHDRZg}GB>(@uyhO7!#r*M7&AX`h@7=iIXEArf!;LzEQs_KT$tI1e(J93w@ zGGb|WAY{^-%vP$`YwNqPK`s-kx_1 zx%I{FJH3@apqzMqfud0qPKB;(c(zHfRKZ!_u0jNwCSjqs)37|fx4y#hov=o=#tQ$- zE0d@IJ3z$02=Q%-u@eaDYBTOev*6jiq?Ws9xYi!ZDsE2fY35DLyl>b-!b7EiO^{cK z;2LzSlW$TN6mrTb3ZMKQpgmA5H6lyJiDJu_jO2;GV~ix18t#)+~F<^ z0p(3->R_TLlo0j;h)XC;Ymtgh+3YxFA`BIEu%!fyFL{_YC$3dzg{_BcFGVUR8<2Un zbfJ)>3d98NW0U}8OmdmNYof1>j`=;eVJsDrq?8;8^f=ZRYcp|LJgo(B+NMz)n6|N;Ad9+gSIyex7Etn22=wVy5 z_rdnf>SNIOb_N4q7N6Q~VsCAXANO`1GE#l#%hcnBm9+1oQ~qJF66n)?p5Ko<|k=Q zHr|eLCfHH2B6w)KP7~fUS%~5N#jT>QY0$Odt99)3`E}rm%=|!7=4U5Ah=$vA#k+A1 z80Ut}8_8lmX>}&~S|dcEhaciJ5?|l_m?U^QZ&Wdi_Qs%9!9QL6b)%KI2{4MVp31W= z#B$~lxBOn$LOs*EX~!*H_ui=zmQ+rpfW*v-4&j_u?uQ>=6s*5}lfB|Gt5P)!oJy+o z2&mOrFVU2t6R_XWxn-HWO{GjE1|Eo{&@FR7^sk@(xZF^%}(XOve0J3 z3bUH;D25F%^*Yb8IY?A`Ql%PRJ4;E|dRJGIZOIuGFKK=P#Z*ALZj-G-xfZEYLu}yF zk+Q5lwlDhY>DD02No_S{i194`ok<`436tuh9U6r8_g`CiPfJr-!!09b~f`m_Ekbj#&Ohs@7o!`~RJCz}3HY&9I=|Oec5R&m64Y0BcLa0kQ z1~!1-sS8}+{!UEtY1{aCeZf`wO&H%XXUEjx*qptTJq8VPv6U=C*m}p?76^qthSCeq z1cpK`kwOw`8u^J_Sq$epr(AERV#02*ouIrtfm1GkIx39UFI zrP=G$($8^lG>O^eH*X=7ZNVhZ!*L!gBU=Q?v~U-QY={#MQP;c<-IGZQ?mCDyC8ak$ zv8K_(7NbQzq!x_eHeqkEYDefVdOqUl&wz3g7kbOEY~a?^0!gp37hA<~Q$U7kyO#k6 zw%Ni#uR&7o5*_~G*X?$9#dq@~6z@BA83mZ2%*-qaR;=?F{gegZh^LAn)4{j=^S*Xl zV8~q8qQ`%eR zXq|RiO75#zBofKywWG^oubfk#E$EdW<)Z=k)NbCFN0qQPE&xA=1Mie9`U45K@8lVo zCfi#Ji#Li3x$>R43B}J8uTL)e*SpabpSGS`JJ=V=bt=jg+eVbl0l;umfE&w}rY&HC z-ps3XHx2mW(Gdp>UVu)lL3^ayd1XJ#dk`93Dzm}(49w* z%OSDRyX+gNRg2;|Jyqa>$O-d<5?T@TdI6^a?CC(=GWZY%yUP>T!4%6zONUbC5m~?t zd_=x-u)oyjgi~mhrR7UG9rCsYl_&C0z^ZvRCnR#d^dq zl;Ag8X4F}IFIeuJZT11N0;xj+Om}fPJ}bTM1Y?i;yzMi@5J?Z66-tfnQSgyFO$EiL zGY@_Q8amUCKAvXx*Y-0ZStV_GoI7Vq$9{Gvc_=)k=05xcO8x}W&OZtw&DXfl)K31+ zVTLKn(9>;XsdmX@Hk>%jYbgfMC20p<$USPGQIx+#XL)ArdNu2!0x+`}U!2*LYwIO! zWasAQ(5`c;u%B`;lOMOssY$TnP;pT|e2;ARoT=#5cLD3-DBhS&Su23@6P3Ube$^@3 z;w8Eh4YefF+Fd$NdfTC|JjYB&bso#J@ou8w(y7_+Qu*774ODjADUJ=#@6q-@JEwGf z6)QG$hq|yps<108G~Un9``jo`nj_o)oKN0Vu9ElbyQ-AWmTx~k8wp)SqgQ8Ye6$)j zAT@)0_yJ0v`Bep9Jkj;F!E3~E{vmc32k)r(W*SUeH52E1t&xH}(sW->?6;M~?lZ`G z(egbyL#Y=2ijuZWZpHC_e&d`-(v?Q3j~Y`fmzQD&srtjWA(*#q4)UU4F6oRy=iYnI z9=Wt+z((TMsyxbWQp}Pwt0Zr}QN^_TdzCLUJQ0|sGxqh76{mdc(#H)lY*QW~^eQ&; zGfr~#OL0!)$(uxh-^f@#SIYI<|^X0tLZk&ot6slHqh@e}w<9Uv54DK*qYodCHU#=U?av2bNo!i+xvPCAQ+pw~1j*k! z?mQ1Hohk$5Wrb7j&Gd9K6tbiU;lm0QMP53r;;ehqT#~H^Pn*)ZGje?AAJBVR--Q}t zCX^iQH#l8}kqg7kF&u4^qj=1QuO3STjUmqzY2{TDk}h9C;9q&wwqzO4uf|o&s}|tk z%avddesRzC{dlZFEMS?n_x&gX&1=V?YI_br|FJ3nZ=2Zsz9Xk1B2cXHu&vEf?asG~ zJ62S0BmMZac%MfHYQ3S2+kIk3Ki?nG=b78SQFA8cfeZ6LAet(nn{t&I9QC}XHF+UQ z8cSTxpAVH27d6c05sfV|aqaaKop#AJl6MvUC~ea$W@U!S218U@^)QDVJ0HM!N3?WS zt<-`KmJ@VdOby$V+u}lILka5Xr$mXY{JbAr>RZOEI84<#Xzpwq_3}JP;aPsfhfy+X z*852z42{GW+H|TMhSjpad!FUr%)PyH7)-+I>6#^d$HkXYvv;S?JkMzteu`!7`?i}7xGPBdcl(+OZw<6VJu|050G35EK^VkZM*1Etr0QBm z9~3nf0&i<2vTTUXlvH1T zzr;})di(S9W8Hjyj8xZ;F232Hz|u@e6**GnH}_HK6i6^FAxW7*PaY|_WY493eM?P; zC|4l$1k~NA{C~aGr0rcA(PPm=T@gbcJVHBit7w>O1foJk5B|2&D+?7PgSFy#@qx{a zPTmodJe))epr1!%vd37>{@K-%Xif>a>9g-wPt;6#cDz~veqNC$T7e{vYQb!@Yh=tX z;%TBH`Z?Hz4hDKMuiHcXmmeRVc79XTjeuk@GV^Qum>JibP8*!s)!pR!p`Rv$?^B;> ztVql(Uf;VTPxc;(c=N`;8jRk$2B_puEKCwrv8x6frs1Pbf*57v2 zj&JV=Y9E_9;z5zTBn+N?9ePo!+30ZL`3#u8OhqbjI^n*MCb^wg7jofJ^t);Bo$nFf z5Tyb!PAR`>5c>a59))m0u-?k_6SMtSH?f+JtTaT;3R1(gD_v-7ZKBoMGP=Xw6`yS9 z=-w!Zac0*~H7inR$5fAP5@sAJh;qo{?O zYX%UM>bGedrc-N(0-34J-4G;mYjNN4z%{9_hMS*tXq!QYjyh}MEGSl|2jIq&i8jWJ zI1KfxeMQ~_E69u3u~QSHKL+YHNd0Y#`{kia^-cXJqJ&wU+Hd@h6DrEJ-(e}_ir^#+ zvi4KEpZES-7;vvjtw0Oiiu3-^H~X_^eOc>tr?IH06t_^I++U$zZT{$8DKc?}>}RqI z+tGOP-aLL+zljF1DQa(alA0$Zn$Qn&xiYyvn=kpE7?Sk{^U#FSbdQha^}}V3o{Ob} z+Npe=hU}Fd*6Z*u{caeZaCIivNDS45oV;siRraZg=V$jikA<|>Ud>Y?`2MRu zwIyay_CV${0=TG7Xz=C>PpTJ)+WXq6UpPQ+Y5bY7s0pe(f+nSx$As?FldwfFu zwl;Glv zpI8T$UaY`j9B?|orCh=Jb&D8;KvlcepFKon0@N@hlyQ*tgih&|q|OTOAfuo&aDfHs z#`0<{#voRi7M1bS9F5%jla1@Aozwq7Y5(YS?@dy55AGZ6_4ATo0ff7n{Vy z16qqTNjN1K5yCxX`U+&6%|G=i5=Nb7dvlAcDlKQC^_;(W6rakh)WBmr4g)@P83^~` zeL9cV2_orSb8jAi52b$2%$s{~5tr`XF4VR!!S0*%nj$c`@HTr+S{;t|u<+PGCkNtA zM_{GrY!BtET?#V((k8K?1?t0x$mD7Q^XA$Q?-C2l``2o>$Rv|27rjMtBsMh~^TNQw z1-F<~wc5V(YHY^T*0l70=LY6^LKA>y?Z9o zvtcuLPh5Sc-Jnq%yrBCEeAmfw62zi<7ikqx8Cl99>s+%2TzPL(aK)i+ z(renzr8fa`uJy+YZ`SMaIrXZ!2e#hT9<%52*B)m~2JFllVHzCI^1?W0w;MlBbigjI zpDmrfx_*W;TkGI*{j%ue3f<(Lq3zAlGU76TO{nwwV!pB#rO=}t*<6z=s3c+hb5k=wUYe(1Ytk60G@ zMlLmI@aJF7bQ5NYP#fc(*JED)XIE!oZ2Or4q8z}T*{sWfI7- z_GQ*Ax$_s-^@aSv>{(vYw}6~VnL0mOwL1Dbk#VbgyLHrx65WaMrJ0Olt_x-ZlC#y3 z@@`KQ>bU0feJacPa*YP<7x)et=3kS(?w!;>g!yVC>G zIKGkL5;&TVATL#!xxTrT@bv{>6ur_58mLlpOjOicJhHR9bCoOEpl=r2q6ZILw=EV& z;&qDe$9l2s%9Qj`Jh>lR3;qsho&3I`q@2TyuoG{W2NX`O@PVZ=F*HSTL{ss})PCBB z7Z^sMc&Kc2hUDDKkQztGogrPRZ*I4kxfd@vQzq>J?ZK<1K<~t^?3(At5iV(YQ)&*b zXvrU|q_!r03F7B#<#(I$ESs*$Voousy6c=A5HcI$;4z1+d=|wo`BjW$2bt-1eT!>x z!CeN2PnZcxUTDm`JDDx$V6O**Tl5y01=+Vu-l^63JBJ*ZQi}%Id>Co7H|av2QI5J~ z!hCwt$kIb%{00;KD}I%a)>qOLIKvm9OIx*&f99J|88M*j+gd}3}JEq+-t(Uv@0F>No)Rcfx z&%1qXj5)R(zc_)8@|iy_T=5kkFxqd_s#&9Y=biq%W{!@jnx;lI@+&^6aE4p857pgk zB&X*L%M}U6a)E)PaiRgWad7u}Z9-A(z1m)3?2c26=E=@>+pQhvV6CBMqq(3yN<(|* zJ1m~W0joTg^DJMVmNF@d=c)4!;CZ&=GQ5e(R$dbQ(10X0gJxI7gn=wLuWe;A-Rs7E zmG-DCNQPULS;;(Q^3;~+AFyS@O=AV08LL;8c}fHZwg()LfPI|;@D=ybX7@nB9~l!q zwb*!xm5!)4CY^^6!(b5+sU{Z1jF?{@>`5+hJzMDRG-fy35tw{1-6Op_Uq}$vO<%sB z=0>SJ^Iq!E{3AW<<@?(^rlz_Z4TzMQn30T$IjCPZ-wI-gqO5-uNW8m=HN*^Um(R9+ z*3tj8X%pA&meJ^1&wEJ@}*_;fm@Tl_!PzB)dx-r6>X zm?>sDa3z!M+i|u$!&{Q!CDtBlRaoFQJ9a+}r1x77 zi#4n<0#4)zGn4Z zX0U7FvzonR<7vdrl8n^uyTf=(R-d}5cGkNJ)@!0>kMFscy-plwqbFuj0q@pbl`I;1 zeoj6{H}VIAbj!ps<2y+8TS~{w?mKTq`rAvmsrJ$36;0QsT1t1NY$p9F%Y@xwYUvTB zgP;f%F3C~TLr!O^Zu~Y8zN>`V!4b4aK{E&Ro$;|w?+;HE5?uEB z%>@I$aKjPx`4i8+VQMe|zZerEV1GeM5HCPE?()?mm0+KSg!@FoCj_=2bGg-wY&l!y zC*({o14!M<~FZ$8M3EXL5t*W7=VWeuX*|v=){-Omg*^pVyJjLr^G2*$m zP=fmKnxP6a**K!1jnp@}F}r_BD~ezEp8OhOx8eQ48VvjHhjqb1RK7kov0GM9{An|G zKCw9_?wn6=qUI9ja2BCBB41`!% z5pD2)e18R3Km_c*8p!OK`p~(j4qUVJ?`?-!4?v$SemG?@ZUd0{rCNW}oY-^oT0(O0 zf0PLIbuZ7Z-g0W`b8c^ZGT(dUub~O>%1{=lNs*Wqcz`tQZ1&VKIx1SSg;Q_}jXxdU zBLETXa-bVj8f&IsO4iA{_sTE++%k`O%l)yp5s|E8sk|!r%%)wS$T$AoE;Sje0YS%M z@V4G+NEN0jcO|6_QO>A>ROv$B+)eE~J-$hBQOTH`RFi^BxFx&h%y@PtS+kCcfub5Q zGrxw8hHVOW(aCOqR^y8OcH2SKsqHkC++dlBv(W`N1Cnjc{vefTvjMG?CF>C@ex=Yf zX9pwhUBmpq0L=@~SDV$4rDr2N4VS{)o(KEM3DN-SO()qGb1_>g(1SC%4SB%D!wLIy z1ky5YFDs&O*q2_Vg!bSmG$Ko!&jPU;((ZgiywJ&S2}K5OW7|Zq`(vNXV-Ba%;V@Zc zCkxVyX~OB}`_+>jvQJ7vuNa=L^+q@F`DBvo$IHSP#T@jGsb4@GVc*Gd>z6h%83}`9 z=rU402|QC1LQUK@mBuy@QfLo*q9)k3TZ}9$92@Wze%DkdHL$~(3~5qJ?uun=ETs1aKIlEC7mmxRW!*s#VMH=IHs`rxDMa%~4}9iCDdS|}&aM5zvrn6Qe%RFMjoP&vlUuW9y!BQl_(f`sOfIe`(3l!3b!#`K&<*OmfJ^G zAcGRuqE;2r0j17PIzEA^j07d^h^B$tSBrL>*Rs@WrBr|2wWr#a5;NoUXHKAQ>xyW- zE=^xkjf5ML=*+%1%F|7eQ>f&;h@wu{=8>VbNFbwg0!tO{e%^gtzq}YDW1D_SKUDGt zL<+|aAJECYXHAA{C;M4TNm}mfu3a3%WA7t-W5;* zLZIAP^fjX2(57F3_369=HKiX*3GahKft!Mg?eSX4cw;fLzxr5u<<8ri`QD3gYDqDd zj-Wy9;T^$jJ*DQ>8*l>~CX=Qd8m(P<;-KkUtih~Xdg>Lbk)ItX_7YMXv$a3(211~S^>_wMh*A~(@l@O?ovtfo=nOtW-M7e z8VfcvOJluICA>)`SwDy(KD`7F9i=$;Cwp}yM8;B;-GHe^Bn;L#mWv{OhUC_5hEa;R znblTTRdF31L45wD*9zJpU;_9<_qSFLqD2CX4>Mhz^#W-G1e_~V0^tWN4&`{lu)&a55iM6RrWPI=*=*+m^n0gLD60$vLhIiKz4qYR}9n!1cXcoCKVejkznva$;R` z=Sn$kh1qC@8Voo8D)J1KT(V%XY@F%k_*0=~Q|~_c{Q)5pcOP+9`2IGtLcL}eTusUu zA6Jk{NzVZv-L$OI*hweS$(^QXn@=^Qu&Lz_J8N%-YA+{Pr*TVKv)NPpP^z1aeB8@b zO^+u~N@Rh`D-MEFLXOMr3)az#dk~a&ZKNl432vl`R3pSTu3 zsM2(x0E+|5yv9tQ)YszGW^qJ&8i4Vuz)G9a*U_V7gWXrrOq5nVRU%JDQ_QuYhpYVa zrHfZiHU2bl>sP^>y5Ov%Xe6EqcR;55F4s9|M1ZI@1JMW}MaSGKRWIH%=>A zm9fODgFT-Mw_Ln$dfWU1yZPizy3+|v0jEOhrM%6sTpzg<+CTrLIr~}b*M|LAn*{hn zXKT(9FXvYj8cYw@Xs+%=ev8kaJ{sqsn{KCZmdEvc`uJf?RV1*zfgmvqD|!o2mp_^h zBt|Xm((dwqJh1zp3){=dclZ6LTSJUu7dCuggx3|S*0;T4fE4RDt68B*XpU`i6=Pd9 z=X#|krs2w+OJ<05JO&|kJVj4{4>fyx?OGnR4WVqu>Zj?y5QRuVlo4?{7tN*zr+(?R zrE2sa9F*(Xp7{SwA8t~1fBV&6-F?LQL#AO#GA;Kb+*cV?z?P6HbRO84JU@6BggI|o zBWc3%pcHu^0x}=c#VRhX!X7Djd1CB2VUbf({u$dd&Tvb1E9HM63EobXy<53k@dy!~ zO+L;QdQxUGXq!|FP-dz!b>lCKi#KpB(>STG(rQ?{pe4)bVNJ-%urvyb1J2{;Uy#6# zF}gf>C>z>g_BFfel~dR~93EYbcU8Q>?oNGj60d9dO&^LCCezsXL%)ZMommGH3iRXs z(T15O>ambYyl7qCX^S)6Z~ z|Gw(v{N3+9-HRF#{oxvwv&t^ShY8h9#_0pONL)(JSSCW`qnIy^1KhDG!(|2${TSr; zZSd_Dj3JpXgjBck9LzAp2&?~&mL*n6&_&_zlimFf-S=y6GwXdRrzgfvlqXwqQF}EC zjyFZ;CI@)8?K1F|*J^nKqZNl=1ORnmeS2$ahZ%O&z7`x6MkXxHbrTPeZZ1n9Wi6*h zF!`^PsB$r^)p@yY{kKozS?=b;{k;%Q7gWzz(*M_O|Mw&#Rsnt3U9VnI{*X=f**VF{jFc$c7KzlUie$Z*#Cry!)1O+N5JvmOjHSD${DLhfrG#2gRQ%e z#GfCwL5>6;4GsifUq&1~lB~TK6c^!#NL)FJ&G?sbs(&o3F#GnwY(*Et32y9mY^&v3GWyGZ61 zdLOinKHt`-t4STSIH7AX{Io2Go8b5EcBgrj`zI%M@o9H8tj7`#^UuCbE4NK$K&53P zxc*nl9X*tcMBOPa*(<=$g`LF!@V)C_!DjxU(0v%?x9vT?bB_MIl}Gtk96wrj)f?<9 zsF)C2oGc_vK0*1EwW0xw*zU_~(S<)e#fr>^ZbA2iaH@5koK8Wz6zf7Sf?KKuFy%>qvm)uVeJ^XRir@UKE$)>| zt&{_3#EmmHHU5BT*Yq0`Mf0tCgAuesMv)V5ret~>!yF#SH@81Xi_7|FaN-A@w%@qS zBTT8~AJD{lCsxyPc^q!8aR*K=0?0+q}bb!@yJ+n)8s;W=JJ2CZ311RMJ3`kq<%g- z^JA~)XPzV3Vk0aT6BiD?toeE37n4;4Ulxij3=9JfXLbYYtpC1K#?OpZYR7LHEnNHq&ff+347Wi7&;AI9$ntZy zOC~Er7NI5cLpSaD^?!>77XGVuH97vj^tn!P+coP#j3tO zTzIrkXS{*iB7-jRsUs3mf_W@PWy>okPU6I*#9V7>Hk)nY^n}y8;q!r|z}5O_R;!hV z4L2{a^f`EqQ~BS9i%Skievbv1@=(0}+aHwT^tvxB@B))+=%x2iWyz>~d6#BuV$GP)q?+|hf2bIb&+k1*o-@uSCU<4@dn-OhTVRr$Jgz<6u# zYAB0$aUJ2QFYCJn*AyEEmtinm)HaE%DAji?{6bpGtfLyx{;smNf?s~*g(s5>`N?DE z_&wbtqTg3XZuE&|n-m!lDD#?T3Vw$b5JqX3Q{ zaQ70d9cWKf)aT2*w*ax1TY*5kOY+XiWn{vMGtJ7liut z{11ww;0#SY3ac-pDn?ybf!@bf z5To}@cf$1mP|KLuC)67ciHhm_iSti96+k6EK;njm6gA>ls{yEd+XTGpi?x>?uVjsD z#*+o$Vd~pD&g6%-k9F*YXbPu({OK}bU~5>rCT3mZ!&8{k2NPi0d#d1o=u3dr_fOifYgx&k?dbUA#vx zBC)8zA$1z%SIumxl*8N7OG@8wPSG)p_%{6?nESk`;}V3=d2RrHF?TPF0@qhl0}Rzh zYwHt<$|LO&N8=6Ty60M%4}3@zH-e9qTn>&bWEaS8ge_eX)mKA05{7fzR)(oBHZb@* zNCGfBJdnKGfk<_lAF2zlS)dV&axWSrBs&A3Ab7JPsD_uZ_WJ1R$?A(;p)cGF7yZ7g z$sZ2?sB#eG#nDGzWCoJFwkI-l$>tT#~V@9?u425#yfTyU_?Gl>t&!OXdm{Clu| z4hAX{dn>)Id7iOLpl1iFD_KpRvT%(nSgR`>pI;wpIn)6xeNbt$q~pbci!PU6^xR|T zT#N~8Y83l1dGC=+=o)7uQ6~J)OAcLijh3ay#H#{keac9utyzglj*3DYY-)Ku{HB00 zOS&*h;I(`tQA}KGH8+fie|@H}4e9iwV=?dTjy+l%L=elNjD5w4T2dck@PKH9A>TY> zHlV&~#^e(?wdjPOCVVHFup07CaHG;s(PtcYrQ*p4&|X3F%kvt8tXoIWvP>p$3h zt;yD`ac+jt^mU*`&$~>PTv3atxdUrbB{cf6KvT-xguM!|8&5{;qZpvL9GA z)em>gcAP1sStNr{OqXEb5w^*qPNZgP5mT7J5M@M&d&yMWF6)VYGlnj1(|@L3n#5@k zA+obb6kjr?qVe?6+~F9v{Jhb-LOBau_#k27vAl9RfZNES%%Q?IeYP&WX}AN#p-iRh zQaPvGA&A{fjt)a)s*%9Ci4z^2KF#ehD#2pPz4M(_@1r~r$w5y3+goNleW#}pBw#Upvp*bY^xsf zyHds)RMu2Aqh)DCOpp^0DegJoQdyEJUVQF{z^2hK^bgUVriJy9I&mVEzVl3|5VO3k z6?wt7FsN?vdA)sCGv9=dIy-gUDFv?|owybfw#puJ(FCh&5K$IjH5@TmPk8$iE4@n`V6IC8juhR25xG z08G8g$$i`~9kz6U>eQ&`mv9QWeXsugpDw2Brj98;r}}j_$OY(%BAO3!(V)rUMBc~w zwRo?zuk~tqT-tt&ewn-_^&-}rbdPYjF7FUH-#cmMkQzEczcx&}ZYM5X72PbY)eWqN zc8o4TgV+jWY9L3iRwzSNU{^xHt3SO1V0L1qYCl2wTf-6G2YO=MJNcAd&FBsJo(HG7 zz0Sbwp154bZZO-(;o3M$A!8o@tmq$mqt9$OT zHeDob0D&WfnqBYDlFkzV;m3N+>Om!gBMOckx`eHl!jvHe*UoFH1Ux=2edD$u!1H_I zb25e;LnmR^4{-bO>pga&xZ<#zXnLE2PV;mG=yv_|Pb))Y7WM1I@MU_*RFKO~Q16wU zMKlY;o5R+S2d32G1(3yM>`gIGJ_aOjPNfUM&pRT(nOeOUKb90?bkBJ+8rd4l#~YKj z;NX-@%vP=~>AOHbaZ+2jgrjlEh&*Yb#e!K_Pk`HFe+uFP03KQl7A_=No^xjQCD_L&LNQVzodcKQr%bfMzv~U9E4CQ66stwC7*1BVC#^W25xf){BOotGvafdP} z(zu%D8ME_Fw;E{`ISg$b!Vk?2=6kcD48tyu2HCi)OCi&>Xcs$V=MrnQb7C#D&ReZc z49$X?hp~6ZS9Dr9qxK|Y)0~uh9Eu_JHw#M@bBVaEQOONtR?TO)_C1Wx4CQnRyJLd| zbQau-eVTGRsM^fC8lSRT`7jW>o*SVyBlTW4bE!|0pcv_jqK~T=ZgC& z84VV7W-atDl1QZDaN=CDgB6gQ&JtWSzgFRKb`*eRd#d$-Yh&&m8da6b*c%LgDLh z_*w-__VKE2-zKk9+HX&KrswqK7P^9p_i78_=yP3NmfE-o-KK0s1|qyHGEJ0jX`8HqR9+s+p9>x&HyXX9;0gEf+s^6K2uPpfoxq3U?@+jQ5^jE zU1@f9WcI)sIzB5Qt^QQmEqOYsEZG4-9+{hfXM9x?0ej2T2KIDz`xiwMf>f< zZoKOaT(2IUrmAlXV`hqoh`hD9T$4KtAwm1lwMh)6qceW`=u!5gCXLgiXF+;|u(V@^ zKW4{9=@XkdU+o!g7u_v~H_JJGubUIgE!VS>^T<_q%49_2EBq#d{%lEi$d(O( znGtK)l@^QB)Sh!CkIYY?)&wb$|Dsuis;1+LElm=;N|}{#f*~!C>RY1)o4O$zZz>d# z$~=Ohsh~tNpVRYMxmmN`JRwdeW>^aeAV;&C2ttETG88^X!9E%(Ez32)NJ z<&s}(&U-tg89Tc_jxDU}+JbQSoX^B~PL z@s`WCLW|6<1b7@o8~{%l%tEWe@Ya02v2^C1*g0yhMx$4ukSVo)c=B7D@(Q@-qBBK4 zMtS6L%UT>wY29=4yTrK4rxkuaNYo^`ZNYVuWhxYK82r(h=*b)XxYVB##-|mOYN!@3 zBlHNHh0=B}sa}L(Iy5=!lapYs^eHM^Io@t4ZN=13p~ARX#bJa%e3c6^%8-0mrS$=Z zjNP(vhRO2Adb}7)^)b2wTwyQ|6o4~b>iulIhBGz9AA~*RDF~Cck@G`JBx6h(C_X1A zcaL#rS<*%=(Jg7v}!*?@Cd>Fu(5_zxv_UV#HudBL_<9o+ycp(V-Yqnr}>mo zkpDjFzz>qu9LWUksf@uE0TZ+dYSUUFphT;~L52-aXzkT@G3o5WTDp;T20G9Aj6*PRV+3MRs!JAJ#rPnTh2%6Jxo2&U!R+ADY;5~!@}Quit3_Y)jSI7!R*oX4p11N@cf}J*%-%?hbAB|nINf=q@!SDmDmcS z6W@&>YQv<6#Gx;z?$h}BLDwjkxGIem4A>Wi5S9sAJlf9f*;BBkUYkUxX;B+DRdC6z zN_mOHs*s1ebyKXbmu!>E!$BlkWv3M5P{=k_& zalP`~J#Ait$tS!qJlriYPVvfJJ27z$nO~(!&S&9-b;b`#H9)O!7;rTxqZiPi(K+M7;hb)}P`pwyLef=#1tPt$CbvaTm^2;>521Wzfut)BEf6BvDiLd- zR}kzi`fkq1esE0HKGW5iJGm|G;2cWTZyQB)v&EFq6`WwM-d8R)aaqrIv5HJYs|~v$-!b1 zv~~|a^!mBNPq&ALpGAG`PI0O0fRzE4dj+_hlDhDoX(zllp*-1QU%TZLLUE+K9idOO zO*_^7(Z#$hlvF+T^in(amPL(3ZNJ)d3Y*bHK|Gb~IDQ*JKa2c>d<*47|AV+2 z?<@4}&d^PD!m_BjrU6~w(a>$)oY`=|CqP+&D0f>J=JtV{ zIg=?(opf_|JmY=>(Mi9Z|x7ob{QDZh-7k;Cpfj+qt+QWD0d2bYL$_xg)X1$LgU_3jU? z?4|M>P8R5|oAV)%1HPW!b27qi)*{aeh+NVi(epmXNK4oa%`lo8nQ!NYF=)OJKkIQl zoDx%kfbw}W#;#f!$FBm;PoLJ7BlGy>E089+stg*Rp6UZ0@pL{|aH6|Cmam;DH!oH# zS+ZC%Qzjd#hPOi8z#D1bz>Q$pw-FBj_y_Y}vWNd91lVrL|N$ z1*KVyBk*yZ`5c2E9oQ-4R$C^Bewrg3QOhEl1A!2xxxFw>Yl(AXQU2h}!18TdCR$}B z8-%kU;o3(t?{)~Q?_ppvX6p@IS7iMlk@_7UfPOFwWbcQ-*p_PoCp-TbzlE1#0)jOn zP8svO!!`ZQF;7a{>06I{h{8wh-HA)g*7(KP2(Q^l z66p=hb^@6hy9wme5x!2-w2hjjY{*(c8ASLG6-LG}G92ADLyNTjbJZ1r&x8F(;CHBv zZIYs z(aQUc(RB>YA{31NnzGP%Hrn~h@j;apl17tUIxpjgV%Zu^fs~CwUrYk3$=Cv@4@nIP zw*lSj%+-Q>Vy=oLT0jc_7&OLv7<4z>4~;74@r#-5ubfhZGCZ-J5%85oh zp~Xq)h>O?AGyV?9OE-A~Ce?>ryx>Sn5uKD2mu9!ex6gND8Oym$K*rW~93Qr5Q?`bi zI3YXLxoE9KVGK2Qv@ls|Zblz8@UN3DoC@1)e@j4nIIU#%NZBnaVyfFokV?9$1sK>I zUooDm2|Q3~#y^yqH656@$Z&L=yYc8Hty@Mk`1p{&Arnm?c%;9mKh#t6_&&T0dJ4+G zp#!-L`FxY#(+<{5D2F0mo(Q1!e4GFt=wj|X;3>oTa(3ti>qc6v5E*m(ic>Z%2A3OD z&$xU}aO-1fh#u*XaJOAVdL?~(3s}dWp^f?PC!AHNS{nv4%EM#(l=}ZG|+(>6GBx;-LlHu}^$-5J(?(M1Z&BT`5P&D_3`H|C@lasdTt`~#En|v3= z%Pw`@oqJ}md5cb2e9+fsCu|-%*I&E&9kxF1}X)e zCCuRmR_Z9@&sXaLy3cBA+>F|;M1Ky^gZyK^y6Mx*+W*%1ojr(qDl-q9t{n%gf+PxVUiV=OfO zA~o3~F=inXZKZMtg^w3#v=V{(w7oyT?au;?zlM#J*t#fCR}AkeG__JBDD7Srt82#n z(}ide0H{;Db-PDuOS)cE4pe13h1?q$G-h=)^;2gDZ#E$^mpbv|RJR*ElGH+086c|i zrEA~I?sS3X^^{r0zP)|VVJOI!3($15W#T@z)ut`Oka#v@STk{?aoo9mwav3&WBxa$ zrj{Se7*YQq?2+ZpnGgn@KE70NpAqnvZZHlL{D!h!FW!9-|C8#B5cZqu952BR|1{y- zt@k6cqrqlT1>Z3Ic;zm<<3ADrML@d0wY*~k;y0kiuTHD~Ux>~b%v=MU-8&==GBEsF z(jlh5<0v+3_%Rlm5PnGCMzpmpZ@L#oMS_47w=@u$7+NU&i+=>u_v;lP<9Z)#ymF3^ zcT5?K7J+r|qM~1!X-jhtI;Fg0-Q`X9Eq;ddgNHZ#t%vYYkOqV2*vZKNBcsvihvl|{ zsSKG#yQg`EjIcc$rPn@n%j1>t)zw!Hh__ct)HYFZaXJ?+*(>0)z{5g(7y`k6i1s|N z|BLhtf~Z7<5%{NFp2?s?WdF2F$_6?yObc;JY{Cu1!oa29b~z^T73GI0Au=Z^qC10R zdA{>*kJk?n+D0mVSIO7^4bon8fG6a-fClo%`J2dNFmkaq|9(0)~m`q;05Y*eU#VTRPXIz+$^u$PiiJ(fy3;h2K5u> zfVO4#zD(eoUp7ln5IM;yCDWTE!SFz{x&1vW<$AW(|I3}^A3eOtJb$lOFlNhhCx4p8 z-#FloT>ZaILl(wowi|u7-|5Ik%>mEvTX9feGATci;Zbdf~tJ zYJQ1Jx}P~c0(E`SC~607DmCzLnQmE^s2eoQl$;iH!=}pPbut#)&QMG_tjsBHbA{12 znW~s@?dB_#yAkioVch!r)8oR*Nq_E|XBvk%c15RhYF5Ct47$X}iofof_km+P41Sj$ zWXE8wsc}|+DiHj&Bixjpf0>>~XLE3WPS5{AHyYP+&-Lu(>>lSopc-wO{`<}#n9IfA z{|Fgpk?~hPaK^6~@Y-2w#mHNFU7#uLF#~nBtHB==somwr4{0VRHS6xBz(Bb;ZV7Yu z+aU)Lwkrj^u_$5}7K*QLV9d-d6qbssOT@m=cK4P`x^q>!6_7Hfx#ezWOpbf#XL08M z=Piu}ZV~O=_BPI3=Z$jMUMQ?+6PDQBI>51X`t)^eTJlEmQX>Z<)tOI#Di z+$Ycy0P(JCZ!J8sR}-~A7rPFd$<5u;Rv$?T@@;s6pK-kj`^{&0y0blY9JXGC2LOY%) ze}fl!BvIy}H0jVN`+~){h2>*>3`{3WuyeMwPH#XPzpC$cSyN=4ScchmQQPFSqDilGCazT7EI9WgDUQQ(7J!V?ngbwTU|C(wxKI_`rw(5 z1$>OrJ-k9We749#U1WiX96HGT0Un=vZ+pt6II${ItQ{%q)nv6B+E3ocFP$m|%E6Fj ze-OncB4y*r{4N<8GZ-d~Gfn6~_SIt0g}{Ph3NYgcuk~)W1vBXa>BLda{d$`kd=>|1a0=m7iDVJ6k<*!)gMr0|=z-t#oY3{Nv z6~3^SFoz7U^%;5@)5D5dkiMipCJs zzX0x##GnF_v!J3!qN@|bH7SLT`Z zJ4DL{(I@J!VxqCR(v3yRIyu;IjM~UF)hvm%0}FB|9!_o$<&Ne((aoY7rVV&A`xWT( z7gcE)Qrwj&p!(V%qvj~t)bmt}^1B712&D9O8pLiJd{9)GKYCGj4^inC`cV7iVeN<) zKnXxc;hmTIEK1{1J%Kvp3T6h`NLTUxMLL>r2XIYTi`aA01Ig+|E1+lloF2H!T@y#| zb`|N`U_zdqKE}DSRu9COuz?Pt(C-W0xJK$ce#jbpU|Y0jaKbZ*i4`)@TMaReiA~(T zXM|Jv?54SpEfL{g#<&b`vUHhE#WUz*JOU4$bnMW!Z|H?nwNl(0dLpcsk@t$SAZ8`q2jyR+nA+;Oh9(>;#JfJXS%62br!W>LYAFy1A-k0oeq$psR z!B&LYQL%y96c@)>HbjqNgMOZ@vTPcmj_US9ND=RTSS5_+NSw~>f(jLRbi&$gs$o_w zh!v+l=An2bROoROv^{MVXJAEOR#%3-9aZ=kDPl|@v>d=m4UJzikoZ`5KApf_^Brgh zzAO;hy2h0G#R+%Hh`HzugLFvTCIX#QX4;A20bfx0mB$;S`H*q70Bb|&O9PB$iU-jX zbj?M6*I2(AS_5tUKFbiCb-pm)`sDBS?3rc*m#*_ zjl?1;%fLl+^F-r~(e1f7mKEc-LMgMKKWVwm?g~@3{JfI=#e_+g;t6_Wn+om-p2o6N z3YG_KC2&`9tc;Mu_OJJhT5iT6ow-557B;C^4!fu`7%wBJsAHlzv-zzeTEinD55vs~ z<|1^Dw>RRFpP^;@dT5aq+ava&9bNfaxfk`R?R&<1<+CCS{JOvgv2%Z*jMbaltiJDC zSR}L71es^*}`HG|wHn}Ac%tb#`z z#~i4@ULWkyujG$-{sd;f!QiprN~dPR1C%Rh|5~9OV(w1ug6L0>!6c9K`Bv|~u@#Zn zm?V8fNPRUXyV=dbU+*5@ZLaGzXi1P~G5Fk>=o=XUUrm)mkwblq3V;tEBlW`*x7QF7 z4qAy^PwB!HH}D?Gx|`c(#%^(N!A9gYMwF3lz8K>cm3+Q9qlrYdNEPS{HI#f5`fB;hU?A=JCV9cZ+jC zAc;`cM$Du){){3&F#ll{Y+=sLf66-zII_7pn~~5_Rh_|8o>820@5uO^yh30o_d*i5 zhZCurZtnetXOCWS_vKRp%9W+U?&TsEVf_5}7OqX6Q~swuP~K7hqiQt}x|*f3nUUp}NQX!1}y}6SK*bWqHY; zdi(`4QB9D)ipGDNvi#gs*jit0Jc84*#rpw)6GEyd#wOdXUv&syC4N#WRe2T7Y=)ui z(8S5}YCDil;;PB$-Bg~A@bk)sBkFeyW<;VMyhKIgCa_h*6E802Zo;>oh0mDU0^qpg zRlS02UP#oHy;Z1LGkze6+F3Km26)Gq^t0>Tc;X-Z+14VoVdiQ5!SjO15UV7INwa4U z1mH{hL^7(udK_>mdoKqVUfJ!HMxSu01bP%J17JT-+t4dJ_MT6HFV>5MC;=lY5&wJs}vjno@J>+HE2 zfmNSJj%YunqdI{V)AQVb+L{$<^S<3`FH=a1rJ#U^9qyZX%zAhPyzn%F!VN^>^V5`s zoPx>sA7U9l{5DNVI+;c=Dw{c~q}wSt`r^WUnI40m$&IZ8J+WJRJ91!7!z zuZu>m7N2GP>H$F$SvSRw9c9`vynns>Hn!llGQZkg(O80$BQFd7b5YC~ zO61kT30JEOrYt!FtDb@6IkKVaT6K8aQr&CC$CKdYl^!rw8+e235(dZ6U*5tWF>%Oc4LVpf@EY#O9x_v`XJryzMmL;hV<7XTYt@6K~7w)`iyM3=%5pYDuYfA@l z-|c~+xqaiY#nIzcyy!uE=@i^D)mW#cbcY8PF8|Y5aKS*2tI@!0HVwynsww>Ucr$?5HYqdF@x?gB4n; z!LfQxY`z0}_Lygi=N#nE((Nvz=CLHwed^#p)R&1iA`}=69aT29y|5!bJViQN3pJd`&`FRs@BoIn;q(A$PP``eRt^+IH4DxG=vy# zIJBB85YgYh?K%`IKt{=GrdWhD@bRzLKGPByxfI``OK>makGK(PJWy#Ao%pZ6{u0~( zPaw2M_|tj7%%aUgm(TgK8nFa$AjP_@af4ihHYQ<_ClUfOVBe(dHO)w4d9+|rOcJhJ zuvC8Qbny!@PSYsz+O9bU-}jfri&U4l*80 zSI_a7kZ~9Y8E-}rm1XMbbg?eRv^f1b8Crh~pk-_*TZk`qYql8b-^|J`R82E77ao^Z z6unF_Jvd>JyTYDi^R8S!QSk_wpzIL8#EGYfpXjSEQX5F#ZeLwr1Tf#4;dleU6DJ4zR!qR3+(QnJ2-bnNPp1p(8y-i$S~_^|T0ldc-`HSx$yY43)TZkO1rK;W0> z^mHb5`%=pV;V1*)?n&TFtA{645*W>c9(sq={;Q+kh>t9ky1H;sB2zRH^`jx7Z-TpI zcdn2|-hJ*pWV(Fl2WBfm~=+l^2i`%xM*1-X#ybUx#z#&v{1gvYO3d(9AmP=04G3D~l*6v-DJ# zf_nD6u=E`mBmtSX2E#bV8`p-?;5_3cpsuPzRC0FrD+4n>6^M9h-)sbF*cm&qDH*pB z^e(xx0eIhPTr4##NHWVFW0bCH1H6PAl#i{Y5C=SZuvHEs4!SE!r| zJ-Req*|u>X%yi)fZ{IW1L2zEvRGR3KK1$@CFZ({hq|928+lAw0s9BOLjz?`s7|S=O z*09vkh>aiGeL1yuLAct%!!o^}PmOjv(k>WeCDK*6u$7zYDWN8oGK8_ zzW>R!y)^n)W0I8I4J)#>fN_ssZQ0S*S*@kUI85+Qb_^_TY;j+XYjUXoN(vpr*mh7< zoxJG)bEO7m+Hsy`M#l4{Y$NlX#Rx{TEidzp`-*LEFr^gHkBaZ5lywlx%%lkFij99} z3Ci502=-=?JU*&wICmx9ObRt$w(PIX(zh3yuRm5$7tZOlLLAi8xEWFo&O)4l9Pp?~ z3A=$LExPx%&Q=D5gGr&>^^|7xUITH_tX!_;?nj-FZK6~&=t&|rS#Zm=$GR1`xVKN- za;IEScV!YILg>ATRMRF^Qo>Tv!ica${K=42gK^Uu@fB(1KIgKD1TsAPdXTPx(f(H;7$@@YUVtsM~{C)&2De^F`91X7HfBp@gb}a@?Ao!4$(y|YN8rVK zEm)00MbKxBTPYdhVo(U-Lf$~^@e7g1sO*Gkw+`#RlFaZ~Q$fr44_V;~ibYwas=}8! zrA3PdA4Da@ZPL%{u82A^*cB^m%prYzJjV?Kzu=CBr>7Q54^VUuXE!HzitR88lC1eR z%~la{`-ZT~6e->|2TPjnl-5JDl~g!qz}^Q^_L($uOV>@QB5fsae4`RLs86RaR0*Tq zXDkVBHC#Y86Pos`_Tl+dW5=1kiR}bI5NorVt*Yd*%H7}kwQgdVG&B9ZO!7L)Nf0Hs z$>dozmlHd_8(lq+*4v6WVj&8JBVaJTZ?h9tFQ0ZCvir^?vgw#~YXQvzxsSA61a}=r zqF)!8ht$qUrB{>g86t(=DnJqm#t11`8(X1AHpWG7%;m}_V0Ht?0%v%6G_f`B%D(eS zolRnSV)|o93Z@T2Qv(aVwej>rtkHzC|AatP7n5@ip>(Mkz7A`J#iQ7yub!{@0s zql4tGqqT`WEa{WVofZ>_tWY-99zFu!qqAkgA4;FcMys}tG#HH2gMKFE-Q`%)uV8%+ zb_Y7vX~4yFbcmZLuhUFY$X$(u5k5q)*>nY*1D(t@9dmzth}pFH+aEod%^8dM#e_bJnF z-TQhwPiuq=CGsu6nxiX^q_u10Q>ki92h4INr&Qc-rMqjzRoxFii;OFDjV=l+iqgyc z?*EUE_0V6ZFdz(5yEg8BvdytdN#MToIm2)duDNP()oKa^s{VkoKs?F|*qZgd7JY0? zXD|0QuFRMIFf{5B`4Zz<&E}pG>GgxpD`1tZc3*t{--`4a4n$hAYuK*DP#UD`gM|5_ zj8^2)!x3K!Gl#X05h|nGe-)kP`g1pi-g7q4?Q>Zln}TtPqgvp2yY^s5U@e%04ZxZR zRH!iQbue@nnrq}1SrkcEMtqCJ$yYbGmzr+a{g9!o=Szd%z-iX8{kHO?L`EV2I4j!L za4{iuOxrUadF$s&jF^4GKxs^5n*T2$AL|}|AKkl?E0$#aBT1C@9au#&u;m4*j_BE_Z2wRxZUb{6&;OYf_#l{^8VN#p_F;(8#%I!OZwEz=; z+TA=~}Y57SgU+Z1J{_WIdYWcPy8i zN3=9A4$PYCp08^Z?xmN(wpxI}*?G>~}_Jj+kB+qk4@7{)HmMV9OZ`$O&g zy~p4z!Jpk25hNjX3hb-k4`a7K3RaCvDyPr#>_*BhmKuMy0e8aI9=(IkA4FWgi^|%K ziOD`VV~NgxLZSYxQq#-nTt#ChRgYuXvRm-D+371NEwE8S;j)={>fOGYlV{A%8)nsd z?UBTskZ0>^N03NvMqugvK!L_}i#&=bQ+fe7?|4$O(V;Ml`5trPlh6U6g=o=uJQb{p+ktL;jrqNKF5_KrQL=iKP8(D^rBCE|p-)By0df-j66**bz(O5mqOn>z#_ zEqYGI%-S71q36hj3A?Mk3|srIzs}1sEXg`R@*RHWayB4+J_1Z~u9j9cZ4=qJZ;^ko zif)8mec%=|uo~`gj|%i$wJo_8Y|@rJ3dR*!!k1<|?A=*+bIjRm5#dF4aLH{>@3o*g znk*>Gy|JolbJuF|;%yx-zGV3mdEIHN$8T6rxZ{imzss}F%T7VikOLGh4yE@EOHkAZ zO=2$IvVLM?!@tE4o>;A;G$!YKv7CBM>9KGo*hHM30t*9y@}91MALE7mTdJD>*H9w} zt}sA-ozG(^qZDImayM z{we5r&19wJpthg-J>nYc=tlY#kbz~d(=AWv%W;bh(mG`8whxNgaG?4S5cKbP&W+bP z(u28PvZ=vJ9%y?hl&KjGEYVicRfGtZ*8bX1N{4Wd)gUE$j{4#8saA`btejH zbFZX-W`W}QmZa9Pj}YyP|5Ie!Ve&B-yo6vLG5(W-1!mB?;$P#=tH}g%nPENiSHeRS zVUi9iG=u9*JOsXLav+a+(*C?GXf0DM&;k^~xA3JaXj6Al~!8LnrySp$@-4 ztA-Q*c0-+5h*4u!J3|(I7enz;cfPJhIY2Lv3Wtb=*KRsv^(Jr%*KmUf+r(jN^mY{t z5RwFkdzhkT>>v40_NOJ;mOYdESxOnl#E*M;S~8jC94feHN}8GU+!rymCn3NUW9O~| z;Q50JFZHCOEl`(ly%7Q&t%}Z{zY#|81+AN zp?k=q*{DpoFt&ez67T5YJFL-!xJfBe%DK-~lFY07T6lig($jO&A zg^WEVO9u{fa-d$res$ar+D^UX{?~3Cu!kk$urN85v#}|;qn(HN=d5Vrj|a;xwpqpM zTvzgUVz8Ui2~<>`m6CY$JaxKhv>&6l)6g1w3S;!PK8mQFI8?s1FC-MLZ2x) zCX(HMg1a~3DRqpCj^>HSTF)qQpL$F9mm!M(JZZUscD2#Gai%Gt8_6k4TfR~Fc8AH7 zsE)oa{iv=TgNn;t>$rCXMLNA8Ld1~LODJ9#ZTW`91$?;9(q=uW?VI-kv z=!YHm1VaiLm;Qw>eHX!UssI2T-qp__m(c~seLfrKUNC@P(^KT4cIGt$EdTss_1mLd zT0LqMJn_h%lS2I68iIVezcGODxNu%fboj%xi*K%tTh2|%CG(cr0sba&h%#5VyGOht zwiOLd(XVywz5|+n8!a-akyU1*JpO1r-i;&-rh`1r!S_Cg2Sx?@Pm`$|Eb&Eg1@SIA$7VhJW*g%MGv(byXm6ZK*JS(P^o$D15{N~YQ)z|$h z+j5i3-dQE1m;^u3vdfcA+8)<4$Qg}g%{D@>Hnjdz3Z8#VdaBTy?u=apT%=m|5_r6;vI9ZMO)l1+aQpwGp>v!~+X1A=R^v+VT6aE2V6KsBzw&18JHeF@&@wsUyje6jg7h=bY86AF|2mf zeiNCRj$hcV(Vh^zT3<*ObAzfT44i~%smq}AhWgls=pfEq`UmyK0bp9Bx5B5lH z#a@T+c&Z+QqY$6}jB9_jPDLv)nu{-kYujzhq6M-2mwD3^4-Pz-6U#MuIXyiOpelQg5VS3v5{%&n2@RyEj; zuYSq48||oGweNCJTF7m-Zb7ax238|VD~T`%=v?dOm9seWfGHl<1N$=NF^wR8k(jxm zSdbUeYO!H!8~Naddk>NSrzhHW>H|C$X1AfQqJw`}zneUP@qPj;B&+rO?v$0x$H&KC z%W`i#Z7m>qh3_2rH=P71n|*j2#Jecoy1$ngIXF6a5e2M3IV59LD+D>XF{O5qw|=(r zveSxv7Nct){6+9}3{zJmF8fnNT6pUK-}ZJj&S$N?zZMZj~>i)b7JTn3WUk*|?wKbdF_Ep_4l*yGM@{aGS(u7>+@6_FPzIYiTuifq? zpF?R4N@;iB0TQkLPf4S{FnQxu_bB*+!B$@h^=sKeoc#h`OaV`5K)qAFz4A40{15oy z*J5$8XQQ@+4sHmU8C=n5;3GfxZ6>%DF%(Pv*5zd25^wUK(byTxbO4ut_m=`;R5d({ zkyxtgIS&e6+>f?v0iisz}Ym z^JYqC23u=|*42;o7k`o2?;r9wxEsrMEszVw^zv3jBP^cDLiimfN1o}zatF%|DteCm zz50r@eH1ryb1w_2TJjfwS&z zRqNIDX}3j0h(oe?qxYjqj0tQ91=oEqUhnl8;RbYL+W&$({;vnr{7sCEB+%wS_Lm3@ z$|DFES(}gn)kYOZMJuCQEY^f!?`?1H!Kz7D?^uLC7Z>?b>Lre$J^f2zWre5YFM*aP zw?bFkj8UO$3KatM2@+k$`D!HCeObCLO8?H}+Dh@2=fe3#(iXXrSPTt7ZtP})cS1Aa zTfCQ|Me%Xib?--FyuP(*-A1n-y3WDrPZegvY#$T5+|_YZay=K8x0)A7NqM-}fDr(7 z0^Zu`GpLhU=0X|-j2z6^aieiCp``6e@}&S|LZjxr)Y8synZVuFYkIGZ=7t2nvd?8Z zi5qRKI|t1VnGJ^jYbTxRua-FH1B0-$>yo!~Ft!L0y^lukLV%y16@eeI`kl`YX{Bjz z@_4KOoVKt-0Rf!l&VI|#*y>uYNg11O5W4w@rpgA$z($0g8$3cbnkXzv0@?UvHS`{h zUJy?vs@@`NI{~i4mp=7ko8lQYSL-LD@Q2rEQLBPH&h9S^ciPAj>_>3~dBSQm2oXRD zd8`4btbS3fZF|66gBdl|*%KKOh;@pNUdU5CeRf%(Zm zc#8WqgN3rW;cUerz6QF>#ER#0dz{$JG_ig`{TI)!lo2^7Fu7Rvw-;F3*Sj>Ea?!b1 zEZ;k4?ve`N0!j-1Ct-(loqFOYb0JKHTKB+?cGX z2fG@RI8A*lCAGrV9OTw?st;&7Z5?uhr7??8%XFDVFciQUYQZpaAl-4mkLCj`8Aa9$ zbqRW8oTFlU4h#wGD>)AVi4o&Rw#7pyqLTeo0ukJ?fssqdeH1tED!7Uc%|q91ip+qX z#pLzwo-I&UE!el;8-D)JQfb3!vJ?~6CsFqnXXOe1`Bbay9*L;5^X9V{QaeC=k^yk` zydYK-L<))NxV8D*e0n)~*5s$t8dP9hTXf;D@NqE$e_qN3$=Q^!iEjLixXu?CO0=cBYfyS*ytCK*NmcQ{0*Xmxar*1LOICJ=PD)*jN%?sBY>O z=kQ}>oX13cM%B}T?cnAM&wT6mfW&*^w{vC~tqZTK3(sa?q~E_cBVNvmAFOaigU>ZBD>1uI{YH(@lu*pV94Q+sxFl%yqUr3jseQV8SsUIdU4M7{$A;==5u9xzfzcikf!*ymb5_PVNzpblo-$(?rU_ zvt&$zCX1!AXY)x*GGO&wK16m`v!C~wd1)oc9}3*-7C?;6oN4bAv~5dCD8tp4RkGfz zBa^Nzz$3%3ULwhN^4DJSbkIJ9jO8s~n$B&Mk3V%g)Gvsi6}4k<-6cD#IK`aJ;y=SP zdX0{~q1_q$`97`UW^M=W5MdC_9`#Nq;QaLUpegQtJ9BX}emZzxFu`ukI5v-DEV{DL zvR13u)*-Z*$j=>eOw>%KjafW&J$|5r$bO^I>~Vb=DwHBR7%HB9qY;dMBkiem)5a#! zeRNR2D*~Ic4P=}cv!m5@Pyw(89dxn-^`iB9T!z(~cNF5@q_;U%I}90DD+0fSanFTN zOsBUFusUjLq*eEiVKu|cGOHG*$d5bNa9a2dJaob|n#Pcl>KJRwB_zS&C&p=i9 z>JgebF@J^3>tLwL@qMlAjbw$v-mBry{2jNBKY!{P3SVPye}V>Cq2i^Azzu#yO1!{d z$_wJ5RTEm!mCT&>mMHg8#kGEFf%ge1R$Z{)eSG(AW@i12HHzv}B)^GI-p`nJ z6Dj&_VytvgiS;7&v_K0Vvk%TJ3nD1h&pGn;?L)V>i8zP5Y0~x5<4`G-JVKaK}Ge_J&Y=ZepWqphpr(gZ%A#lbTgU4IZTc}00hM0Y(d9A z`D&`J0OJn!?%JI8rGps~2r7lVL;WpmYWm7);Ti9>< z1SX1sB+`;!3~l=|gBrPtafDyijhVWFaICgeNOVHU!GE5B#5cMZl`Y1HUFZp84G)VdpUV!QCoez7urwUj$qnFeO}XbAe1oOQxMb}Qd9Bn*dy!`SIPuqA?%%y3|YOCe_VGsIe)=C9*On0z1D%srYkE?f5hW)$6DcOHpy%nwnPeXQqGKt_ zgP_rX;>eq4<`d(D^@%r`jRX*?lQVgXTJL#e2A9#Y-4g$Km9vCm?l1ZT-$UJg*z5|g zt>Y2XUzqssW98|ZF~^qV80#{<7$c!~?O3Z1x!ubaBhp8$*;8TPdtHh+^Q8tG7x22b zMzo`VTk!nHA(3hfLyEjKU<9=!pQFvcO!umE$>UUO$e}XRWAA(wN9&o!aiqqM0#!}4 z<0Ag&gb(6Op({}%=ni*q-R%vpkU@cd<8l-o0iun^htryy^JugCZD_er_Di=HOz-!H zUQR*-ovINQLh4RdJ1&6-O7K|%@iV^_Gv(A+?U-)KUe^=JM?4>?b`6g8L`)EeL*5(O`pAyjL-a$ zIw{(_&3RJgtSrsM4Lh-7zMr>Y04$EyhDK-vfJ39MP4s zj?CH7*wrsO#qg8~CQgjZX%i!R0Z6y5&|9qZ@n-Y&h~NM$=+uafcG^Py(yemr*J7M$ zk!6{~I!ZdFQ)2I(LMRIj!cc4{;tlLSCAkYTdq$1Sxq?O(8_-l^Hb3FkyzHZnK)GQL zQ6=v+Y_D%v?q5PHxj__^RiCA?vJ)B{x)E2nqMC&dAv}p!67hVMK1t~B&MUZs;4i0d zsDPz>jId_)DqW58UI6U?-eL(fi8ob{e+%=}TvQEIL^wnad$K=)J`}x>U>qJ7M1TDz z!(CVVV%tn%Siv;fNGM1zN}4EpLsoa-LlrHld?g{<)^)0i(5uhe(7F5v`%xJ}ACCyp zC91G5CFw#v*=Cz_S;qgEBSjZ^kqu4jg77~L$xhEqrjiciD~>gI21 z8x4NO#+d)S`95*}%hwpLb}vtHa6g8|Wpm$f9l51hOjchp>~m=g%}luryG$HB7vDAi z(eSB3j+3hqKavl3Cze%0<9kt&XmI6fa-1HP2+5 z)aZR)gCcHG0e$MSk=gIgNg&gS)qcs9X0VY8B@#c*m{&MX8++(1EK_)N&9D9_PyxNH z*gg3B25F@x!=wozeCCKWsxs=WKT}Dl|7fp#=w=2Si0jk$wwOKn#m~bqZ?Z+uptA4Y z3fJT{Pr)otQab9=)TE@Le|L7A;7@kpUy(#xjtSljLWAYaj+M*nd>_Wh7pN~emFF${ z;zP9A>SqaR{irvH^R0VZ)sw8Vu5&0aTCi}2!cdoAp`H*N9874AIL_YE_;tS>dDnM2 z$jwGHC(N0e;9#yM+lMMkRHSStIC8vP#I;=5t3bEB>?Yn>Oct=LTc)Ca7{gD5o1$di zD;^&zW5=mCqEtagtW3`(QG}mDft@m}5U)FOsKUne{Nh7buDMdqJ2p-0x5|XDWv4Nhf-}&&nR1_ z#EE+L5cM6$v`=G-?tE!#-t%OKtPjx7)p4{d5boY-8xxj|bYEb0?L|S@;OQ7!7*-LEHSt>@Ae%%}5EG^5}6P?LI;ypuxT)mIw{st=9{v_cu=QgR`+H3|q z7d$biFk>N`6WL$cCV8(Osqtx_<*oVBr*7V+_*C;YJArcg?JOa!ndpXLX#mE4jIdlk zRL2dGbMD@=sGg|L{op}H-bJsA<^+?>h4<^S7c$w0DVW;o7QNfGah#xtvJ$TNqIKgF zP7VgmfvI%9gq-ygeP)Zk36z2NPCu9YX#|RS!wJpL2aQsC(U*i`OaV`QMA>7 zOD|O6I%`fTFQ%Zj^5gaL@PA&JUL8=0{UyG1efJ%4O7(jGLZ$V5OSHq+>o~jEbD3oy zWyZO$fj9mRnyV+-%3V@nYA z+&EeSw%3P*_PL94@|(QQVWhJZPucV{(2w3AX(Bq&Zwa2iV23oN)-uas05%;=HVB$J z7@;v1IHR3@E*aq&%Lx4D{lWXYZ&^dUSa@0+7_zufN%(B@q{D5QmGfzRA>tyQ&hq(c z%o{;4Nbk8|4$md%kHu_A-Y%*=OO9^MyO$-)kROCYkl8eJnUAE<`Ei*~16t2+V-?} zl1J&+{*)f4plru0`^DA}XyLY}P{UHivm~Ebh=x0J&`lI`N~>n1{huIo9+U0)cE*!d z2q$2IEv1^jWCv5ujHl;Wn1f;)2UAQ8JA%iaoOxI5-V7d8q_^ZqyNar|vbzQiao*tp zu||SLLVGBDz)6%cJ)kSI)TUg(NyNNfRr{1(F(M)&Nx0{tRN{%|fg2(K^#tAN+W&}7 zg=Cmw*N*K=oAmb1+kV-5+p5i{76$F%cQmNYlZp-ypZIdbinMzBK@=>Th5d z^drY`BCSflk?zkPtoO8qa|EQ-E!l5Nhaa%{@VT~AN7{>j>eFAnjM2yL2GaPx($rsr zt>AGILt|MLd$Fv5=R)q9oYXMuoT@*EI!V96WxF0@-T1b@Lu`tPjhK6!h}-L~ZrAl2|q^<}vRjZAj1BXePzM}oLv%w}enKfyRB zu)h^ZovHbmm@9qVs~wmsEC;py>(y=CiZmMfO1 zMK;VyGoVCv+}>@psi;*jv^C0`XQ`P`y;V2j{s9mrs-830p=k2X+_9tUuIs?UU&0y> zaxLri*}wzrl^?u2SOHdECL_FEU_79y8`pnz=`=A_{LYRka2mZygqch8G+Lo5_f~ll zZq4Prjlkt;>5SPB&RNqsQ@yY9ypr0QOu%3Nbys)v+ll>32;Khw~=y7a%ZyJs#)P*HlbzPumQzi z%vVOEQ^t*yl1I8L-66E_(Lz}7@Ze$7EJUG3c5PBJwP8PLT6mST_xg%(13G;F&o<4r z8SWq9Dn~=HCvLxQBFf$tqoIlG;CXGxHcR8-OuiJS^D>qHjbY>@V)!eq!IHUucu z03(T{)P>u7o8+8xw+rq#Covb*zu_Nj5bw|HwT#^1L={&3kgPsq8*`aAE)sp`(2rR% zW=voQIq|38FFAJ1($uhk>=!u+?yP}5Qy~i3XT=%4GffR28a)bt-KY!a5KDYmwkV-V z!nLMvcC~J6i`QNm3=bbTVN*`~cQW{C65^Q$AtEdRJ|IRZ;#FA?ynb+WYY0>H{H}2& zpow=qWV~ZGJ@0&G#_MJGnq%5^1AB?;R5iYKEzufjF9hj7lcsqX{6--`b2;fk_p7@s z%mf2tg9jpA3+Nwk*!5|;s?2=L1gDWrG)v@6rBxcM?N_w}#*j=m5;h1-BVKFhY*TnD zbsfo|^}n*-IPRu0Xq^j!+-w4Iu97I)It?Y0qFB2}4MPS}@W{nx*0;t`N@g#C5ziay z%~pP#)t#0ajUD1m;YEJqkIe4?3~Jh&pF_FUIGvr+7N6!CLM}oaY}7W`jUWeSn%ImL zt*{K&{o|99u^fA4RAO#;}ppUb2Awv>pi-7%873{mPV=>Ja&Y- zf4CZzNo0%@KJQa!8Lbvc0~fC!oT-~m>iR)Do>iUk3FYw=7tMzI;;l>hpFivkH}J7PK<+#IG3gH-U>EqncG^hNFt82x&KOit zA{XTwU#PIRZ+DwRqRft0YeK4?b8^V6q+Uy(3`;z}$3Q8q_8w%n8T+?nxBl138j?X} zFegnDZd8(P2&V3?1#ZwS4nL7O?u@4|Cs)#xr(%73mGzxIsG`Zu5^R{W)#&LQzKf?a zkt2b;RB2}wqG=Tnpviylie=b@Kk0eWF-zNjIXktS$5|AFG+4J1ShVLF4{`d8RD4MqWLbFrS)2 z9Uz(jf{DFW{sw)HLDeR&-x~C!tbGKuze4_;4+cgDD=@0p;$0pwVpVbc+hCYyGv=Zt zHdM^2Ykko@k*tVEl^gxBlRCmh&WYC6$8g@=CcDFS@Bcu*X0WrV;ks|fe6H(*tQgl* zQKLz6CS6=!p=o(dwyyR`|GH}q``f0w2?*HaWB?X-8d2UmoUG7OlX2qBg!2+~Vz1d5 zU~PNh+JtG?v^Cv)->xCtf7v^AF(OnHz;wowl(zTr`=!&xsWurYVzq+Oey@>}?pzlG z=Y0=L-1)=-0QJybW&Ym`@qbJ%Fnc|khYEW~a`abg+I5NyFEo?2v0tD&Ihlm`)Asui z|F@wqm?5mOcrNHsX8Qb;!}Urcv*X)|n;8vzi!4ivs}$btrF+N!Dzi?FMOq)g4X{$l zBZjHjkEUl{#8V81r>k2uIsW`4=BvTZ>N4U$|55VZHQtm_kX_jvq?kyHVkW3$Gty0I zNe(nP?O091mv1B#)n3evtv*4LR20Aq;QP`v;}&1uN(OeY zLG6kkPAO|NFY{;aA67Xx*Bj7E`%;Q0;D4~HSuj6-S$X1i5+ru?huG$L^7PdcXi}Oo z*n8I``B!QPO|#P_{C!yuZTzOcsf~Y7|A@mUFY!t0{N=j;^;U|7e!i8&pNUtBl0Y)% zQw1wtcysVW=KajU^ieeAB=ru%BU8@w;%97Y!*G;hsy5R&Wc^pawfEd};{Y{4%D;}$ zlC2$?|Bc!VR)C8S6&IHn7b=^CZ^gj(5n^%R4u7X3iC$>DOqme-7)lv2e^A!ezR}4d z>BM`?1~YRf;??;Be@&};u5;nZoghH~@XLMGg6Wb!^cl~xxnhxh3*!9)t6v6JO>*A1 zP08Yh8-<$tLE*UbsGo5yU&o;Qr`^}TFsY6E&`*HkGlEFt{f>T|d#NJxBKT(=AC!BS z=vc*Cvt3GwhW-wwI>uY%eX!Va)T*80+DpV`|2pd6;PXKrk0=kTc^o6hDeprX?`c&Q zrSoL7{|%J<&v?2WcK_{WNCj`0qWw`YzEpT}Je^lNJ9WR*Ix#Zqn>P0gJrV9A@DC%# zLvQrTrxvpHMnu+H&9&*J&%3KE+o_jPY}99lRz`*LYAUZIMhPWjU3P+-Rkp+2#%@eD z)^Ma5SwV#3{fLc=#AV?O?&T^?_re-i4`*>4-kr;?WyCt~trivDb2GQO&o+Cp`S>-h zEB$NOy5EK}k4;=CK3A;9^Iuh?yAa{$>a}SLf<7`8i4#&{qlzI9qxYgB#@m-p1o2ej zMx#i>5LaJySsb1m=!DYWuq&{DV}u3mopSpE29NVUK}H6c;fmNTtkFI|J(1ZYB2{w* z){NdAb;q#_e+ox;EK zJGRWDa7>G+GruA``wWT0z;(AvxucU#^bV*PvS!A#5thcI_EYnwV|ihqttJwupdC*L zq8wIO1R#9b)D6Yb=E@O5W$m2I9bJbN8j{epyVnmgT))E-s?^*`-Z9W7l<8WZ#@;b)W+s^%5ZbEu5hSjzyF zk9cxIgm)Ue|Ff=j;sR4nx4q*{F%jZFwGMypb^1qH8<&0_@fN(r;=G9&=!F0`Ve;xA zp?+O(i{MWMD#w89O$&6TT@<>EF%)g{xs?6tyVm7&6)u547oszbF0Mg!jzSWK;Fl@d z9$I6pvl3@`k zc4fgUz@3((v%*%{vmT?N)RSYc1%kTfad``Y655wi|Gi%QtH!!?oPA6HJTGfTUH^~( z>Jd8Rv6^n7n%fAAbe^anzJBpK=BsF*?<5`?@*&mjtZWnKTV;&+uZ5X$ZXVf<8y8av zwyCsGO8_W=MpO}pG~mC8NB(cHdN-tu`h8a-@bXi^@QOEqxP~8kH=Mf}D#I@+a+5N^ z?kXQMRPpXpdBt(%QWuO;^?G;=${O7$G*iM0#@g93Bb*7Ybz8@1@NBwnZVd|~vb!4X zUTe~fbxfV7%y_vL`64}njhwko>@jCDT1Qdhopn)SVO zcD>hqYGgKG^=Clu%a+AQmqKfx{*mxscB@U}8z;jH&*bqG@KL?sGQ;1LQidm|gVy9z z3m%Jg)`(3h!!Sw7e=X%I>lHFzrTY9n(C?b}s~rINH!PL@8(1{8Xu(YOjyX5DTqF?B zEk#$@s-mMUcXAzp>n&?FZ-D?A{Tz7L&5m*R>f1N<@pAw)|8>^RF}pZ?`ni_j*-5pa zlSaMJVS^9;G?8aH?p4!Q>)IQ$f$gPG%t4-IUAx;m?wjit`9-AD7@YZDCoA1+fyebx z!q~*V%I__G65`0_fbqvCDAr`7a+h+?V zA};qgcb88{oz_(Ua?Jl@lC%2e(S&dB`|A zT}p!?8t5B9@wPkztJZ-0er5Le?8xF+*d|lIVJfiVOv2 z*NKdBz!%v;PUd){a1h-(u&IadyO{=c(nS1+H8oKEyNX#*L}aWl9`vY;Z zmUtz^z9lQvu4HwiM%v6q9>69qDYavCy=gX0ME`cjI5 za%Q53!y^~Cbu~ps1NyvKOt`Axa-g(()6AscloG1Yb?eogxdq!4(ucSGI~#USQ2= zeG=$wojM6gXVqKx16kc6vrhW=>proLszL_UG(hDZpdpr@MelC=%o|<`IoxQ?SocS& z#U|$_kLp^q`skdR7|RzOz+L0))e?iVwKPiOORKO{5(%Goed#B+Ojzc^L!G}VV!7@+I&Ry;fI?KhdxbSXet7J*-)SIOM^)1clb7z2a!24o5rr zx!8EGwuV~g7Q1nH_rxDzX4SO}&( ziY|1Ei)WFHI216Z5ImSw$n4aVZr~8E1l!|>{-qUn)gicm%#)-IUTEoM+Zv3bk>Yfm z6AAVV#SQ>M>sxdRj$DMc_av&^Ip#W9+;wH%UfXU;bm1yg-0e8Wn}T0iaa*>Dv;mTc z*~qz;f3QfCj&LL|VmnTH6F#|th9hdORV+(j$mt74k9E%e=>KiK%XIWfk!ZMa5&^DS z*bWjAA%+U~_saUK;9}Szm%890?PY<&+%mtLP5m-Iv2*0DA~5{9UFZU;%>W0FWLnJF zbzMC;2wOOGth_%V#orxa0VrGos+v=~X$&}k_NXKI_-N}i~~kcy`7 zkdy90kL?@z#bnL0RVMdSH@_PJ(6@dxWgAFAht^#DJ9IIKs5ozJ-R%2jZfDWpesf<~ z?R%jbAy2o4BRInA)0Jh<>d=*W+UwKH?X&J_F^NL%3xO$>s#5+inwl7vTES`!fd*Xu z865FS*WMkzX)Ed{LWJ~v`&5U?W5pm3J57{o5Y(wvXfbDN1g+)TZ0{X*dAk#o@Y?=U z+VyX>Si2^AseNgA6Pu98i5xe>r6vG@9%UVR7ZZ4Z!_OlzLBLq4IV7@=iHcj=GJGm* zdt0qJ(9vRU%x@Xaz+q6@T3vZ>e9=&?%c$w6pV!7u%sfh7y(KP;`L$)cpyr0j?K{G9 zD}O3sUZ(8!dh9y_aHQIl9)CvCcn@!iTH-ih-CHB(?W^db_S@*Y`N43TLqa{0u0{N% zUA^w~w5j9|Zro1}tA9LczEaTWjnu$|uQBA~eqNF>Lk>$RIc86cW{KTYQjH~JH8U7d zT5Xn_W11kLdc?l>Y%#h88@r1mydL`Ugj%ZU@*ReQvIf+Ha?CIz*_ld+SBy;&CI5e_iJ-50&A`aGa36yGpHw@?^ zc9A$?!RV_S*nSu}3VlP#5=jzg?L{wrqgdSgYvVTxmsykKEB6eY&?k!scY$Q~70OVU zrO^veNMF?K$}QVco}GWBseiAqMbXP4Uf}9%(E*c_+Wy4s>EPk{Gd?vly<2=~L1wVY zG}J!(1+j^*g@tqHG(|#X_+Wft(23@unR&{WkmW+QC)Z+ucwh6UUE-Qr%hlOl`D(i> zeb8;CyOY^b=YmyQ#8xW5!xs#`2{Uve?R)AaYEE1kgir?>Z!3P2PPvF8sM|}Vh-ZW9 zg6pzQe72zD251W3KXn}!TKY%;o0G{u97}q{-Le3l6t$4s9XNN^{v5NvD>c5Bx6r0h zgFvKX(My4`dnp*{GOy+vV;!U9kxg2`6?_l_Sd-lN&f0E9dbgCWwTU1+a557l*Yg@H zdqZnCcEnnp?W-jR`K(yrOV~QRNGRykG~(1KXvXVXPLF0cA&&MBH|PadJ%p>;IDYS$ zNRxv2|Yk96@_!xipa~immTM(#j@b z{8PSlRYFVPXm|Kb`{!5#NoOy41xcCO+yO#<^A4A1+e1xd<2stny2op6>~h&fn{MwjreiyEP5j~VPNnp1IisKG{%6f? z!ahKb#j!|+`G~-~84l^0T_UVru8AO%l$~KNemJpjG97$xW;j0CE$~XstOk%zbqn<* z8RC-X#@9?`T8w|ovvg}olBJ(026w z6q6_%xWOvAdo8{PF(2D7=D<3hM$ZbqG~y=6Wv&EZti?-p9m5r`#qa7<)E6FUGTTWj z50H<+g7M$5&(8zEJ$3Kp74QAF#H?K7YA4GJ=UQ|bA~vyoDjRSoifyQ-8HfX$h1!d6j}xZj{>V1q5@-e~Ofez}3BKgb*M zg@wMjur{1G4}Xn`Yj;}xHYAE(eb6Owy4HM9(o6LI5sRjBPQ7{ZdmaUCyN<$SZq6lo zY)2(=nT%Zh_$o8)vE}!4|I4E8lMzkrVCCzWIF2U6jW`XJcgS^m+Z z3*sf`ulS}kKfY)ac9gLzj8G6KFH+oDeM)Yhk0YH@GvMqL#NQW&f~H;$U+`c)4iA~O zD$gx9;z{Ws2xbtV29@)GzIFwtBk8lh6=^jclVA_$y#TBkfUrPpAne*e^82fDXATZ@ zT;z=wG*ykPf+Pl)=M&B;Z(ZNP(p1>yizV7SywZ{^76_lr=y0J=j`vXz9^xcU^o7ML z78NDz->#Fp-2JR(L#<-I&k+0J;R96E`@vnz3i?c35S1W3yHw;K?MkLe2d2jJrHxU! z?+2JNIy>kj6N)n+79q+$V{dMr3sXKcGi|vgCs7qHU{P5`Zwl1ba4rf-T|K%FOwent z#aVa;&IGH8)z0iCz+I;%zcDJCRGus1ZcT8B9I_Qic+WAw$`pn=Ji@flI3&~O)TG{b zLRh1h6nV`?>*_R=^=xfcx`J&9*puy2S7@WSH#ARd z@;D~67BX(#M;@N1g?yE&7QwryxRw0T(UH!6If#U{=0^!TBx{Lz_I>f=!H2usZJ*t zIK>XYO`aI3Y#Hz?$x}X3?`WajV7$mfmFK9#$q1>K(QW=%QWjDp06X8&+%vQvvN?pq{)I61yyt(SeKwc4&LWMq_*P*SJJ%DVGl! zf9Y2P-D6ZiArg9U$NoBk_kfytqd+A5ps}!;Ih%kFm5O-bh9GE#RF-OBh_7+F~#wzq)es{MWX5mG}}G zwXE*Z@#;A%;f$)Lc)5wmY2}s5sD*LPL-6dNr~Z;_H~dkJ6L)1T3md4;PWXJvIIxC! zK8eAdxyEru6}kCVmDV*jDM@!&@I3_VE_&(AKuE0hAk_na`{$?dNN9Q7JaMJU7i|AM zzdY((e0lmND(5GnK_%IS+5tuWl$a20-GApXdP$>37<0!A#s*V z&-ZSpBsBC17mxri-8?hg8{NHzmX?Yed&|5a$IO3|YFNBiBIe_sv6*c)^{?ZQQ@d!$ zZxk+qaeo>HXEKutLl^=~(j3J2zlbFp|B z`1#E>?O$bYOc+;2S=NE^u0DQA`*0qAE;(_X9?{*pJ%kI4+0ZrNmYL`iuIIjGz?zds z6|<%9qbb>@v&a-EJU%e?y}WR~&-9D>aKv!3(e{_%Di6bf-?WPeUE6W^|A%RuV_p1p zd`bWq2=Q^xxaPmFd<0rDz4NPxhTZ5-w71O7W0!16$%V==@E&x*Ip#gG`U^MyeW<&F zB_cFI;=n?}+J+&4HTgl=xv34utq8FQq?Xk_y4^cILQL)G75Yp(NxiV@^2&b8;b^hb zt==<&>w44QwYzmnC{gQXf6^+nJ3zGqpU?(^XIDrKv9Fc zbL@1@{~gQxUqddE!5q7ep@l9Ks+zj2?y>smbDC6}%F-Io0O*fOTO?z1^|#MBhs278~zY>z(6?gvPjreqHq z`ZDRB@l!a*PbM2lG~H@KGXgULMsvh=bHerYYs~lZ>DuzmQkV2=MR8^C|LsBHdE6tB zJrv3d3WSwE^noN_qakLox)W4IHTb8z=G~K^D1T}uFY|aJ9;6IUQTeJ}00eiOOUmcW zWN$r8{>fTe6OwxJKemEr#(?X<1-kSucAOsT*S=XLpUdZ0ykko+)WH>^kvS!H{8~-z z7-s$D-$F|EDsj*Axe);|dmUW%T_lPZ$FriQP7D5S%25(J<0&B}E2!(stQ!nQMGJWL zx7s~H)Ozj^b1qFti=dSZ#Gzh(KCy*|baAh^O3dnCmX`Xb$-=U=gU9+Sye~!c`k^eD-n%*Rk0(sK3;r!rl6y zPRm*50jo6^iPxSuv7dXkh1Ablm?qa=%nd!0$I_ppGpJgsvcUF;&XT!u-k1uXgVc_x zn%^aJ#htHl55gIz#>@SGKn6EskGhp8Mm^DhUrjJ4y5AH6OY{?1#iDC(jbX%C@s+su z3f3IQCTO$Ye?TKkTY=_{_*n(TR~I**G)b>d|NDYl|E;Sq1w8xdO3h&s{pIZlbZ0eE zE3RQgaOycV>AHU2z!JZ`2|#)ITw^Ng;Hs2I4_RBQp>H?D zjFHV`7j>nWyS72xs-LPxc2}e6qZjDw1DcZSh)MC?1Azs*ChbArH=*{v5C5P=0W>`F z%(#Bj^0fV5xTM(r!6hZ}z$G=P^=aJ&eCIU#x6sTSTs}e!;RTaIvHqac_{dlRisE;X zcE*ky5yJ8%FNYn=7Ob8XpDPui&4ESl<~@MB91eSahw}^unzB{^2L2D-v~Ld2Gu-x_ zdX0|4skrK1bPPErADr_n>NoVCA??b4GPrIZoH#g4>ajTcf2@6VTwG1EHUtYEf_n(= z?iPXvcXtc!ZV9df2?;L2T?Ti8yE}usyXyzMyUDxX-QBx)cmLtn^bDMH>Qp}^{dCpY z9Vq~Z?k16TB9?t1!jmmNcW;!yK6kKvX8f8PTJQlqWZuw6Cb_@J z{l02_JKo#m<(k1+cqmfgf7-6{$sg=pc;2>xH`OA&{ZlE1j5ja+<*@iFzWxQKs44yo zQ<>#I{syKf-yOu)u5&xN|attJUSueO8PsLm0b)~ zj>et6DqSTlFC-GYJOa6V53#5DEIeZl7z5}B<}#fw!spE8ISKsLtVJpTI!_fU=#yx@ z4TjFWi3sBnjt0u69r_=X=i=8>Oa)zaZkIhi&8S_WHTN3Ms@MPJ=AHjg zN>7bs8?)UoWK?y-nVIk`V*Kw2NCB0-7W|zUP|=n2yB;Sqqif_E13n&(~k z3HbjPC@2y3Ec`)0V}e2b)d=eE6q51#{6`@f`~P~701>mHi}dE#r6#;>0B+-^R_z+**M-tP=4gp1d#lI3jJB)5;<(eU?XeSyE((C5{$LOZhvWT>h9sAsbMfW{G~YHtF@56}-3%l(?dgwATj)+3 zxEPzyohR}UwYmgVffq=AtiA|?@_PAnQqZi&Yy$YUGKT{%L7s2)ZT#6U#Po6~fI-Gp zRa91lXM-+TbY}z!m=~Xia?{%0veEA&=nI=N#p6}smDS?0#^XDGXIBd+>*W2Jztwl| zMbjfo?Ow%6;U=>LU15If4pn92)2T6*MVg$&5Rss9I;?zmJO0tmo!O%ahC`m8?3k>x z-$WI-+^tkHQQg~UE~1CWaJ#D@mfvLVRdi671&>UrcJB1E{+ulRQX%JVrE~dga^BET z&3jL(Bk*yU5mTIcZsh4Grl0~+0kIB>o`}#`f0+MTupwNkLsyuLd#k>|uHcjGxodQF zn>O1RM0d`Fq-g2fL=Q!m(Z4rvA(}9~|GrYpt1VmhWjliP@II}vXfpA^QI$&b$C=ktb!`9qQnLCC&%{wog`Pd^^xYcNreRA>UjG-Nk2|bz{Ob4L)pHeg5 ztXU5q?;K}7fG_IK4tQn!Gohay-&(-phF#ojv41@Qz%Byw_(W_A2rgw;Su3>I(;iV7 z(DN3J=q@L|UlwUIwq(!aLRVa9PC2dfIYB&>{p>i5+X`zRDzyZemcv!&(dvaM6AWR$ z-`T}&XfVJr(+{{=E)_%12dzmBYLIcm{c+8zx7NJu#$#vL;ly_q?+d=b&$D=VcD0Ab zXyVd!jo5o(5x+iMLhqt(A&gOO7x%v#=LI&YI}%RBrG}c==ikB=gGxm)fe;6;0O#{` z6F#Elnh!={t}733Rv`zLu!>MXhxl|Tx8B+d-&`KJS1Y!EN^CAp*E?m%))kkHKP+oS zX+=Dx4WKBn&yi1l@9u0nfhtoExBBS<8h-8v>8pMQ!~Rwda*F~7v>8ILPDQRZZ-sxE z5jUqv@}1HeR@sC%pQJFn;r=8Be$C&~3<+_SeLi#PiV|4rV`ZB4tl~~^RCmiIc zXh+D0aoX481Uvz}w~mPRu|J^*uxXZfXMd8eXI*+iF<(OPOWgJ`R&|+9rUf)H*$iPl-bw`~&2Ebz39 zKxfO1uF<=8Gsj9ckRD|k;i&sYEV1e`w=*q62&Z78avn!j>1)2mssSZO+5sg?>r`cR zyh`6V!aZ7|UveI7?+k`Y8C-R(kdQ(C!RW{3b(9*lT5@#~F5$G& zOX8`*mexWdIANgZ5F0&R;)Ea}rEu$FtBn1E3h&nQU9aLvM1}|S6|jg#lO`vh0md|= z&l?U6pNvR)?W%X=iRmqz`$XBCJH2f7kB@8@?5j5jyA6?BaNIxa)g^|woVYGHaW@hc zlSdi3dgyK(R#G|ZOohC5x?=B`!1vEnJ-kXG-w!ldxqAQty&tYmErIBPGd9x8E)=|m zmOR%E`WfL6V}VeC%Pu~oZbSak1${)?QEOf;wy<_6!}AC;wAZNH}2gSiyLh0a&xNGR-?lPI?6!8Ld7U8n6@+yfT{_f8N7$1_Q& z3F^ewPCvUeKbi%4Ql_4u7WWP&j!hMxF+$e^qpL`)0jP<{E*-uBr;Nzo*(dut6N78< zd30Kw+>->z#k^&$I_tr$k;k1R4vp)!(imqz{+ z0MQv%UR>nibS{n2oT6rl`U};18KKy7;fJEgP{yGI+sPLOs^>3{Z{BT;Gn?TGH&BL} zeNlDRBvcv;z@~DWJV2ij!_nxs%}fg^8^=?Tus9EB68c`AM^=-j9Pbquty~*O%3~pXfS;Wo|R>3TWL^ad%J!Zu4E|YY7N_ z9b2Re68heF&Dg#IHDG-@54e>HYupF&23Lo;`*WmmHTV`aUtWe9^qwHNi8CVu>GCWF zW&OHr(jLV(#v9hWRG+)4AGNc>CS9S#F+-7cu@#GCVFZVM{4ii{&lZ4`I=61|1L<)c|u}(40?x0rB zg$JrvQUv7##DGTP;g*L;d&6{%W!Eku;x|zq9nB9ixo{0X-~h#@?|D6BwwTZ4R4x&Q zxv~J|IzP^iE7^qd)7TIT4CYH1&$DCp!6tI*WdT^U+>B}d7#M*l=>vT?%mRrkhN zexVZYqSCmXxnmW&wuv57SiBLaSJU$Q6n4mm{Nn`gZ29YOQ`@GirsL$=1v4kD+ldl& zQQM?XZPwBO3ty>Z{EV*|{b$VTVK zCzyN`jB2~SNL}Mk559wTCtjnOJu6#fBhgx|#`q9rv8ocmC$@)&eSyF#u}wfSpKhFL z_0=~X0? zATwLGkp&wd1T7)!2G3yBqwRsCXKFR`ZF`4%bnH6%i_xB`0tU8=S&5jO`jhSga>r1q zQ!)1~{-v_2Q|)UuhZni+=OfNcH^=*#ohjfuL$Xdqfu#@qHxsDG&bh61qsR@V>B^2q zfnJ}!UUa#dBy~1M^SYB3*6Z+Pl_z;u%1WGW;x1ib^yynF&5GWh3T#-hKb$4n^YEDG zulE*4L*)B79vf_OilXMHg|H515Z6fim@rA1+8XJEH}rj3KaZ&{LXs;D)ETN$RUtF$ zR8^u?bEd`XKjGsY*>}Lv=DX6mgE~RD&B8cLNE)MMo13(TUpFDo)v%Z;zqRnoz~~*U zi}Sqb9u(~6#;3e;Eq7eq%uz~+Nm=1jHvveue+um9bjFfh$IJ2uGLN4KXM%B$tCuMB zUQOi!M>eLXa#^tmo#i%k1l2rUfo1TkH7`!0nry@3;e5iOXp5|ex1xSfrpsTdX+;x? z%c%4qxv}_ol6dK?TW^cIKl&T_$8Q}pXk?GeOTD;7`C)iP;$Rlil%=4uxqW)v&<4o5 zFS4f$Ff+cm+w4>gG7;_}?*#+O5!=$$WMs)X(IE&hxDN(o^~pzDrd+>1KAq)^=f?4Y zYJLB%1_t*@+Gs%)<$45HN`;bUXk%T4Hd4We{ltN4VFE-xm(Sq+gOc1};q^n_&pfF| z=^s*4Uu!SA-9vg0jM5D>{fMddg|ha!{(Kt% zCR#_G$f^i-PV?wjeuyQa>fd~KsSdN39`f1(d$=_K9at`+mEkq_|9| zHzyr36(V6Q?~VK?WdTr5x?fFLbyV z2M}A?>2tz+S=gE|BCaFps1~hU6B3sh%Y`Qyp21ke?M<-rrX*Aj@;b*CRkBQ5(KOA8 z%;!6-!C2B(fC`xRDtEIhhnbn`Opm;_g;@za`NKh$GF2Kg$1|2aTAHV`XKtz3(AU84 z(^e0?ywMXOi2PUV2IO5GZ}~SiwjD$U)XCAB3C_fze7AQ#@fL(BF}zyX(3NIsH~?|WK@-Tot4z%EGvavNJ{rzuT#Q1`4`nQx3S=)s*DrUId- zjo*h0+GvIF@yn~s`%JQ(KMGzD(_o{;D@^%TWKb3M+QS|7-Q2IE>4RFeXE5L|PQg(S zi`%h2bz{M?P7Yics-=RfI`1F!`1 z)1wITVmqRvP(=9jaVpq0H%JIK7~sR*)FD5TM9ms0IVqoxd6%%3OCw|CO4X~NmfUl! z7@b|p^ZnnO+O}72c(@s`4|QKJ;2bGED?Gb<+VTUtiXgC0{&fb?^J(WKB#pz%jFfJP zOh{Ua#pgrL8=RU4T9)nW*Hkwp0$*GJ{D<8q*JR!WC9MRa1(E6R14dFlSfKEBd9aIa zkDje|9Kh%(ENJQ88{SWl%o^ylvI6L+jZ4<&l$OYgfu~Ui7b^_rMfYac&6>-D;yWJZ zQpki1Tyse1pS={@;JQParrp%Ip~2)7QR_4aHNwdHP>y^ z5}nu9WJeW?SP`8=fLJ2_BF}tRa&ww1&X@yCTWjgSvMk>7e$Eto9-W5!a$BSN9jAarB(H1_IV`nu|!j(welgtGmaM=u=-H_p&zJF6+QQm$KxmIP$8vGhbjW ztsA&&7~j64a2d$HzQ+jhNX6kf7P+M9?~msfZZ5SGksL%msxF!#rfB&^^J4 zhm(`9^q-R1f1mK;HPUCBbTfOz{$FTUvgR=kI(gnvpbDF({MF3QvdTgkH7J$B1I{yY zw>BIi4dlc{EH7MwF&2I>*14CL9sEN{f+j6zW7W4NW_8`c^3UqdvSXl*XRGX zk>3=bAjPB>zymWThp`0?alJ48Ta!TmR9S#)IBXeg7L0NZ=Y5C?pkc{hi7*kU;}|RL zrW}^b8-O<~s2O4Tv1T7jaR0Qf=|jbr+rDiAxk;0GlUahfxxG@JqcKY^4L%)18P^F@ z&F7AM_%spK-}47N z;ZNIf+>j7YB_;fCVzsK$gG(~iQM_R>{;1}|{QXBR!WS{lY?+a`%~R2N5e^PhjvtOx znjT62az*fICkML5efJ(`+Xw_^yhsD{GM>K4DP5DY*>&t_HVu6xd;dN_1Vf2|LYQSr zf^dH=S5k?LC4vU%JF(m0qyf9XmNOuDZtLiTrQmGcPWi&$(KF$~vYubP0pv`2KGuFV z?GY(7c%}Hqv8v{K|El9x^G%EaU(D|-w=pyxBvE@}9D9eo54BeD|F@mIald1e=d<~a z_%$QHR{31%G!a%%+9B`=uWY9>{-s79x&VplP`LAPwQ>=qz!##gB1z0TGw!1`C!-!w zSxC}jNJCt!beiP%i2s98@^1{=XXa~cv^>9=0N;gRJ9U)+X-=--%q?hpX=H#U7N6Im zu;q6M^>jTI>X>>7&9#S*F51$pEmcHLU!~j>t+HLtgz(Wh-fVwH@1W3 zx6RI8PZ!xYWy8za^i|znt5BQ=a8b;2eCPJQ@4$jyw_qE`$n$QekEP#>X1rh4Y9rqq z^nJXUOxN{@=Y6Y_g;LyKrh)(;75wE-Fa#Ruyr;qmkw04)|L6qi+WcQ!>$j6uPcMf8 z)&Y_3_sg+U6TpH_+jLyBHr!ytXtS!Qd`sm6$H#Ubm9o=gN_9yV@@CxK{s%KjlqhHF zSo8RcAGQ>l_0qS$C|s%_Zp`8vf^n_cx2=%etEw8&fgYbp*`n8?O=8v9T5p@-;=+-K z%7DP}82jFyao-;InWZ>Ygu<=7Ai7)AT}eH28OGA2qMIn$op3wl4gcD){) zB?o#((n}Y^`Q-Bh1+*VEI00Wmq>jl&$Ny@{(W@d}9q$B`xnpQ3#-TXsCWn?C{3~rnE)1W|IpMbnWa8ht^jCAP?u1!ppD!?0DMY*plP6sBhdmD$ zCYrz!P~EtE$IOzBT`YuD#QMXzN6RJU-|3Fp|JQ>E@CH;~82jq~KX zDxKu5EA{8ctFRWEX^+?E{of|8z3-nn64~& zKfT~iK-X(*#&AzSXBz}oPUEckQmR($hv!Jonc6onFt98Ojw#LXG_Lv>VK zz~~jTKZ=xox7Q+h+NDXo3FLgXs~~!x7sHdCTloNYC7Tnm?Vo+DTOrZMD6V-@H6Af` zZ!#mxHxZt0{jb=Xe|56*50iv{JZ#PQCrzDxYQn?dQ83rGYaxm{Oe+=Y$3hvL67FtS zqs%Ah69DjgIj|KK8yr{pwaU*o3hd(^Jm$hbWlV584YXf)4s5B-zG+3%SXG^-K|bNc zPzBLcxdx0Fljd=&bXj-?Gm=&EH-oJOJU(?a z9MkhyM!{Cji8Qb-n;m4ITGoB?Z{QNp zDF_pZ%I;viB^&fFbldHNAMmC(tDaqOor}4?JsfiyMoUlrV{-!qLRK$5Ewhucj+=(P zd`}faXHSKN$K{)q-`M1@uS3y%Bn$h@p$LvY5FlO0N-D>^C`G1hm zpKg?Yx%Ww$IQdfNCcLTkF01y7PBmllg9nbbpZ%J^2EN(+(* zPoE%u*f1}|%bk!-ynXc7pHbd{R4pV_FpNM9>ddtjJnK+~)-f`f_KX>~A)4yRJ6tHy zI@C2e?$b&&)R>!AtjKyb%c(3@gQh3k8A^wd{~EOm`2agBi|NSDDER!9 z3=demK&8RGfe#Vd7IR81Z>JwGc^!8?SIVW@oX4^eW{r!_!;6N}Nj~9C4|zmEiV<(V ziX;_ScM&INh#|l@#Wj5obe1?=LmH+_^ z`C`)E6eS&)@V=IxY}z|{-~eK3lmh^alYA3p^%!O(KWST+k1N-m%a7wv$i?leo_`;}8y`Agwc4{0AmFfa^9QL{D;=+Q z7G{-8W_=_x$5t+%dfUa+xKZ7{?6?nIflleR2rhRWYlTk&&vJ>E@#@ZRYpEPwcjyxr zMd~SY*3egVi7?9?AWiT`>-CJ?r3ZLAMkN* z*}snYqB!VT+9K;3AoW?=>{;faV}_=lqx z?R_SlNIpce`>gd$)JImr8?XxS7~>IN@3mUJ0--5aks7f2EpU((WzF~-TEgY)!Kxxg zrZ>va%Z4L6=iu@boCo{Zo#6ntk6f!m#|MdUaiB4Pd3fxR7Hf zUKtxY;pUGTm%MJ^7~pNKb@wm-LMv0HFvoleWxm%M6Zg8J274=9SGDpMPa6Kr!|}By z`sCi)z(~XQbH$rTOEbsO=+{0bD!t|#92oF&7*-g}idw+el0vh58Dz_qea<}REbO{5 z-q9IvCm^x!?Vn0*`767MvDor;Y>HLYHCn zmMgzGTFMmjIs4!duGu^lIqjB10OUJW!BG7R1V1BIvHdBF&^J{Cx=BA-RQ!qHtq&5_A!cSy9TE17C(?fc zd48Y6tIl=1Eht_s1he{H-@YOeDoIUH{b3$%QMo&TuqtuhF+9LEE-1mo(W>iMt=t8c z$g^H?*QY;`%zcSs-Kbxs=;J4UXM8n_<%XT@SORHKqVrrXeTf#UunNz-a_{#I6UG0V%I-NV>-_QRDv*o zNZucps*o;OJws|>iwI@#*pBJ+OlDn1n=UqSqJ}D|_dA`mD)rjn~;t z&{wJESI$sgB6A#WVXqmip=yWI16QBA1mCWhp_1K`AW~O^y zFiz|Jq8wohWuv!0DMe@E!M7E4>2%AjPj2bxl%8FwBj7$QT)Mmurp`!E4{A})jh%9l z`QxmpYZ)63jh*k@%%E8etl#4q+OKtnsN>r53KqKaVse?5DMlk*K9zHWTs(%RmH8FN zXyvQPgI=~Y#Nf$uuA-1hQvq^ABmyc7vZ-K*V3mX4eap})b0@+oX;6Z;1ebm)GRXjJ!FH*;urNxgSM(ovaWGGh+ix@0f^%bGzZVN#E99 ze)VQB`zl4{DN6H`>r_C?pCxZ81aAmaJPnhB zWxp-hDBF5*xM*~z4NNrk`|*ioFyZX>S9x$eLwPs+E5<Vmv z2(juBplkaNw|bUIeUlHr`<~;(-`H_)oT^lc<8HcEA!WXc%#z`L?dvi=lP_79mbMpC z%Ta6+@lm-!yFmQ_XS!F}QFzVk6LWFWNeFk!OkMCVxPB-?9tS1cdbBu6aFQ=_OHZ&hT{qofYPh zY*Vb7MfH{aMa}5bCBy@_do`=vFmXK`IMhza=s*J-{emOc>AV#XE2O7GSCZf^P6;TH zSqI`cv6a$xAo$Ef*;J#6w2yOgsc|}MrH51ai-B<>%|^Yt>mHEP1oMF_eI8uLT7bn} z*>($@a}~d!t~0)|NM&YMV{Og^*QszPitk3*QAj!I&R6?y+FiHTz_FUP;a$XgiDJf{8P_@J(U%5r%96-aeIVh!y!^5&2U&7$5 ziiw3g`}=9!rqBqQXM_a6o;MvtV)Ly9O>t&__Iqmy@PBx693i|ft+=dyB^QgPX~_|x z^;{Yt=syobL^yPq(SOqa5r(E7q_6`kXbLF;hn_QoyVdTtT8GO*3Z6|;H|)EHe|+Lk zKiz#}*hDCwj#QB=3hu9%YR&S4a!%fF5Azgy&DlXJhDCJiE0XLvoM`f}{cU4FA)8s? z)ICMTRqPJ1Wy3V{*yf>ouyz;OwhE?tLBdU3WlDWXqxo)M0kyZSm=6ywS3)UI(4)ZL z$QK|tBN&c8TZcl=A1umBqmhH2vV!l0yW9)%Ok9HiK*gD7#M!(!HIixppDy`1srh4- znMI(0mPVANqk>0eH3}NmT0j7Ed#FYYW6_-E2dAf~(0+O2srW}Ruj(I6K_A7mtL>T4 zG6Y|^4;ED}g`bWFlepR+Dq=%fipy@WCby^{P80t;H*Y;Z zTLTi?!wL4jE%)8WtOAzI#7U#ONNs&HRFQi&EXtmvTa4i^z?jBnlBW zdiqVj{{}ezR^$){CdA0utQM_;8;PHJRg@Z(7M(Fm=apG5CsekuL_CRV1q>s^{EI0n zWZ3Q|5n$7;aZe-m;ss~vNf63;)@2g^!CD>#Y{H&EquTnM;^nTLE0xHLg*%01+ZPdd z`X-JPx`Wn+1D}XvU!qEX$_)7u>6QJ?_j5NF<|)PTMw1XaG10=NEhYpr(Hpyqhu~6@ zAW%d2Ctqr^y|Gk(h8ZS|RUMkbO6Or5J%GYaQa;T_aNBCO{nqA-n$Q-<)^Pa(f)@;*0;Y%u5*dVA_ch#G zf7;4?+LG22RRic$q2pBX_3eX?%;9Se$XCsfnyR{FFnQ+f@(nE=o!UfgpNSwq>|vukV`f5kZv{2W4y zDt!`qt%+<*)E?sx@BUyC(@}s>1%YvDpuqgWS{YCpdQ9+52d|OOH`=PAPyw&(AC`xr=~>_)K^-6Oe(MO*L-;+#c#8hZb^D9^H8B2(_@)+bg1o8QlIN4g zV4l>ShZVmn0X&^?e)S0)OEppPkJFT}(8m|%mAktV#(wiVf@ro(G@0^P+gi?=Hx8NWWV6mdmm$VV52iS&d%r3sbpR5g{ zHooQ_>vI-t_ZgQ+PDwXvY#~)~+T#me`DPzBIyM+fgj|EHK7SL>t(1OdI%doiTBFHs z!n1M9$vtn`l-Q2y-hs;IvZQtul4Ad?-DIkkj%$i70(sha5%aRtRA@~`MY3-0~1^2eM5rPb`I z)OEF%Yc=dgVyAbR&%)d9o9%nom=Nh_=mlm2OvtiJ{?~-}Plhd(Qn`uFJTvN=sV%e< zIY(_d02csMGWK{FHP0de`$vvRA)ciVb%O0@S-r8$?#)N6>Ck1doDSD-iUiMx=@dW) zezS$13~TewvyLMPgd$dC>6^W-1|0_HDJnPF_%Zn|`o%8IxNLae4=#DL@6mhoK7Jb4 zR`M!rVMrPEIAYE3;T~Lbe%)mJmGg6bgzBL->VMP< zM2z7l!XK?b4A!d$JP$5$|MThy#dh}^&x961CGxVqzg{_gj!E_DrENMcdH+S@!zm%v zp){JE6l@BsZPu(WYl`aYA(<*1j;3JQ>@#~#U90;Tv&Klwc4S`>>>`jw81AI_Iy89@?M#0 zde4b~STeuelaf^3jK5#UH}?y(507sXReD#={D@} zZ$2;fE(wB=+-dC*w{fRa4*ZlptvKqC5CaMuNf9fJ>J_e65w&%e)Tggp@Q4BjNl^~k z8@$Hx$uLB3PG4wxN(*|=->UrcRkw8cl1RsyFJ4vcm_b}#*WceA}ZG9TdD4L=5*$*CkeEkj4RnBAOK zBiobTvepu-EOe5_M(kbClO0+XUeVtEA6kYy!H2?$&XW{bA@Q)Ye%DnmoixP?NITS9 zW~~R-8hxCkBGC;d3`T>kJxy}aBm-Ez74Z29p`^sonS!=3BYJ)~CnO~%0=BqYC~=nf zZv%%-eU{=Nencv!^GBOdUUi-_v-EvnJA8h$qc6zA15P)iK~RyE@>2I&t-Qu=_+{QemP7S3!GwjBxL_Fwx zT}oOb-bE#^UHP{yHDew;Nc;zH1ZH-Rz?pPc{KG%)Q4w5hZT{mt(=@oPu1p*;A zA#u_k7W`-k{7bqYC~agxiz9h5)@zOkRN&#@Dg)ht%<0S`OXQ3lFHtlV@33Zei|uTZ zI4=nsGUL16>yC4-Leww@U_)hL?biL&d^_jG1OGJj z!7Xo-?0n{6%E{s3Q_(p7|6(N~H*+k&7XqvxGW*D7M)oT~J4a<6Ox>D7dgpTAE&3Q$RoDZZla{KH_LDXZM?wjti^ z0(VCD_-OWQ%uYpfy)Zj<`J4}QkPgiYujv0h=JD zf~5?j^Bmyq=3Z$b@CU4^;=Gv5t116W99}Dx`#!pF)U2Z~IXXEzv11Q*_1|qW z{%pTtS>5UL{$D#e{f{BX{QIuQ0457_l7g`n8l3=JiBenNpIiie?W=A4 zi6d$U>Oe}_+~`2BQZ10ywHc|n9!Q%E+;F?E;?F#=PK|vui+tNXqtde_b^D;FP-Yg^ zJAA)u+*_Eiuk-vW6xKt--0SJ|!9RL}o0dO^t&HDnRKS|bek!};`EI}7^!K&! z-}Uu?61j=E&n}0JFQOSwXM@uCt= zLls3N@`dcg+J~Kt4aB~2Hc#oRxuA7UJWGyvL~W9FJF6bIo~s?RhjP7|Ao}w#_WDJ1 zjro{`E86UP`fsg6FL!*4Zs&t>y=nrBWRP!499neJ`9EBxJmPoF&D|Q9Xj#@8{&R3x zB}0Jwj~u+npFiKdr>}C_8E9m&*WBQ9z778`baCX=IorF!eR^>pK55p0{SIopXrDTA z@i$x$trt$pL3++jphw@oG?i@(Qj~%6jNvPi!8gY2Da4Cp*h{?nY@g(w^!aK|3*qH@ z1eo+hRAe#p1LEJd*?Nu;?;j(?&#z-t(^~M;soI(QYzK4nHT6Tx!~P~h>{I34xB$1p z3dfeQ9q9473bmF#$Q%6f6bEOa~{Wuw`nz`;n|cbfR0~yaxU-r5(HrQ#cVW zE!5hv{mz%%b@$YYB!a{=ZVFePuVWI+6Rf0f>|^Veniw@7B|QaoB7AX2{ra+E!UFD} zAjw}`zB|^3zZkX&xz#^;&VL}vHH6orIHln;=b~fZ|ESQVHe3s){KWSk62qT+(d+R1x{ji2?KF5 zJ}A4d+&L%Kx;6wof0E}Bt!1KJR%edpU~KX10Jcdp*aoX~7u{hO+BVsy)}B}uabX5@ zlTuhRe@Qp7AGJBHLRq`4xn9Mm*lj&|g3wcV4o~T((m{e+KHlBO(8c>HbRk@M{YU5` zJrTd~*U)95^r^KbnCrJOtUnQ?|9-o;>Dagp-kSy6|4z(^^xQ5^T#n58^!F*`6%K5@p6N?u#2TH@AypwhSSm2o?;fOp^AER&6eAR|b#KjcJV}dnKui zOEa^zMJS@vBaobDC*EjKkO_JgAk`jMqfYJ?)m1*i`6H0%q;uPyrPv~^8{FKsLpBz$ zHu?WKeE)Z~jQaSw>a9?|!dTO9{r@YRK=ZXc>Hmn8ge1`-ay&+P!g32{$(gW+rV4@8 zqi2UNK>27ted7}160p0RQNKolCD!*V_{jY$Sfc0tloR2oeaeZDPUJkIG@!cu1@ix6 z?W^OWT+{cFPATaYB_s!=VNei|21)6Vk`n1gx>4ztknZk~6k!l)28L$np*wys?w;ds z_w0Vp?w)`6JiLFrGoO2&=YFoct}Fa?H_=UGj`cX@2ISd&24^g|4VzW<>+PIT)@pJ= zBQ7yxnmIpMjKqNR5gg;>pYJN0&g z&8&7iy*ldmJX`1C!Ffd4RDNG+Y@Mkm+qvLOamNpg>j*=ZW!U0PaDH{O!&?S;yaWD8 z8}VQIko4rAy5vtX!I!^9-?@JW$A^R$ev|d7#Mw7KMCJ+0#Ena~duY?J9)Fv_X!)75 z8-WO+334QY$$DLx<)5zvBPi(Q=BIG?{7+fyH%-~9pslDHlK8wg0YtB-D+{vHjNhT% z;t;-sc|;r-kFw(5afp2mNfWS#jSx0T#_pT~3?8I|lIFrQA7j9Tw=m0X{>tW@c)I1+2^Z5&y0vb5a*Pkdn9CO(#1 z7x8|24=2-qx&bd@Px;`(R7N>UQ~wH?a6b7Wv${NHGxHK?{a5CmCUM}2lkbA;kA6Ys z=F+sGnLBG72Uw7jtzn7!Y75qk$8veo$WLREc@JgJ>Wc-Z@xPS2;on~ofFVKMW)p?x zj_(ovh(y|K#(g1R=7dvH8`D=mFqG0o_9$iXE{~1osItCcsP?V(jlgpM9<*tO%FLgl}krbNdvb_ptBdi#L ziria!5AVmvJAoC!tY~#TNYsEHZoL!Nf!$C>r*FCU?Jj);ej;$4cT;j6@2zD}m16Bm=Io764x&!5x@_<)@5?Fsyz`TwKO zt&vAR)o~v&vkOEVJdq4hR5vM@Rh|!1``XZkTA!FW*>S3spy>5Z2!-%1W;v8JNH zUhg?3&8BS5;1)#QGirQfTg+2}#!l4Ppfgsl?z{{Dk)3=_t%>XPo+4XEILUf@jQu#l z_#M&MCW+=A@Vei&{^(X#u_1vfwQo4u#qI1Z%j~0pxNqr;~GL@h8>*_m6+6EPUx&Ywa)R8 zlFB<4|AMw=;EM|*QBhd|g&3djcYLA`A1v+vH{sz=7;Q}?286jhHnR&sB&m}KLCNCk z8qc%q$a|$@5Gb3HwV)Zh05D6!M1h*s89`FAcot84LX+r;&gF~cw;HP5MRn0ORfKTl zqqsY_rWpy<6Dp?ac!1CAKVXwZ-R-6L+*HR6hHTXxyooXso+om4d3F7T@z944a$I5Q zEi>LK1|VBEuD5@5thjKs_D$`ouu7Z#nx(-2Xfu0TW~pDP-T8w=l+nH}6poB3k{*)& zmPfAD6;zjp>!ErCZ#&z|bDOJ6)1wv<6InGnD4UazcoNWz=l5`kS(rPH zjhiQ+(c{t?yW;oviKi|O7sFl>+VlJ$h-9tde@X(K043B4Vn1+>m5!d!-T8GjU~>qvVw*)PLk>J0z5I zHMpVumr!^Nv;M3x@{-t*q5htsYWH)x?g?w;8vUt8R$BMBeU279BroR9}NC`|v6kio=6ze0ke71%-OF-`ug#d)Q1Wt2LT z*#X|MJDTL!{-grU$e2)Cgyi`870p}E!LB}=%c^gC!8pM3E^-?6+?0fgqJ}F7m&5i7 z*m9^r3i$ESQJDb6Pn#*CoKx#1UTf!I_1;-rXBh<*PvECxkhCd>Ej2fW8SR4y`_?|q z@zRfuf5FOsGBL87@}l0>y~^1x1kz93po&QA&T6 zLP8&+xs_IH;0&Zfr2qO1Hko?6S%WI{k9v0YknOmRhb{ z%eXrnUU%~*L=BviaBEJ&tB*x1Sn!(TH-^36BsbuM8G(ifs10(y3>Ui&kNmgCW=p3W zR#1tN_2(PR%s3v{Wwpk08D|;#II#+xPy5Y^$Ei`nC}D zp{`C=+r48ZyKi~nE&-U%;WFJQ#0iU-gewgAQJVSAOq%+0fu6FaEZwrEH5=;XJv^2B zal`JroA!}*Y3pS1y^T|7#@qahYgv*lG|h?Fq`0j^eBmuk8rEq}I_x|CIC{?mq=e@Z z6Svhw7e{VGoWn9mV{8!L?#_|p)`f;eWXTn;Lc0f~*;}A3zWHBWpnrb3mk6&G-%&ER z67T$tIqA2Mhfik!v{i+5TMxjRdQI`P5ue02?0((}y;liKDF=#msH8IdIP9N6k}(Dn zV;CM(9wG>F_>Dl!YHR+)EE$ZxjwgyX-SIzF?rSI9{aR&QI#aJn?wl;=bG5aa|9g=)gQ9bf7iXxvaTF)DwF!)wrs%sd6!jNERO?;S;Y8n)J`LHEH+s?7Wtt(a{d!2&u z`bQMh$3DDvq@VPDx|>Mb@9BJ(yz}xLQP~>{=>hGSpf!7-u9x5UNX&ZhKUl~R~N4SIS zkOk!Vy;GyC({SOVBzXUl#7`KgSS3zNuN-o%1vcUjXOjD#hAQ1*j)$4XRCB3{1K; zYmY~ZG{V0@wmTfC06BJ4Nx|BkPTSGU&MtF;(F&e1ZuIqrz$?jF{=+W6$!(il6CWPl ziCtIggsq)WzHYXSQ+MyadhY-uuE(A0bE-#*M%M?+>Q|)>QYF` zhV2EfbPYl=N&u#|DeH6^>r|K}iU4C9kWH5x2;^_y1)-t_nj|0ms2miC2vZuY6PqsH zBD1U2P6JvUoHJ8=eYnw%`_?Ze46SfrSV5L#(4{?Y*27PusLYh{I)8TPNIxUt#t{qG z#rE*+o*XSZ0X357Np6+QmKp-FVvtm^T}6<|)~3Y(kt%Y8cG^);%t$&Nwks{Piio6x!FZ z-l8U-w&|8hR>GFtk=JM>NpY3X_`MQ@v;k%ou?^6&rBr|DohQqxVATSOb1sZSjng!= zUYeND_2}C0IMe7w6PIVTQCPl|Zc1svRoj;IM zUcf%id-JVG=9Gtg8c>)JU)PDEpuGPwbq~NYZg|Jl-X#(0Cb%Q9}ftr(*DGeX0~&;Sa$hFzfx9d*4N`S0YEM(B68 z;T=uQuDU4}!#)Ogk>6BP`+KC;KmM0~B61LK&#@;97-kytKUgA19Pt)z~L5NZ?_z5`eVh*A`OD8#DoIk=Ch?u-Q}>B*MJ% z5uK~EqpM7au<;+1v@h>8aF8!l8k)z`SV?cY2>`E26jD0;D1HqRb+kR zBSfMWSV12$gHX8oS^LCYL!R)V@pgyu)ro^}Q#$Ms`M*t~Cu{dy6>|*`o3a=#gJU#G?IG zU!iw^2j@uV#e%9{dgt(3Sn&8aj5|$9+r+fXH$H_@vq`&?^p00M>>gx1^k`c zu;S%YJj~3UHFed^&Zqw@W8c(@XODxFL-vs8p0h zZL4vOSHS;H1MuH1Yf3{?{KE3f8xMGg$DJ2Ar*C5=gy=SI)!%eH3q=HZ4N1`vX;0Rd zWR-~4TdAeqEk~fC`me`y zC4_KLy*(c9A2ZopH_Ya5cOkv#w|f?t8d1TicVp%VE{a@DqjzMOLK^;dM%<%}OHNH< zA;qcEf+Yw251J%vaKRI5?sD@R^~uvM(iR%Fdi0o<&GjuTUWU3>ixWr3l~GdIaNg2r zjJw6o%Z$zt(bqPf8({2=rqXnNnost{9${C1Mn3AF9~L_I>BGSRv4}ne`Y%Ub2>G^a zT==W-mojD9jAxm#2Jhg6eG0h*qEFfI>_8sUP^az0wFS#0ROEd=gyIhV$I$-&sCa#Y zTr&iYMb@3|!stvV=z5aW($*iUPn7kx&;OFQh=eV^gcz*E@A>vl6HPC%)mO5$J zu9HY`oDPv5XNNwX%19d$7d`}qyUMgjqw#Ib#6)CIje66?mxK8Aol0T%P7X_z2r1wOo?&t`m0>Gv?-Mja3N3lnzw_A6rDwk3vI zWlS;A_b8(|?(1*04|y;@$D&GL-)i6qM6*Mf-@YLL7`y@LUJL#;e5I3iZ%e#qV5;uB zKFllp_d7t6FG=Gk3~aOdyH$$HI1P96_oyfd2_$fjQX86IYD#ipoh+j3gb=al3 zPkTZ7$vH9TNZ{As#H2^S|EPYD`Dg)Oh4qbCXmjxkecSSmcJ=(?TutKuGOotBQ^9hf zF2;MTvp;=va?79i zV#s7qOgzHbxN&q-kE$Jg1x!ilYsdG>s3&9B35hj>@}bA|9GFo^LP1%u0`9<_!|Le% zZ9sKnREZvq|4Z9QSg3wNm^Bsn^kRLP8`b)nXfH$Bf5Autvfa5?Om(7I5|wi*HTCn% z&aD;wYOKZ;_>h;!hBDjL|0%28!u6N7@s0ju8OBvagy8;Oe-V6sOPJ2-kr~nSuqox0 zH~=RD`^Qrr3q`hC<=Wi$7#4n^tCXU>xe$jPsnxlqET69rofqx*Y;UY;Z3gXzw&b3& zQGYOsAmrM#jty`OAVE@cNndf@-P_J;#hH2a&D-hPA2l#$ms^q{(m?Efqx>_+M$aTCeo63XTK(BTk2~3FE zq9CF2C?aYV^QQjuaP^D%6}(zPlE7;Q{-v#A>?t0)@9GKT_!JfI1VKROv#w`Y)${2W zIxO)LSszzll8UF)$G`aopzP8{zw;D2gp5ItXxNHj5uM zLyUs_)IN`Lk7yc41{AY3v2V)MiYFJA@2a{(tuG0=L?x4NEXGHFTn)7{X}qzRgstbo zr1=ss*IuPCmseEJ6KHI(s-Ll{z(wh<>k6yv7OW`S-blXEIHQmC?!xQu*|@P-(?F>0 zAE;?7+QE^uTMJ))?JwC&!aLX<2-psZ$nqzPYpUoo#jX0)YyB@RR$O7Hu!+A!gLZcN zHWh+=*Re2o^FCO|^0`LGc=x-Ycp z?$kiS(g=mDt@26x@Mt76go%gVihVsZXZ=0RD|AX+eUPaOgssem29{v_l4Ra)=JC3_X42LVHj=`)bPHY& zOC0n*8r+NToiNrjZlNDUt81%pZvw5W^;qsjekgx-fK?3c(YEN+%sdlb zX;@6T`QEZ|d=YlO5lw2(6h9x7Me!9+euOtvU~TCdM}+%R?}WZZ;$`o_#KnjHnBl^LH$dBi!O_>Pwf)fp;&=dbIc zOnv-0%TOQ>9n~&}#l=qOEy1#q{b@r!}>UZe;ynMzX zW7D{2o@zbgT9f?>U`2?*iB#QNHDR*-0U|ZYqHP~ zG}vC-p0=__T!&dMJz*`WyDV+?`mA}^Hq<(-QV#&DfVnl(?xFoizbfF7PlolfoXA^U z`?ir^aD?>Kr!~sHm&)i0@8~40=?Nq03aoV<-C>4=93hM@y>BVmpV&Qn z-9u|euzxMWWqZs|V#RdYs+XU6BnA%OJmv z$u@dcg00B|7fuqN=+Nr<2x0Bg$&<_U_}G<)vF_FcSA~3Zh?!CSeplJTYIy9O3ktQ5 z*&M(HbK4cCguh1UpEc!`Jy%B;oArpZd zRP^Hz&5pa&^&vb{FIpUh2T|FHn^r6xTjb?z_iSk1`F!zRpjq+ zM6)VnQ(rRAF*{MxOp(IaOeO=(zc;=bsTc>RSEM-!MBp8DuNPIydH-MwBg|LvPFgOQ z#lvw63fCG7SFHScz&KNZ{1NTdC`OVzNBe<@*oS?U3Nywd-X9DAoQ0zr!tZwz4dRwx z%$mhg@_WTQQLZ~LE;TDQDtv$2+=-=C6LqTIBLi_5Zi^tb>6-qCXoHWFy1Z0V@$^xI zdt;Ve)RwhTL%>4`>O;-vr{>PFAG2Q#HmRj1LS`$5XFXN=-O;6(eDeu)^xH`I)nk5S zGysyXS{{C56*HZ^cY2u5-fwyxVYXm(bbcbyooKX)o%LyPDn!@`T^2S4x!Hm|7tXX?lSy5D zOHVzIMFnHL^gu;Q-Wr$9a=%SF^I`-lzT;Y?jzU5rVd?F=3F}a#N345P*%?_Q_+~9@ zQp=i~SuY;Hp%2ss)Yj;{zj-a@?fdGj!G_PQ`7#ahqDUynyjObaV|S*errv%j&*Yna z|HHFp{gcs~c|b4s7hAi=Ci%;jUY4tt-UC=Hdhz1eCQd|(v zFNcX$wS6kM)&3gm9^-|=h4k4!#Hqu-NICk!5AE}>z&;VyZn7@D&s#tYItxh6b5*}iS4!)^R z3nq}!R@9D&*)b=sBOiFWIX4g=J>(6MtjD;#{_S;N~iK+hWSXvA9kpDW$1f z_8DoVC9tUT)}R1Ow0fwca%n%q5<^Ks@Xt(!i2%Uu(tri(%`OPz1F?Q z`H=2;SnTE1AuK~Mlta5?=EJ37&4}%)#)Vl@0;6{Np1!^jF-NQOiK=<&MB7}~Y?6)GK3 zxSqtWK1+Dz{!#EjGoYz+4RNB}u+btKZE|??t5dc8bLJ6TlW(GL38jRC<&}eezyB1wB8TdJK`{= zX+uU6Y@5GlsWakf8fQN=Ytc|@spWL=&s+=XEK7Dr#!Pe5tfxbq0c^20~D#;C$WE1uO5K2G+9=65_ zchC_w&Ys#Z8Vyvp@ajHGMs&0F*JF$E!E?VHGQv+Ut^ z;kdVxdeWLi1$5y%?8dA2EyXW#Y91FDSgj1WizQSAsU+2D#h;;0nfV?d3$VQ4N|?@AnhMv6!41 zPD!0QVu(->I0E?j2p{>7#vc(`N355ik|P1!YT`thSn4G_mY_(@poKV zmaRUQbYh51eG<-i+Dyugt=Fb~!LlH(MneIUw0l*4e2ACezUjN{&LjJAQKe*rml|P^ zV08EpiuUun*GFA>r0VI!_NB`Xo!g5ZK$CZ81eJN)2x?}Z$b!CW&6;PPOo|DKTF(nH zeY+r-@?6IFIDT%iQhl$W?zt-0;#zRHlfRr3ck^PV(g$1eu<(<`kE|QYp4Q5F4z>}Q zDMD8CSJAd6!Q@EuW>KAI$fGu&oMHQ;YU{q$%$o?sOz%r0&reTgoM4G+c{LBggB6YJ zF>8Ez6!ZSH1I;5W=`1t~&#ds;SpBKjDYFwVI5D-!Lf1^Cfm)3-SCtVXwu*-P%GTN|8gm*(F{g>dwyzpR7xv1W zRGGC^wIsM&$M0+Ri`JU2)S?Z(J6ZzHo97-%k4 zU8_dIzAhHdg6pmbNPZFlY;EQyy7FQYf!TuMd(V*T-6fuvMlB#}*bpW8Jku4Hx#+d< zsJF6orq(pq2L`IaZh2))i93&tIaJVBvO?`8oHzU~h$Jq)ewKfv!E1t~)6wtb-TArV z&WkY;G;E&>&Mt_nmp1g>{)3Qpnf{686~_@vqOg0?+g4cK*JLhnTPVAB#2f)$e8~yc z;62&z^1H+mkBDqlL-&bIT*08^dlkkoT-IF3Y ze6`{U2_%*0wU28vwB;8y`HFHjQZ*$jUumhkfEMwD_tG*~Uwx2d=Ls%mAalU}hF2p? zo!Z7_5Z~)>V)rSH8Qh?opFq9I7z!Y>CYgWCc24WUr>|OVt|=8J=`J)KBh*gstt&jW zU%$Ok)4BZaBZiKS6mA_)3_z#OwIE1-Xr%JJAToo9D(iKl;do$X!K#_)8c-ED z6JiqxUD3w-oO_XhfDs>h@aUd4;Z}PMfl|RIDXgki`dFu(+#l4Nm*|T}UHp!DLI;Lc zF|%LN0?am_%o-oCM^>JlgnYRQI!tK44zs1O_Laxf{Xyio7O3_3lS)c$zLe z{-^4wG3wNi7W?pxu(<3*ku^0mXVo{y)Z3+Ptyp$2%c{z#=`*S^qD>&E#IRaokgPkc z!wB~hKleav)dP21Wwy{D{EWZG&{-k|0;-qX6XZd|-miq-lkaIX@ltx`RYUysPSm_7 z+qaQAiT>2!WCA*ysO|XlI=e7U`^}wc580a6kuo$rk`jdijojx8BPnUUpRMgSzu$M1 z%0j#<;I@pC58_XUj%RC377DbJ7FTS`4cz%UmeNQ`Yk608DT$kB&ovhQw%7CZr*RiB z`yxo_%bDOm^^HjCGwxR$}xrq5}*V|1Zw zm7zwnC_z|gqvuLtPV?QCGjhmMZpY$roU0m#dg82FWYL6NZNvb1w-A6JYfBAd zNf*nx8f}#xrYjKC)0HrX$cAMm5!!(QLb|}&dd^#!e zNa>UkM*d~Pm*s2JXY(I&c?;87TwR9kpX~{`wsO(FjnFn0)RmUWF{Jo( z*iZ~dM0!rY!z1ME?PDs25s5IVi&+zCwLrmL@X9+EDb_-V#u}>79$?~yMf?d&}bUn=0yvhNZw=hJCX zy^m1DW!o4L>wj@)>R9RZcSXTW?uM1(+Eo@^T5tRFA~v_6J?H_VwRN`O$nva*kD}kW z1uK$&Zs3Q0(K8L`DaTG9zAmEe8fiYu1=-HiA7K(QdFaDWB?_P5cRp$tm-kCzvYRU$ zWYU(zF>}C_@aQ0<6wK9sJQn&M{iRH>DH=e=T+S4|7}@oGzCUqy1^>eo-vD)A;ocWw zgg_%L()-)AwiycHkCHT*6WG1zsqNLxwCE6NWijr^=s*f2JPESiAz<=9O^ele4Z{j# zeTc2Z*nN#8{M20+_=?#uJszbOjHnUl8KXlBL=kF!6da)WuRSDez%Rn}_N+(Sj-7U!HzVp3 zRMNG3#cg8DMG<9b6!V5=1XjumFpPObUO2CLe*HjJsm0h?G?8K-;0UEuZ+zf)eN1J8 zOS7L8!C#dUnwXQIhUA39;1%kE(+gdcTG&o5nVCdx)E$si z!QG${l1D@7ww(vrYl^CEr+y|<6Fmd7W2({~SU)XUKCvkU4>~0y+wd8;%xE>oPlApG znJT~r#+$rkxsfk7?J@BLdWeouqWvp2z&*r;oj_ky&qRTh9=YS;_WDQaBkFdB_6+G~jH zL%#!0S@c-!FZNfDRk?c8I0}v4Uk>OHJR*D6I{IRe7RD!b^MsEv-|T%_^axjP@<0Aj z459UVn%>G|Ha_nWZ1^51p^uzN>hD%+!|P z;el6FfIMWY0z6?NT-$F``$e=c*ww|XD)zLue$Z6ph6#J-juSO23Xj~!0$^AKu zPGL*|s!HE5lQjE+a>4!N(EqFFiwp@{92)i?hI;4si~OJiUxT@sQ<}}HNAUt2Y4*u0 zK8dvEe@~lLH6OHnR0ZWDD%`p7hS#eZ*lRU@85OWVK=wgE1uE$Mq&DRI@cmoyOhcuI z&Fzfn_Fpt3+6=E(qb7fnMgEOOf>M5q@SlAHM)pJVw&CKpC~~;ry{4c)|hDN z>~k7jWn7vtBFwSe+!~pvr%v^Fj8&Si+aaUl-i6rG=&UgnU9=?-=XX5JxiK((G)ZCq zGGV{D@siNb`?i7@5+w&9E19_9zE*-bn|S)fSMD+YRr*`8*EMh}@SjZSR{lN!6YfZW zp2_4EAQ`ie#;2nHqPp%XomHBT|e9r{nl;|fv*I&CJ>9u!jSRrnez&M{t|zp6KnRo ztexqVpF8w{kgX}Cg$)EA5Ul%%@F=LiYrnIV?!RjxGctzh2$u?jn(M^S#Fw6zmoee& zV%xK_$*_Sq%gj&8#Gos}Qn)HrL)DI<1r4DB`|n$&yuopZZ#V`Xu)i^@B?GhL3%PL6K%9oIEy9G9zy6=np=XEal< zGx&{82TxGZyX{&d;N z_i<QdRJb~#IOv>xx<;G+WK^*3W(OI_T~&Z=kE*FPDjoF^pJf*ar^{bp$`Yr)@n z$0C*S0`G8QUPB&8<(c7O`HBbKU0=8?oqLrn%N%q6{r(?%nLO$iYb^KH1g(hu7?J<3Tl{h$yHSWCw!7(<2E7SPWTB*Mmi8o*p0$Zq$Ci-K#rwc9p+$Fd^T z<(3~Uh4$S;)4+iY$lFtIJB*dZ?aMF>%6^{Q|CY<~hr>_KL1CBm6{lahBjjmsCtAB< zy&!9cp$4i=xer?SjzbOj?Wsb}SCXRRYPMOQxHVPG@pmDV&-FgWBd@#)#6VwRZR;q( zJQcS8Pk9Gf)9IG>OM0%@K|?)wSTQbUsyQy9WI)o`a29M*oWbqyqKWzj;l3NDIy~*c zmu5$dE?rm~zUQOkPA_Iml4V#nwT0=ZS0YuX_amV9BH(8IUc^ zEpJa6wCFJZc4O66yA8NiIZJ2y7Uj=dQjH^5j_PTW9>!l2)*1k*A*~5*T{`>v|9g$@SC#uGAn8Xgv|B)q-qJf)<^p1>6-9OG4)T}YTR<_}+`r5;y^nYRBT z;#R#;977?UY&Z|Yr7JL>cDh6F!M6IrjGL~Fn%YEkZFzS_tn>(eWvDViA9c(% z76~J)8tS?yke0B_Ok?B^s7!HvceipoifT#-s&epQw*?kANz({Y7wL}`EyA-&TS z2&w+g*Sa<|XQ*)T_8Vd76;bF{B|pMSp;)l=c^U}lTzIB)cUevCngVJ7w7K2e>D4Q( z|0@H>vgS|MA&y1siTXPt!*(LL9ZA+bBe@-sP^v)&`zzrvv%bdx3GQHn5n3Q!?FAMSZkx`6OwPoE|h{F&ml~9W|xU;53=*M9nKwf>&!P zBr`T!)-am@%b9-8PIi2^cjNO7LYry=+ts%rZI^d)rw?wG}Q|?nP(Z zU2)HS>-+1T;6M4ya&f=geQRU3!+jIOYT!Ruj!+mx7?F?Y}9M~eb9*x7z#8h13VP*jSlzo+BYrj=tlSifOk zN3K@*WR-hlprYgd?>_!W{`|E6uarM`hqFaX5-Qm5{lXSKA$@ycI&LXCKx=Mx{i_sd zbaQlt@CrIqT|7(n$wxqtM7ciMVmDFV%?JAyJnQ{7tv27Rh zaK%FbcasLt5tE2wwpZxg-2!*rUtBg+Z4{<9)+o7>!O%D6H9D7Ow_{dbH?CX%7vi=5 zan9;Oe;4kA`BeOO(SPs3Cfi`RC7r3*$A@UjXA_U1KO}mQhd1!Of|kLF*DEU>oR8b+ zYeZB}L=Z5&LEpu3R9Uvgcabm ze(Fk=i0$IZA?6X?<~-$X{X+S<*wT6wanR}dm8ZqIi*RO}c!d*bNx)&oq3$N2;)35f zyGF#!Ng*+ugl^nBmGeph!oPGHJ$X>I!PSO(6N(5mS$R96Zev0tHs+>D*I==^V*y{HJGnm|W+qwGvunO8Aa|27Ha}892@MY^RvDBg2>A=dgiyD?F|o@6xJ9+C|9b7FFw9(#-#e zedN!_bz7@C!Z1f2&;q%5c=^*v+ps;n8;sGHIlX|WPaFX&;cQBpH3;lqk5lLA8QGQ^ zGpkYXz1N&P^*~2uLwuu7HcIj2ZAoSs4`Yqu7^$Lo3EvqpE_E-3zp#F?_4big!-QcJ z+uddRbxD@1!N%M1su%-Zq1aLBbAeQDiiqN2>Lj+fYYN!k2CN2kc3J;%z^e8GH@st+ zT}tA&j^&@T22T-?a2a!NyhYyo9X4^N8u|ECk)--G_dzP}zl7#N!}Ijww$oaW$ErPyq3TBU>Y1P zH`{bPCB0I0r+pJU@)&Q=^Bjr)l&J$*S2ZECO(g4nS1qYwf1ZKP!bj!9wYxJBXZOS% z>TEjI`05tiyZTVh`VZbj2(9pr^Zuy(DiASTmNF!!Gdgwy>)K`nt39|6CEtSTF8x}Z z*2A<%&&H3wk)`eWqX{p>URwn6HF3u4A5+Aw?0a5I$OV!oSf%zIN^7Tp=x*-4$e^>{ zL+>uSgs8$>A6;{E?*(~52TJ}r1iS3gKM21fpR#J>U;P5tiWqL^Fpsb<0wx`W8q8-< zrB$DYRk3UF{fNaZ>5OQF$9Gwu0&9kU++Tn*pX{%oz?n}j5a-s5F;4~UE&h!R1>Mqy zLXQ)N!guiqW*K3?BbAF_KpNR?G(t9-?zBqPuLuxpcQh_>YZEE81RVejat7tvBZDl# zYZLPV5$Y3Zc42kNV3l$xRU=V^2ji&Z+m5<(zXqFvFsaIc#?&}V*77!N`=Zknb(i+Q z`iq9vH`})XNi{%VD)v0}s9Z>@f8_?W4SXoP4z=f`alRdd2W$Ob0m&aNB}OlVZVf2f z9!~emWY#S?+O43CpVybo1}fbu8wo<9ANR*392axG6E_gtTv%Iu8%z_(V0^7-P0n{8 zaM(hUpMV}bpbbWv_K2m^H!Jy*L>d2(QMl)YE{kK7i9&DaaMfF8MZxK8tPz^XQ?fDSPgpY0*US^=4-*W;Wd~ z=Sf<2{r4{X_SE_`nDsw<#Qyh-)c9-oprZIv%>FM?ixoU-@o+&&H*m5-BkqfPuP$Fe z*CsYu#$~i1<4HgrADb&qn62DHD)xLZkt3t_*eq!WC;Lvj1L>z)Hu080hkrT_^Hcus zVM0`mm35uSMCwdCZ8r#-5=)rt20_=EsCqVbEXjHXFn6bDzj+<#4$&ymS!7r?wSWq8 z+nS=S+4ov%kr+C65gDm~RoHs`Z;erGK)`g6xY&5fAxPf_jyDu*0Swk1zNxsQBBBdBfPl> zjpcUW_h6c`qeBox&nxl?CEo1w>H!Dqa>ZhNUXg9Q+Ip&o#~yPw zGgBTcqmn;Ne>#$dr!`(TjwI}%UU?f9JG%TkdHlc6&wCqt!PD_ltzMs5f6Z1thT{QTuP073IlAVxCJE(Vm?Y4K zY(no1iD@jr$y!Y@tNqCF^Q(_np6u`K>0yc_X582g(AF+XwC8C0Z^#K(sPj3u9H)_fM+sJny{cI57H+_vwT<^SJ#HDdQ?8{xZO%!Zcs-7i#01sKSNcxl4^ zmrfQMVVy^u&II3Shn^VG`w}z%Kz^~rb362`K7a7Mf(}_AWfIq>XU5w*%vKQ_oejBe zLiOfC1^wzlBBO5EpN*YKpri)=DF2VOw~mWz$<~IG;10n(3Bd^x+$~5TSa1(caA=$c zf;)uZ?(V@|g1a}`jk~+^1!g8WbKkk&oVj!U*}bW~f6eaNt5&V5^{nTS;CUNGEyMH! zQ@%%IG5Yg~fnRIu-7`!q9`@xtm$}2^*iGMhv=73?*gL8zyV*uz0D`2_1nZC*NI~Az z=YDAsy~dcI^Q7+HeR^@q*3yW@@vL+oxmIZ>;*g^r!4kG)1Ax{2Xusn2fek{lKg`0w zb&St)-MgTcZ(SI$vele{vbKEpzz3mXdiVcJQ}?G%o6OA~dywquac}$Y9_-?R7S_S) zLX)v!-!@1s7^ZkG)b^!AH(VSU+`b$Sv>?xFWo1Db++-Lbyp3FOM}SjCO0^!;07~D5 z{F$7hL03=hg@)@B1J+rU6p9@$D*Hu0l6pT;ei&hcvH~v`IyE;{r=MG~8a;ZrM8;etuMSrNXDIL@83m|sW zL;bUmc_FF2LD^VwJ-~3NbMKhHSIq1#%93i|62ecquv@4ga?hjkZ&RQ5RgcRCtoN^* ztA5W?s2?8+$3vSfMr=YEVZ&z;Lt5bTMJf-ai681tKLxO1U`)8&y~r`dTI3f&-4kh9 zNUXp3@9W0x6BC0v8nkDLe&PYE-<;1Zcm@x!R*%oia zc!R?KRxFNr;anU(8&SB!nO!s_rc=ZYD(I9clr&GAxwJpKBlfa*Z6MR$-7LX zHbfR4*;6f&5R%trK4GpPG!h)hICSWhc%&QTj!2vcM2^*zXXl}m&p0aFso`MfIp<#0 z>Ms-YeTE=iCDC^Eg>0}&!YoPGw4m@9^|bQ(1e{%Oc=c}4PG{Y!U(=}*v8nFt>rA7= zndbK7dJyCG!06;562Ln4IHX{}0lD*zVMRCs-bqh+vcAaCwE4FBjEMzeguLo{8g%?L zd9b&7qvtQEIgNMwo010nXHaM3@4*X44KE~z=VMv4@@5fRP@0UzGd}iL1+J{GftUXV zzgsFpqlDEfWSrqvGb?(bd!jp(RYf^1?0|Zo;TMUK_xym%+(wfOG1tJ@%8|b*UBjBnVR1L~a^ndFZzyrV)XLni{gq!gdy?DEl zPP3A=FhPfte(EwGAKeY#z%-=JZu#A-I?*UCqv2N9Oyng(zW>;B9A$gKZ}d9WQ_O)n z2+K))S)95bPqHHkdF!Icj-oBB=F+fVxP=~GE&Fa;&9SZlR+HodqJhwEd{oZR*>4;*|ZI0a8UT?R{HLY0u!e^VPWI}5$!44?2zu^rw`S~q;Y^hcF4vnD$ zW$}`Ft4q%;G3dJe1~F!on&&a=w;Sg>0_&PR7^Z`GKFh>! zMMbK19Xxl8ZB}?g$9QiBKc$QiPH25j+!^WvD9bv?QMN2A#PGSt*pAA62XVE>s8=tl z0UMdWu&+67uMOO5+o-pUZt6^OpOQ>ZIG5zkvtHrOB$%ou(`N{5X|RtLo2S7e#vGYL zgJai=ysAYax2;1ifP^gxL)G-)cWWSaDba<2b#+`z&Xhl137q=-FWP--8Sam5i4cRt zn;q5jx<4X!ZFfI$nzHe-b1YG8t|nsl{44BXCyym8_+y;1LF;La=nN3k`lGKZr=3qT zhNE76!|j7RgE11hR$Kq&&YC7xs?6Ul#z^4`G7J-AU`d&d!>rO2)muG{C#n^CFPWMv zH0W#fnjAY-!IvD@E^HX;1ey08E~m&@t*DZdrRexUN~E|%biY$7MRoaQujvB>rk(T@; zyn2Nw)T#^J?X#ixPEzj#-vlm&^?u>H*A~HV!z$JZwLxZQ6pqu~bHJ}G!1UOHPj1D~ zdT$$uHgC!U@wL(RM5UW?~uM-6V9%)q9Al^^D5Z-Cdr5cgh6y#Q{qVLF3G*h|xX4A~SYVf{B*qTsZG3oAFqzAiwgwFpC@k+N7 zfp}R1VDD#*Jcnvqx0#aP!{Ihz#N7s;W)T#>qeTS_mQHKDEYc1dxb$)sanNqrcZ6W@ z42|b*iDvG!mRek53?fyzYGULD&YXSk+VGk<8$W&7#Wquw@fy0eINBj;SysvayW@6Q zsD(+RH~Fh3zD&wPiaz2&=Xl)Go@Q!^@Cj(_V27ar_xQa-xQ6Nadp@`Dq7E%fydp*t z#IRcSWS|-L7D}14ecO&^EJA+2E1A48+|NdTii6M+F^ak2jDXuf0Av^EY~WkDCC)*q?N$TI*?N%iyEE#abUneA{lrpYKs}QEhgESM-Dd_aS4y>LZgFtGF5B8S&_pQ^b-uEq zc&*)?3Z&Qc#4=3L0dSC=aG23FS^cbG;tFSouu;G6uzli6=}Wa5c>Kg9U-xsbE_W>R0W-ucfJUtjyjXLOC*#vK&k`r?qy#fq(l?f9mTugLrArKJYc zLG^>peVGepMP2~5`1$GKE?T&f-J(6-R+BJ4`;Hu{QTZL@u;xp*$RLorj#>Zm@dT)# zKHmm2U z4dwYPQB!My3;31K&|4p)N>KDdJspx_9VD_wZ;G9BYlyAuhF!%=0)1$Ef7h%JwxY-) z^Ni1L1{NM+_R9d!sgVimCPoZ=NJ1&7u&qu(^B%NWWBFwVYqxl?bgeG;Mq^|wdv0)e z%%IOlDqpF}0E$j3ObN0qJNxA2>HyTyjp?f^Sm|#s@(~_|a-j!-32bSKyTRBpu?biahrVUH%_l9BTgQRiy$QW)|faO zh|lZEDu~Wnl5e9mKl#1hNWRPDyMwcpbU0yOQNQuU+h1T$#nAU4BPP(({&Y{lSP+Cy z9RH=U=Kko?55eYdeU@>fNMEDY%Y;5WDO zh#MRbgfxDg-OSD`B_JbSwV8$JJSHY5hyRR!KBV(}$&jZG+lT>+>5`{*AHvs{&Vdsz zOu@Rreiets_4L?Y3#^#k&xM-w5mP;c?qg4uDRpH}Dy_J0q^5C$kG??hHz~WNRh~<+ z+`hqNqY0km>Q|O@g~}b%rg+MFMm3#N2!#QmIY#UiM*S1h6n=ncx#m(@%U2%kWFmRf zTw=tZqqjQu`0JBncLSwWj%v}TGp-I17u%Au4Vpu>2FT(z-G;VyU2~tS9Fa~pHgZhz z^3hnUezWli+I9?sFd;7JlHj~mu?e$gVprmnG>gs>(i!9WV5UaSR+}ND18|C+(ukf~ z2@Uj?`oa0mjDYZ_O-{F*4jX~+`~@Ih-9J%Dw_L=G#^eW+!aNf}6(PI1M4;!gnNfq@ z6NP6}_3cO(OeC#MO`F{FJAx9eZEvxZ&BPf4zzx=!Q; z`Uo+O)SYcRnJyx=M)9k{h?lWDcEgUbz3v(I*qj56m*`JoVNb$qnCB_?_`>u-@h;<9 zL(W2I#9NWZrC&@y*XjI zItf|n!0Fc;%Fhj>n6fuYy1_*nEOV3Ye_CL#j%m{ZcF2=olfID3JeURBX(^wo_r~jW zt>YvdDFGtCDAmOS&Nj*vO$No+MvLdpjM?od%@prUq{qeT3%LV0KQ*!%MML$*|A?$x zd+pqmTagd>IGLyfv?!z2X7%fGEwW`@zZua}H6666^a9+46h8G*ZPEk|uKGs)rZL;-y-fo?Cmg+gtIO7TD1HE``uxwV71UvPvW6Xyiq)`NN^N;hv9&sJ2bJm{Uamr{vrU)dDn zC1&X{;GxAChc~{~9Fbj=B|7fdXMRqi&`c^$xaBj^?ILx$;j7ZC55{ZEsb=X2lY58n zgtfd!#+IdhlEn7{Ybj2Q*E@L;MDfWT4>Qek0)3wZJx4^8@AQx*3zZiR@AlmwgDv$K zYB-H<$|kYqf-{vWf2v>ZkC;<(W6B&%jf6_^4ih@g18hU1?}ntHSeupJ4Xl@;R{rOx z7(+3=TA&;grEvYyZmMsVc6mGGxKoo1G`Xq2!v0A`asMcrIgDV?FjDr`!>mA`riS*Rp^&GWKzqA*Mfy$@X` z@3vMVHC|EX?6jfX)DvA>K7l?GyWwj;y)}QAnWHo*ZC_>3gqvc&n9M@VVH?q9GJbsIbmT>sU`%2jLsy35x=(%IS^P(X6=Rp7c|t|VjocECF;luOIk-cd zNGN{nOt>FYDwBue1VMBQPSin!S#wAq`6N0EI@Ty|JGX9eLP&~mnkK5qnx%pdXMu^Z z(p`B(*#ljh8~N=?q&YqijqPg1g5%j(N^v6czE#6D4!kb6C`cgCp+ns#t*05E`v*u3 zSg?I2l+R#;`6>a1QGVFL$y+YC%^f)l1MRg~t9RNux!(a15Ff z{yUqPI!W04TNMG_`h|$G7ExY+WXC;Dw%+vCk+KeHq{AB7VB8RR z`$%o0ttreYsOnP`JGPROyv~32acO?|Nd5b~Z*j)(pD8IH_+&MDG};tin|)Rbzj)v4 zY2hqG59&2yq4q5Mnr$bY!YI#7(4*egditD^W1YT9=KsE#Bt6)1Ub$}15G`INC zV4&0VgG4OBfNiL(qjOMO^JQga6mMWmK??bzlfE8@?;e}(Gwl*qo9ox6bWASJu2^Tz z09VjOkgI%xjCq5$E05mr>BC;qYbpphY9L8jb@v%kKN)DJdY!E5K8Zf^{FHqV?xIH7 z?f=~pzqHqUEJ^U7E*R(ey{Uv6^027{&ljh`0xe!cRZ2zIaZ;tpUcN>)IWy=AcE1Vv z3sS_?+IIV~PWQZzPjD}sL@E7iLCiOw`2t=G+w_~qJSEkfR5{ikEV6*=ktB5~ z=z|e=U}}*!Gs-o>OF_jvK3EGDN!j_0r5YO)8pCQ};_* zqu!m>o!TrZxBXcL{-DtbdVwjf&p!Y6MoaDe3p17+2fLKm?b$lZ_3eW5lryb2W(Ogx zRa4Vky!VK9_t=42xgm;2#SM-3AFuB;&&5pcDD9|73-+~bFYJ`G{#0h>pBojMkHjAO ziISd+!}vEMFH{i=Hk}GN1%_0=&Rk4&SV^c2(GaFmmT>!xQmfc>SLKm2O0FO=62cbe zu?PMDD~>xBlqbuRiz%F!yp;QYiazxZjq3L=GuPt*HMqFljP1`k4XgTG`CG97v#V7M zjBR1O&9*-MM$Euj{mn6QST^3ai=~^qDt`N&jRI^`Fht;EUqsO;)a z#4n-zi0XeU_S>51+kZq|F!c79{1PvjlqN2qK=%1*PN+>?^BN_nMFkVyIBH00X?5`F z>S^-YnPIbeT{40M||dKLJMsyqK0O}w9tj=&rReh1D3 z2WwxxWF|2WhvGn$utQ&JWf%~-7SqaU6Xl7Mds{t}bSTGt`>FHL7Z(agf6ATN>dDX{ z)FEq@v9(~AmEFdqZ$nOtV=htq+)N3Zq1$^1fce-y_dO-|-S28DOPJa!3sAIL6Z;&H z%6p_$s`0h!)9&bu4F_OXQ2~kFv7d(UWkXRMROn#x`eUlgIW~g>;TN$dFBi)*^e<2G zRM<9IcKFc{y~Kp?z?}w0PW?on+Wo%>vFP6OIPS$cZ7$yY0UqyxvknRVVt3$;1xFAY4`=}U?7XQ+fF=VS>zeA}(0HeTJUmN^3svve*s zT}WW7AWEKt2uQf|eXugm5tmWAYw!Kk*@M`$GteURBIH9GWGl3IOvC&VG6j3=^qCn> zC60Bw?LSvO_^qnBcZBfJk2LFeri6b$3DhA#38E9{-*nnlz`+cQwky4YAq#(p$dWhO z)_hQ#_f}N^zHf>eU8sL9!qs$tuGTU7LELNjnp$4HZI1FkfrSyxM%Dp9dgt`Tj2*O1 zvI`N47^j5bGJVBTdM2@s?QG)g9rx1f_7%@d+(~!Sd=+_?VopZ?dE;Q{fi9np$6hXsKgr76{}gThcj7ZJc@G# zbtkZ$O-t=FDg}8!6Ll55fMxZ3we%n;FTEGnvxM{#p-22l#a+R8A~Wc}5-l+k36=ma|`k#8fGI4(NRBDkJW?x4mJy}j?Q3%(87;**}LvJ~Vl zhFQmB|IE3J>NKG)f0$^LJY6u)@G9ZGpWXQv4R#x+jGz7JRNKMObl@ce)az6{4qdK2 zc~J8*Z_-Ay`ld-&@#O4DMH>vjcqm7Wb&^H*4i`otflfXnh4+a!~F^3H(fjFN?~LpJ#;<(xxOEjODX8}Jzl)A|j6x85H8LBh&{ zA+!pQ4Tzr-knwLLgx;!pz%5`ouegJjZEDdM8TTPY+=lN{^j3YHW9d_u`Tke34ifbQ zI<+B(fHpm|>(V!xm0bi)eCOY0*{S&{%^wrQy~;&yv65ymyT3;DAM`Tly8@ zh;E5!WvyeAPvdh}Yt3;&PTKcNz%PTU_u)#7P7D7`2g_GR z^XI|`OVEOh#nbJ9+u(eBwQ9>0OQI}WqOB-JsI6mt(Yhm8o|V{V`Ls$5FeI^)u}AY>3xo z#6Q?0y( zyy{3MV-oSd>(J^{1<~O%7;h@~DAt~f;;t$Q374vkr_b2RXj&AYW}pXhzDX|x0AGmR zUU^i%Hj;Mpp59TayGXntG*ez*0;G%qafhnD&(JGPVHCV7Jhv~!RDzkz+BFMWPE*dc z;_K4zF+$ZOjqvWmx-K2iEU(VGJev^?kon$PztVX8Irg-)h08^U9tqF{sB~%nwB_)y zl-y9wSmk;Y<{u?HFduag&Kv!w zYl)#I&4ON6$YSRsZHw+mZ{){}_SvoKV7(UM7LvT-q(o~ExMcaN-0|fTE|e{sUH8y* zqxJt9ga*z!z+cv$?eGO5As+^k)AZNok2(k9gKP6^ikVttySl(S!IZ%qb~_r<47*5t z*}E@yNSFlXQn+)SLNK%(E7y)i;zLfl?VLI_;?{JR&5m=;HNmIYd}W<*O*Q+5+J_FH zJ6bIH2$KDNX7#2r)fAhOIwSt-xf^PbEZ<(UHB)Oz`I+|3kno?6pC@)BA&=!-$X4kF z>c731#Yc4S2VE1KVUoS)#TY9rLev{ZpS*0AlGQ9Snu>+Uvjv~8aq>liZVFpX!@VL% zo<^8%)vfEB{a**{JfK+~9K@+Kl`h~JQS_~J(5ih}DWFK6sI+=H+o5|Wuu^JwXT-Ki z3M<*D3T<{g%7t#B0D$)SA{ZsQ5@e(^nQ*OmjJBq$-c{w!ckSH%X`@+)k0s!%130Qf z`F!C%*HZI%|3Mz7$(m1KyYS>+EfDqIJZeHeSWLrOM-Yk-*iZd$VfFscQHweEi#YP^4v(&SHc1FARJu0T!5By6GG{x!? zV=m2O_qg2V6=RB(gG>`n7IvfL*<5R)V#G_=Qttx6_{9wyEDvkoO;p>HxPr}}hrCihQrku#~Y2(Jo z9M&nmX@oR1>HhZu-O=}6j~eV4GIC|V6n!)1>v~?|1*UVj6}I4jpKEca%7<6AD+`gw zPDQK|)M_P&XYoA8u$FcY0NcoW@wc@$qHH7~;X)$Z|K;@h2qXockEe7%b;d6H6LBXT zF>sBY4uAS&jPP^Hq*9<$Z zq7FkjI-mrPfoUWc)v4nm5uJv`hc2?KmTlTgV#BmCH}EI9&%i2<25dFyoDU zI}hHoTGI)}iDc}W&L992uO@v&GrA;W`BY#`sL-l@bv5p5RM?=Wzjvzy(LQR*mejxY z20x>?-#XxF5OxH4IG{B?<&nRT9DGY5@Byt{F*G$Of@s7QD4Jk(V(&uscsT`t3>evMuXjLLW_S>rg~i~c$IKaY^qgbWC~poX2+>| zA)MiM|D1%kqN<0S%=rW0TQH^U0@90dxh5o{^_ossk$s|l2W%SMA@26|IN&3`%|^pKobNfqvezfnjg9On&Yf53!ji;o*ef z)7)Gquc;Rsy>xw1+f+Fc4JyD< z`NEkWGizd6N;%FyA8^r@cBF_nv!lkR*13FmU_w34LJm~)_h&b#%bKIkrDF}rUJKbO7GrhW~zMK zE$cv=jy&N%J-N7iA5oFr@g5{KRQ6MSs3>DP9t2KV0Qd$1R+O0^{rIxY@Ve&$Zr zbuV`r9410$K=o-Ra2!(uk2j!<`O;P1DS1>+Lf(PtgFVEM`^ca`L-9r5ikDqG6M{>Q zyYx}tW|KM!Me}8AlVOq4T_9IP0{uW^pgMsT4-&k*ZOT+(I5gs>&Kp&PM&|6C5^t@r zO51FaGJ`iy%=ICw$M^Xf}lpb3Rm+`T#5j`*Ohd^kNX>1&3&j&-5mF6IWFveCXTHtg z6a!X`n-!k->2*K2ZV+%!Zmi=~{ZNtD z7%*KkL2Q02oi1L9GGr21@EJuz3VlSyAE}~!T|F3uNxA;@`{pZ{+B(BsE5b%?IwHmS z+ZXQj`M0TN{V&e=sWqZy9eD8F&DBcbr*n4^zJgXM@D0; zf>uKpMbgArL9dnxK3qrpTge^Hr_c~7PE2Vz5YDSw4keKy@)WF7D@z}NQ1p+9uHOnP zv?s`DjIjYburLxx-zqkAIJ?wZ95iMt#z_q?`Z+M{@Js(#zAr6xaBsY?mStGIOJRC?F^p$gC)M{OE7>@hDuip8q^L5Jw5xzUauCs$*c}_DtS??ha4<$CtPcO zjP1y+0D04z@VQUjb=wl#(ezeokZ@NY)@BLSndsWGlCSd%5)bUCi^xZd!PU3mdCSmc&HNj|SZsUS#t7Dum#f!ln`gHzgz+BR9k{0NOJ{CHjTBbuA8}-7?OT>#n6VU`9*LhwTN_ec^<8kPhZ%H)hazid$v%yAIwA^Wxe@ooVS< zhj#6oVN<^gf-th{Ty`v54$4w3Cr06YzvZzdzO>7$?n_ro-Q6`=eQziSJ29|zZteY^ zj=5c?PFIYn0NqfIw-mb)VWvNpmBFY z>ndOdV_SdV?5vR_J5>4no=gF2;MIIxjY3BJ_eQ7@)S*KE+;{U_U-RS)$Sg-czKfbD z(ql&&z|QDBV=}nPusg_;8zBka%Lbw}xQ@#vO3RGFZ})P{QSR>GfRhJ&3-p-{r_pbMFH2Wm6GB1Y(WqZO+AaKSg^5jW0PudM z;$tSBo{fdM0Gmcnqb#CEkS!d%`1m$}Uzp!4>-hC{e&#n1oM~lu(dS7^WFzNP&F=-yMTg%@-i(NlBhb*R zeqF|Ll#a3W*so#Z%SgQuG{aob?vyx5l&HBEXC_#1k#-+NH}D<8tCZggxKbYn^G0{( z8jNRQ@WO|}#rsF|74yp4jetdN(Id%5Kz&_TaWz50B?=845KuCuo&sHvWwRX^W>0yB&sWC`aFKCV zo0}l{)GhIqw@Y^CDVqfYS`8(MUrugF;H(Y?2V&z#l#W16OHGCvw&`#jyxN&~n>ZK6 zu|i|Rv0WpJubF}Q+n<%xdqBckI?B%K`ZPXZj@KY{ks`!U;h!HMZ!mJD)9Sjlz(x^C zR`rY9MS)nbRndZTn}n}Yy^_>+PT%oyj8`+o@@C?^bl3ULQf0d#TKVO|-D{LZ{trwT zWP~S3=_%gu_7ufB*L$xdl3zB(U9eayii-g&H$)@3{ASwW zltN1{_$}Dk=lUgeo!OA|}!p%ZjjieC%8MJo5`DAXZuGC#jO=^Ds-VDHM09 zf_q{A*Re;Iv%~He1XS4es+ezeaQiCcPoC85q!Y&&Fs|}d2c7AcRg@0YeWjhP2pwZ9 zYGaG@(wJVm;xGqjPEi29QqHpU>s3g3CGW+F=_J^_l&LBUwUH^eDa*mGnocuk<1sx~ zSuIM3aXLnc%qu^WKj2j88Jro?o1Nq}J#QwP%qZiSCJ8#Wb}Q!1=%B8;K5?E+-i^v< zkUkKrIbybTI~we|qZ&Mk%UxaHln-=f{vv5CkGw(av6xXTq)yWudNGU8xcd2i8{5^4 z)I3jVY!|1j?XKXhmd(vd)Hbhp$2uIbGunPG0$TVY>s~d7C662Sy5tb13x$HI(=c;^iqBLkjpY%tG&wn8*!M(BnT74m(}ytpq)03fJyajm|kUf z;*?;C!gOEgE!T{ZFHtR=8T%UD`IlE~R^mi}SF9<@Qwo*{deXGr36|Y6m~oQ0ir-_8 zh0WAwV#|wiXm##gRNjc7o98+9T$kkErjteSid{owu0_T2ll}99C`GgecCTV`$P}Z8 zqkDTw8}6rOhsMO36;%65=eTCh$GUc|6lZdzEf`eqd&V9p5}pN$#YcGlS`tEblxE=D z7;nx{oe{j`oOPcs%V39nU@v=P%c}q8LRdAEx&r-k8jT~FR-u@y(Km9zq5f+W-ixEs zh-otw-v${&d&&svy#uJH`=uR4KV}Hj@X|l+Lg#Sk-6k4{cM$rc-iN~U1MF?C5-VG-XyNs3LJBX7NUw@= zZhx7~H2zTMNBN+C2*TAiOm$oQ&uf|Mv3DJb99+o$h8m8sW1T1g=5aOHuqyGXM=iwN z9;4o|ZWXCaLOMbpniD>3P|(gn(^gQtL!vR9H@ZY1z^nrx%{^5=p@_Ul{8pUGl$In4 z%ic;*iGV{=1H~yDpSq9Hz~1dQ>J3=aDBID&B|wYk_N~%>6R)S&Mq;b?qaW_)-GrE6 zVN*};PhlYl*Rmm~VA7SgHgEG09zdd4Y`;>~y2;Iy9?U?cp;PuU?COX_xH( z(jFbQpr<-e$(%M&kQdvYjDJl+UKU|`eWJl_KZo>UK?oT`zvYDw5dis^8tm@dH7;;1 z3@_vA3#jo%JHQ6F!mL4_h){@xD2Gxzr&g7f>UA7yGG2Rt7!EMP&Kp;=MUt?)WE_!F zzD{%U2x>l8pcM)cQqiUFNMv}0@98zeD{?P+0RtIMXu;u~%%%1bFxJ>=XeGK;4hni_BFA_8m|~Hn-m?9(dEM+(HdR&8=bsr3H(i_z9VDw1BogN+2Kk_uUC2rUvT6| z=s&AnSQBvVR3<2sOP>WnbhanVH(yiRHAGTaPtx0)3$ec~oTYIZrw8UpeY2=#tJ4gV zANpPd)^Wb!kjj64?v}V`n?N`}!fKyyr<9)0x+k< zZI{~ueD~tluR(yWPpE9ct*LG~E!@D}PGw7sZ1!}pMr8jdAFY7gDCSah8@v^j1W=lX z8SD|uL3`9*R;+PtV|H|F%a8h(lk!3^P~ba>$RV}eKHXBz7C{^@WK-({VD^_*9TbxqU{jg%^6VOo17!JawII3&=7Z-0XY913X!kmr1 zoxk&@qO>Sba_GeO`dOX~G_!oh+6Av)#L^T!RS&<3NZF29mJ)nEtm3W4UG8UV$yT0_ zX+$k0e*a`)qv*pAPJr=$3zayFAGNY@sBp0kA)HGS^q^D{8JFbI?a2ScD;9zXD#YcX zwH|6}3l3-pI%F=250t}<0VWGnszc)>=iZ*87r4#25~X0CjfBe2E+aYtb|bz4Xa-YG zJ1N5lR=%B{z}0?Uu~|2{x2Rvm8seA+N+K}eEe3b_4>@AU%q=9wE!tJ-K-_(7@Cfwg zr=uXd?ZP<_-y`iZv^Dj5^Az_(dPBmSKaywNl{o#aY#9wr`qwl!NkW|P1pdiWWFY(H z=Q(#0TCq|LXn;lnJ@<7$+%ngB?Xu-xkZ$e0%VJiI^V`O9>He`HpfIKfMHG5I+AvsOXe~|ByVNIZp~-DPP<+oiVXouiVHBZ!yFvQdEX`0vU7li zH-MEKL>FQ6*V5--Kq4cGc# zuM$dNe!JBB;w2U53;6#h&8f1J_))t%lH7q^Z0!dNldOs@$G?OisRXmlX`)c0+qj?^ z;Btm-_~G?hJsFCa3HVKHa=DgG=9&e2+4>uKw6g8(v93c-9nxLKN?!VK$QqcsHhbwx z)e`u8`UAa+O!LBwGp#{0i4u@p8>_J*z!!Uxrn1#WbXD3oV!UR{{%+MtS~GNt z5!8&(Bl?6QjLj8N?!NqABUS&Y@z73Y^BTN=a^FEXIh8K#g_J|FMkZZjW5Tg-CE6Ky z?2)3j<77xz8(zcTuqoR$-L7!VcFfs0q@B{?(!;DZHlCuA>gaktc@%(8$mimy-Dx2R z7@Y8Lq&W+$aec6sCzF|}gvo!%_{yRG9BzSp4sSJk+sSidd#U_Ar>3Uro>W_`f-;}$ ze|-_qlmK;!+z;Jm@NIOgBH;&>Eov5h+BhrLG_&jb2=%0+Yu}GPVlf%fT*estQPOIr zC8EbF=6Z^znB^lM>ia==t=kc^_k(!7)poP0rx&(+Vq=U$ReYk|!!#%>< z-$WV$f3tSf7Q8@)ex&34VXxHIDP->Y`UM`$&$r1|br+msy2^q0Emid0y9Ng|eTtp| z3v0HQPZy=W%rGHMa2{IzYkJfv4sY3{Ym%78n${6I(ku7pEn%w!#Q(KAM+ily}^#a#8N>46$LLa|SNQcM^y% zD*_~pLony-V+ueV^#ft#+!LBEmborZm_NmE`^VEVd-yb-b6$EQ>kvNCsTZxI`R&{I zYbvTyD!iS~@ST-p%p-MmU44tmJy(xq*zg=v9HXWQ@O_)wc682tAqkT%1-_DDY)f`~ z(k8UY%3CmG{3l_06Fn1Z<}?Qvim7Ymy5*Lug3(x__@Z#1F}v3I)2Eu zD#<)f2kuY@>j0w$9iL~A!ob{hl?6Y=)+=J|+=KS32upH44yD+);jtw{g^WRE{`pHJ zfW5Z{_cqp7FRos88Ha6h=mrDTuCrD`v9)UDUET1eKZq7m-gisAiZLx%&zX-VncUF( zVboX034uMo!|l~E{$jAJq*WiFx!%CKdcQ={zdm*z1Enz#Uu8V|n4x;&98se4{GY3P zK0Sermf}LW9`X{(82;K^Z9T2Zr}Kby+y9Hilr~`>-V|;8ad_r$M^v(aE zPYw}=pQzopo(>{JX6(eFR+`KL50$md)Qw*uM0bx=yBQkcXDb0t=rHKC8@_i8Z(lae zDRna)U9USNCts8qOo;Jn&~W*KY6;_t9JLCR>%d25EHjf1+TC`%xJc!zIj%9V_QtxF zm0Z`6jrvcU zCYb^J2h{XF=D0#G#oYOgD!QTMRow@zG?J&>lNb6?Wm-C3&zL7IdHN39npz?QT7a(l zK_Xl3Yek3sBgj8|>y?+u&hk!$CiH?YOr;0y5R2J)@kz7HUWXM@;;v9o<{Q5+sz$9WJxp-o}}6s6N-O5p4^t!_2kfT_g$-##2|Zd zh!Hj6`;^lI(psI~j^2qYlk=<~Y*Cd6j63m#u^7irxUhL&my)apQ7h!r(%hY1N$$gu zyz1;5&Y7P97vw=-rLguNU3yvd{SiY4Y!HS^{|#yP6MclVhe;O`T$R9yAmp;^8<}g^ zpXJ7F*Phq^RZFq4^+y>Cs;4{#zlxY=EauB!z(15GxdwICSAvlxW}M~Vzo+8n;((%? zKKy^IeRW)1S++I7CAfQVw-DSRL4vz`0s#sSZVB!X+zF82E`_@V4_dfG;qLkYJ=2}} z-n^OVH~r7esSCg2=G3lzwym{DtMhU!&=B8?`8tOS{YVzvJgENBDn;=uReNg-{LS)d zxTkz~OXqg>9&2bBft~RSMQf{?l!kR#`>``84bTfC9w^>fT*8%}+}C}Wbd zh@sum(kuj6>%Do@k}tdM6Aqmu6c^yy__5;XsZ;9M6~%;8lMmY$A+_B7mm^bKb9V&+ z>|Hepdb>L%ub!v}JyPDvujSB`?dEIG-SElM?x#O;4z3j5{HNpC|Kg^(+S8=aGgfGY zwf0{K&;ADC67-*$(0?rndq-hu9C zu082~Zgg&af$~n}X)pci4)%z3JpGFkLsw$kbf72qE}IB{`nBSLAk{us0WsS}5uL)6A}_6K*h#}+`K09#*dleE{RuBWBl=ez*+(jz0zv1+O;rQ>c1UY0m)E$M zuLh^}4~0ESLNLp|1Fk@j%=1-{Juh zlkn}?^YCWd|NhHQ4{lz5iU(L_fNazM#HuCY>)$u>PDaYkKqF?0T4dDK)O|dXb)S_J zXhe+ql>PHXl>HHuy=+s*5^3kBp9}^kx_)~+galRrXmwyK@CBpQfiDb@_OM4aabjP? za6q-^ltECzc<_{PK~=*}-?%HN<#PQCQ`+d=c^$T%b7jX#TTaC2w(oVNfbR-PL|~4+ zDfYhdv1i4^p;S`Xt2N&HcAd1xDevo1D~5Iyn5Nv8wDLiQyZ!kmtL@4@RMB(82q1PRKUjkF54 zKVL>z2BK!T?YYVgEyF4^mc9wcR(H{AHV)!Y=K--?2nQj6tliZYW3Mrc<)8;a5db#n z>;3JxgyRq4g=?eNn+`1=)2>UE-DqXJPHInn)QX7o+mxidj;YX-A5FFNoOTc}3P2Y$ z^JQ^e|FTzbxBlcw$GWr6RPjXllHu}S2M>S_Lhe15l?v97< ze1p_uYfbm9Izod~eg!4g1!_+5U@I$p zvtty-1cu6NbioUTK-_EV*67cT2pC>yor(OB5yJ4kbaX76`B5%%n&1T0IW8X4WHEon zZ8Lp&4@U0dZ;kceD6^yLF$y@c4ng z>J_ZO`J?Q}D=CZjICWj;ySF$%guvomG^&P4`-*7{rx24yPWRKyh8^FLGdAT&lBo8V zlxWl_Q@bo5p(`*Yaq}w!}20L{TJowCwQ`{Tx-9q0mzv(MU zVOB&zVM_qu7GDU|Yl}sh*(LhQd7tEmOu19^GC&kkbnTgWH)9O=Ps_GG*00k3MExoa zR0O!44M&(pP5=M0*g3ZDAA7nDe@kN*eoJG|<*%8McYb!vo5f@ciH$dl4kJ@dVmYoA zq+aaLMwH*M=Nky>Ei`W|zE^Wcymcx4-yivApXZ5)m(^Kq9rqVOt}a=;K<^D3e;ot9 zd`XL7;bds-U@SNU@7Eu=pTR8>@L19Nqbj|_Vuc}Z=@;y|pW(B>wYKCTyM+=4=e*tJ z`O^xP{}M!;s^qq32RL6QDsk?Hq%zs*-JrSXz^#wEh0D%8Z1e1|K%|%;7?Pn}Pgcjl z6Q3(gw!QW3hP)L@*Xt|{!Rq&hOD^NeZJ9)r)9X12lwu{hGXKX??qsX z<^CV^y@LPJzE{a_eJ|eU5GeV-$RDgwKlf3*I7K09(Uy?$$8qq9l9WV_ear9+Ng56Z zrG=}m*$yxPN6Eowx2I|m3s8gn^IXTrz>9#UO=s=1z zbSKamR)cYn;J$9^kP>GU&BU(I>NFiLgF0%uqb3QP1m*%i4yA!V?qENUe)E}%)o&7Z z)UmoQ0GfHefFkC5!fFG-y+^gh-}e2#W6i${xa4@M$c~kKiujdi+^s0rX zzDi!NxD<%X!Z_@weFvpnSBABjMbLDtPnHC$7aq1*R0|D_0=`KU=iDbGXV*^hPB+e2 zh8>Dwx{pF@6P%~n=egZu2j?mHJ8b9ipHrgfI&CN4_X)&A44ku2bMsk%mc2;+oeMP& zTzg_vVp$F_arhtGMcUo;xLp?hTUr*7-gySv3b^sb9uWHN-MeEe94`%k?N#3SY8Mq;M93kVw=wIHpojEZ3Koi%Y)pe)qG8h@}~c!&@2-WB+0UZg>@kNUKUN_E_il0@TI7nKed+_%ud`{gKZq zL36@m0(QXA(%u9=@b|L9G7u@lrC1=x)Ygwnrc^u}<{{=CItZeAhF)$bH*l zK#2kCtFV6~b!ZJXLQTh{BGZKs@21w35QqD>ehAnc<8NQG;*N8E(S`^&c44S0(b$U9 zTxdQ)?D&Dr^mahehvOQDof_kKt^XO)dfkt~3-^V+l^TgW)2?F_VcB0>sQj~olC@oa$z=E1Mq z?AM|8$9cGWxdKt-PEZVNm~?q*uKfS+;)pBDI=mp_0lmVq7DQ7lZY_0R&j10r3G9gy zTVcQ2Q*AzmvNA1069m)Ci?=DB%~!NU_63H|b(PsZHxCKW?s{U!0ma<~P&KVXi_$$K zll@a7Ow!f2XwaFo z?%pKt9QWF^VrCHiULak4wj1R;ttqMtdrg}wVlu*W{MkO0hZkxg*C(rGdc1aB#|gqm zd-)|}Sr-hOoLXno{K}^a)v|FyqAx~7dvA>PrOV1Wf>$upJqlk|@w!srUg~HhFqKR&ecm-$J;!-vGDFU_kaCTES&L7> zkkVTheX$>-t=tqWnBaAXEsAPhk;!y*HxOd|C*$dVx%BFKLM^j?8$-1EBPzNqq<-EZ z;>>?Rf<)2~SV*E(QbhUU74QVLvi3sGLq|Tm{)Mb?7JMsj1*xG|k6bxn6BXr)8|6=} zz~^)SDt-ktlYInVQS5gTNH-YxJhlQ=ycRKq3K1tP+%wwPx1G{ro!{#(1qHRZAHU^m zT-Au}IvZj<@Sid~(;1k`;e1}(O|hJ=lD*o9t>!Lwe8vBs!o{GGo1$8>b`sBWXoAH! zly!-1IX~MhY-P}`cx|Ftlnp;A!)m8jneTAkth)Gy&8pQMn0)QrS)U+%@Zb&qY(#zD z^91C5wS$@_{s&#f(IaJ$&%w#EJ)`qMX8HP0S5>L62GdFmxws2G-KS%l;`9iW!#I@O z6{J0P<$Raj)xOZagAn{gAwSdD&;L(DEPw#CY5VFdtq?xO(hd?H&cY*=l7r7o1u3UU z6SNOraWD(AWJkI`0lpt3k+cZ|?tOLcFhFGeqiJ7I>N?cJyiwuQS(JYumCo5J$W$*! zFzu;Jm4myQP4}oWdGx7EMLjvLwr0)nu$@5Qjr_+} z_xIIXD?;;~IzIoKqpa`y%_p*dJN)v;H_+V?K5*#;znoqcuB|Rg4S79zS)dRC^R*la zsE3xE!H5`*ZIs2#%aUf7TEF7ik`F|c7*4+Z`d=nC_Dhvd1>Dqq$+XAX0S%)B(D+`a zXXM9J5Oa!Uv5Hr!XA@`G#U_#dV3IE1Tlm-Iz%o4h#vNOSyG4`LJY8z2V02x|_(no} z`5v})m$g&Je(G=Sb?2hRxb{+J=Xb#UkyX&ENp+fq?vi`Is1Lb*x|^zkZbA2h9`(hf zPo?KCs4J|HzotXN@NX2cZXA!KOA)V2OtU!HRH5Us2U%OCtqvCZ*{t!6F9FA{=hEAI zHQRT?Q*k*B8T|KO|2x{rr-e1c{S#uJc|S*r=YQyR?p@(m(9OkmyxCThR)WsTWK!X} zQx>W&m~T*^d=`d;FyRIkUYE6V!RHo}6n*If5$f4Hmi|wS+r~X-ES)fXopJBb9|nc? zpff+vH3W4>1G_N(;J zzoegYC_H9I$#Bqf_j={W#GJl{JoDo?KvkOK0w<&V?125w?iUBIJA&CO^;{knp0grl zmp#gPzPaIep-!fR`)h)C&jw8fs{Su7;O|p`GrzHi5gNs8*8Jf*YYSgI7Zdq-B3*7z zsQV#a@PkMxqM-2Hg}i4mgS9dj-DDsZ-Qa5EIwx^dr<62t$_0kO0j&-%&E3Bjkp5Lm z+6g>TyP%lf$)Gm5=uc!?aHK$L)6tnfyTv3&TUP06?F8e<8K%qo%XGJ`mj;R;7W(lVzCfln%wUqsr8vyqXgAI8y(j*xLai{m7)QkQ3>ZVIh zG1~oP{S?%nJPZp@I$})_YbhzU{uAE?vXSs|cwsYNjFoO!WDowoPYEqU$Ll3nKA z?)ZRzNuR0u>M3By9Ko&u{lb{z2>(PYRQ!(FaB>63>`f-6Ck9|Py06NPH%TFALiBaY zC=J`_SyqVpYvB(tC(Lg?q?dWE{*e&y50ZTx@)+8!ckaMKdf37t-Lx}8fbAkP*fWUu ztxS#nabZiaMGzYeq)9_v5g3$`Y&T~c@5EpGQnEy>cyl9QCK%nwW54(zw@En88`y4t zMVRNRe%7Va<pT5^xrIY#LyL+2t`x2}KrkjF3+Vpa}L=lr*63`d{-qvwUh z{=t1%^!t_!={OSjf2QRHXdI&Jl^Kl3fjMP$wCK$8`M+f+!&6SGO2T{kmb@vfaa7%) zki#vaPbe!HlUXja4$mp4SO0Q^L7o|1@_9NH+$r01q_oDsqWYix<9C)Zw%4$Nuq&hM zYZeuX*pc&gWyYo0Uj+T+FqwX58n?X3O zS!CKyjtmHV#7nv>Sx5guH1*MXw*b}=x3GDMfJHqor4^~5`sY)|9kHp^l@#^_WEMuI z9DCF&sp}__@+ZO9rmn3Ha;PWk?knvZ+_O|BAq2DUZR|^&-j%pg(KD80>o53S*hx4i z8Kn7f&RyCOZhaw6=c=(^FV_0uVh>KBY608yr7}3VRbAS#oF5jqr}8-sEe)n#k33#_ zA1~97m#)Xl#N%afX)x9;_>f1iK0Gx{$mw{nE4|*ubY*C+p~4ot$K#o2x2Bg?kuVBp ze^$Q9?B`aorBq|DCG>f*)5F?D#_H3d+Ge}4hVS#?XugOCl#jf z_AKw+*4#VnSwBK<*$4@Ve;+%YZo1q7BDCAyfcj8I^$fTQlGNywXs)cczr#Te5+FlD zDt&MK$|+SPxvN#R`7PCP0cr>T49_FBv2$$H6Nvc?1zJmTl=ANOH6YN^^X?)9l*GM>p; zZtw6Nx}CS879N`)N<{pcN9ZM%8gl#WE|~fyC$D5)qNog8)*Vuzk(2w{Q+&$u#czS~upePw8rdU)}@ z`lFR+y%o2efML?QB1l8g>ioEYw2r69^cu%2ijjBEL~M(@T9xFyDxk|doUfXLT&Yl^ zObv6Js?Rcu*H>I{38?>dR&f2?FknAjQf8#)l?}sD%zZi0FfrRR{=xTs49#zg5h(rE z$)=@r{3(=&_^4{oJDHNTBU>%~_TB13E*scE9MPLv_5wM^nL0{LNi)x-&()=@v27@V zwPCBpMx(b8lwBEGWjC2ZlGpMtWy=w3=o;VK9&eb|rm=pn#+Z$nFR!_j{m#`xznFc3 zvtptpJ2;TtnxRAUQkI>6=G|;IyS8B8IH3c-`N&u-pvqq*m{4(6sfOn>F3^J>go(2` zU_NcxZV6KN(}$T2T#g$kVp3ntK2h^d9??$G)^!rdPbP67_9~zLaY4WX=8Oe>UXoMM zwGn$;qB$aR-s*n+=DdLP@_IaT->~Y7b*o-s40oGRa$%WYlh5~a)`2T4 z+$;luq)@LBKEQz&=7=8>x1aWjY>hv|3DV7(nB4AEZD2m^wnBR&EiXohTm!MBr}lc0 zL{muaQJ+8wji&C4Smq-GU;hIrms2)S`;a|e3)ifFjjrLIU8mcZ8C@TPRnvDl%jj-QJR*O#BSR+{=>%$a@y*LK|sX3O}rPhux}g?C>AG=lUP z!R%tHLx`i|S8S_Mbw-xROANpfpD>*_1AD=t;tCUL{B1KB1TMiLx%ufceY#aFYP-sy z0LUSLYa)vbViQ+jkv(G{q9O@bI`7W7ZWqSz+k4a1+*xZ{jtiG&!`o?Ou6rZnb1#zl z^#W&pf~|BSDW8%1RkZDQGyF_-!SRBavc)~`V+l+4!cvL14^$i996X{`q4(w}Sww%& z1$7H%EK>s80tlJWP}xM`f#~&iUU9mS!K>5J69(OJyD^T|qSdlwN=dKHaKAK8b}yPa zqof7whZ+;yuY%05xCA8}yH|M568HNrP58rJl))fgs>3tuhDMNI`M;VT8Z-Y1n8{J5 z(hp8r;tj{nys3?Ro$f&~c%mRAV*TcYZu^9fuwEe1@GIqMPNCIQ!|GK(vRySaz3KAt z54$ccK8PqhU|G+z@tCuR?`L8G=i3 zDXw$iRlBtOx;J$fQAI(`R3~?K2Ed_G-(ZKgE+@cn8i7i65Vyrry?YO`2H(+hLVcwO z!fM>PuRDwepM|u>yaBtVh`>6!CUql?#R1a-$7wp)-`1Y!{v)$hw||z|wdOI$j~!=x zD+>7AZ1g(MiONWb?<^On`;*Y`MnExlyk!dM#RbL=D~sW2`9ccyoDI^)0=?F_AI{aP zM!V|LCy#^7GaJ8E!c_Br1O2>BJg-o*v_-p~skXDYkp6w=%Ao6B-@uGf6acsbihij-$qoM=DF>hZZi0b z`pqg~(rZBUk9Q9CL^hEe`ab>ZpOo=|3yN&FxHT5k+`(X?!ZkFOQ<}!FpwqRYr3tDP99; zLHucg1*Z`nU&j1kB4}nwP<42zppI?RFF!z2D*}TV&%_ViDz{oV z&6*3T8@19BYpC>x&fJ9il^a|)+U+z;sLPhC9k7QEW=P#gY)3}7vbkG^!wOx3zAt~0 z1XZIfVxM!EU%j%NA58w7V>VI{-a9#d#0#WvlPr@P03H^<-$;%ll?$(s(zK~|BA-d? zyIae)2~nrVwqguf!SPxXaGI5wdGO{h`K4$0gWCpDL$oJKPoe?{2dM|$GS@Z2>^I?r zngsdXhwm(Yk_raS7~abfHI8)LZro*fR9DNi%eNh{Nw}UMnFt}XPk!bFA6oHClNeYX zvvnV$sNNv?xHKyt{G8~lQsL8zo8IjDa6xo`r$Q6!o$xUOHs}zZb6YiolYU1a`9OcbPH-$EZknb7W;LzMv*I?3)?rFVvv z-;VEJ0;OjHsl}^5N_e<_MVT9gNvnVL)j|^PqYs!+G9VIVL#awPV?jY`BplGJCeZ(b z^%~-seZwhhokWD$A!bB>ajymS@D(ITl_`G14Mxs<~vvF7NL_QTWd{N zAy|atKdgGy29{17venCzDsX3jG6VRzI@78k5+)@l`j3I>*vf9^`P1C!)6NGLv5iTX zmBZBAa_>+itJh`hKNa&tVSrL3`@perRoZPy_5_b_cQ0rv1hgDZs<=sevwknFih4CV z%jb1RTcahlhr_W-Q@Kr%GelTr?yOa7J^fklxT}yPO-)x-mFAkId2OQc{;0ASL#L<# zd!o>fvnmJGJhtj#8OGU|Gi0S>d0W8N;}HAazf{qbKur9#N~Nt(2E`A6jUAPzd^7sz zkz{bwg)4tHi3%)1-W?ykl1_8q^MkV zns`?|+BRugvc~R_|w)HkZ`)I_o`bckMShzcA zvxuY(P_bw&kyQF(A2@qz%^dK<0^jM4c7Nlj;Gu1Dz{!0w$IO-&J!Hdi8o-+&{eY)2 z*!RW2HmM(@b6SKzU(dk2tp~@5=tQ$in5u|dQ|`|+7WztX2;%N#rszMsJUJwNtQO$V zhPzGuUZ+sL=YoVu~lmZPj`H z(hNMj5CkppbcS>KUpoNDe@2G2f1NT~&nyLbpn?k_2*I}Th7j2iTbi>EZ8}wZ8MZN>Udf;S$^wSY9RS~yoM`-0NjOiO<=2U zSCO=EtNFgLtQAojz_aVDdz0$qaowzdfuzbh)EGN7-=S~+I8hA|d#mI+@=KFi77x}N z0=|jw5<|uBx}^I{3@sZT8KZIQpsY;~Rres9yi0o4wS1RzL)!7hUVPj@Q#_03QYc>x znDj3Ypx(+qdKzz|6x6(_`b8*b8x8F@>86j<8Nv+x)EHhOpT$2X1v1#y((C)9F%bc3$SK!?-M zwdN_uc?I#K`>HL77K~-BkQFuQGqpSC0xL6Ke(sDa9jnWE4d;}1^(S#0UVU6K=iU41 z5jIZ$CwZKwo8zXv`%gXom)9H%YJUu4Ji=l!XNYpPUJrG8S-&Z8Rx=%`fF zD|vlOpHU^vQo&$Fr(-*v=V3jLa*Adgr0i%7LV}ugH!bF&DgIN{T0;Fn4)C;bH7?RO z=eFn1_SO6} z7x*Hl#wqI0#n#+0D&}jdU2R0I(CnK=m~v*;P_!A#x?maHjXp3@r@712#MqNU*BGXDRKvboBs_e^AW541SCQU>)~wvrCg|n2K_{^J=d+% zwvjn2E{k;{QA^7;ryM_%A3;a&H|FQ-9FDr0OIqv9^wDO7$Ka!W-8v6G!GA}J{@YDJ zJr9WgTxiI&tc8eB2i*qvV2GG@Isj~dM+>?eABrPK_w+>lIalG1vtb*k78rGrI4x*p zd_HT8cwcu`R>=q0)vM^ed^PCGUgj`i#2jMZ^s&ml$4p1ruFllChy?yhO+|* z+8t`GF1kLGNh1Ua&=~(hDDB9fvYoaqf5^D5LDor(Pz-$AcIEw?OPdNPxD=YDO9McTWJlU?$Tc_;YcHz?wDr!nf=v&FFF3_R0Lh> zIZ4b{$y9{Qf}vX8Ce)f&!Y=yH);wTh&aoBd)&JcKzm9sP?(N~^KgIZ_zfJtf#7 zeAcR1lLpkyD%dH#Msap|1V+5bQwdkn6Voa>=A5dA>iz|c@=O+lIU%kK9ZWD{~q=Xsf7Y{ppS9sa9n5BEQGJV{{Sc`To*GvkFVP>7r@m)I?=}(5zNd zo@%>}Yp10#|Joq1DH+6YsiQz?U;7StxWgD*aw2MdB8h6}9(7Y|3;uaA&~$E^*ydBA zZ?YiG<9IH(-b8^P0C~seMBg=A{pCycH58M4Yx9}Mju)%k%jiC1QL)9^0yt~L29Be+ zQshN08rVf-PmA>;jlqvw6P8e(+pUB*6Rq0ZP7K?h7F-Wtn;j1P&rPn`Agm9x;jAt9 z2NtUoM+N7~SBzgzJ z^F_#4wQmEX$VHU=QbHCb9hp>uo=YE=D_y>iealYyuk!WGi&5Y)ji&B7&wb@5x7AwL8i9 zYqOcuOME{Q*G*5VWa>i*p4b$eBFK9BW&E1jjD>wzl{ieSsbotY-S+LYT_jJAMR9`J zBirp>?-T+z<(8tdYHlmjIww1 zyVqv7qqD}*_g^BPg)Tv6|B$eO!dzubyDfh0>cLpa>kGx*q5s8^GJ6i2#QJ-Mbt?qn zRiGEDc1$%C{1TBi)(pwT;<9zHsaOgbE-w$kyRx78?z1L5LF0Ie_%BGFXW-9L=*3SG zET3bCE<$;lTqGJ;XxYd*;AoZcm0#Ab5EOC><=B(F2mx!%F;^SHj_>kV0Q;&UdGf}Q z2bcK90KQj2eDDI+hZXoC7(@dGjX;N-)!lc6R_GD<-GLscONMCLxN6Z!WdyCHMA3dZ zuJCW{gQ=2dlL0g4Vh}J@I zsEGowsK#FzhEUVbPtD=#jCW!?tLm)nLgBH%5Ji+9#Utm`gp5w( z))S$c<=j)Dxgv+y&6MeeWa1$}GHy{rPjTD+T==z^YMC1hd3n-m=PV#Nqnz|>W5>$` zOs9*!j;t=rPy5rA`W)k(vc?kd7{u^M;og)Q9hF8lI8%4kW3!Sn69=Lt6Q#Hf|CA zW}Sf9N$IXW*y1uSm{|h1kQKGExNwn5{SiU@mz6U$M zUO#t2-itAv*BN^AhXSoe`ygb2fz?;%4g zCiZ?WeKJk+HO?(o@1%R;Mplkw2yU zp=ul$yMSmdN7X1o1eEzlowlli+;C{BwC33dE(E{I>=PPz26wK}(AE~J*%nUDbhgH_RynSR5fl;(F(ZKs%p3kE|Q*IW%ZC4s4kLUQ$znszYTsf1*q!&qGgce=A=>Pw0%{jr3mDZZru#g6Y2-Qsv54! z$=JPb>Zue{Zk6;gnr{HG;ULRJ2s~~bBjhO9+DI~1DOn&l(|R+mL5^D|re&t?%1+M_ z_v1u7M#uX7Z4_0wuJ!v-gGSYlV0y+C^z9;EeQU)$W5HsB`t8NWlGU)ji6gjZWM)|pKWje;SXVB)=NTs;qSuc%^jE9#+#`NTVytIH}35QNTbT{ zymjm&$>+4lM>t8PhuSrA7LC|CsG2NmT2|1_N>`hd7I?=Ao_r2)gPZBb3+TN*d!=AO zuYZjm#nLB0b~1P13P521@EZ$x0eG%bQ4qS{jU`KdwDFhdbv^P_CluW85o$@@KXp48YoUz? zu6zv1Dt9LjqmFJ|UBa&qooy_e-@EkqCisn7O9x~e2BeTr>t;7@F);?8plI$;z9r(b z&Me=|1|Z8GQ93eXrY_&9mS0HqmA!uRU9c-BB5?0nRv&quWktZ-CNE4|rl=`Fw_Giv zbQ%jck%3)T%ONobNk&DN=JFeYX^^We-gw4s@6q;$h3!ty=A?c(Pow18z%TPDJ715& z?{zczRIG(A_mvd#V2+x-Dh2rtcQ9rb@!n_dk7%(K5qKRGO=%sZNsw8iICHhH5DIFx z*1{aAMR9jtQM<{*UH?qYRe`-SUEFs*R|XCvUEol0d>!ARfBRE8Qo$KLhtI#ut z%4whIN+7#{^9y0^Y)V#P^IaJB(@-Xqt!VfHP%Pq9)2>d?i(kO)DMLCe)Q)FMRc5-Pk>0epRd52El{ReOUs(zw zBW3TbRx5u#TsO=^D+04B*3jqSl-r z#h;?+2cv7XbgG#!X+CbHF9<@U=EhabTqy922zxF%jSn$nlI>)WNU(VdsDsDR zW#+jky}lE&7birkoQxZlWE!?gbcV8jv0l~*l&7dx%j;_~LznS_({(w&%-<+j`yrB! zB0f*Qo+eGdqN?TqJxX+QjjpppB(uUfl)I)%EFwKY(oLYch5{ zfUFlo!{U$}y-;@_wjl0e&NV?8Yvy{-k352Z@1ADjX<^;|Cm1=HpDD@_~4eCCLyLJzka&dt~Q3?UhD+Vt4< zg#+(oPpe34`>ten-6*Iv9O>4>AnS}G5y_?7+-5ayRS-KbHLK4dOL(4dEoColOKkA1(7i3$1We zl~KMthDmp z=5Jn)_dajvbjmv*-Le{ExBSUBUE~jTn15`Ce4iG__h;IECdy#MrAbg4%`T zfitxNP!sOU9CZ@lkQhQKxa!a&7bhZ+L_kHr6!?2j4re#yzQz%P=Q6_^kF@I+!u_Je zA{*ZLJM7>d1*D23UCrBRi&`yEt8L#J$QEIJD;U>}I4(VU%K(7uw)pwuq=qt5$ z{9aVddG3f2m_h3rCNx4kgTnli>PIAAi=R;@fI6wPE!K9$`k=P31`EUQ9WAwQWNkH# z8Q<=lC-^OAV%2 z-kU5=cQkd%8j=plISWU1H|oN?>5|_%)M(IjYwlzOyc$#OXLrnDfon3^4nBW2QAH8Dw78 zE9DjLZGWYB+vt-{JYR2%>Wg2rperfSd<`#(8zH{M_k>9gD z#jFmb2V2HGQDmiO$42B|iF3g`Gv>EV$yVj?FFXk3)8Q!I{npgSR;8v9Q6oOvf6Hn# z04JE$?9`lWM^W2KmF2D%v2s4Xw_|l?Yi18Jaqfh)o^8dRSAMnHNVPuO>IWA=>_}mSer~_;T;ur5&<4qz_4ipx-WtQ0q572z2M2Dq1YH*7y=lUA z4Z~LA*+qdj9`oA9J+~I`7;aLP?-4uS!5G+uq-GLVFHy z-2W#K&+U~bo=q;9;u^X?8i_h;*!~%`b*UG`i9A(}P^tN2aJiU`U*&?ma~FRGH7|kZ zzXU+Hs#~MI4t6sYiOL42h^i}XExv_TxZJLDPPyRxj~Pk-B^rbVylk6JvC|2|i$^Zu zpE&SRC_U2;I8ZL>$LYydT9bEbECWcnE}Xr3=DIQSRw(OkBy`*#FrUoZX>y`Hj}tcT@VNsN5`uu#t=Y%S?0NXAr+l0-4h?f%dIH+X{2_g&31Vq@@dBzXuxf@ z%@lkgNR@2D!O-m6R82x6m`vMLpPw_y3|H3#jZ=gcrCzJ%jeC3?uK2=jYB>%nt7?kT zoyZK|;C0F|<_U-^yL?4*J^ACq*R%31xs$dPz&zodfAH=w2E$GnkeGjQ!wqVuv~?oQ zI0WAGGBnf6@1>Y3qn+IQE1Lhp0vfi_ZM=?Y5W#EQiRk- zJ9s_-C6(lUiRcnF^2tC8vgV4&|6@w+zdsQ*fMnlRrn7iMkY)`-F<{cB7>vC91z~rv zgPue28+O#-ZzE&_z_zMAuD)*kHs3&{K*H@5OU6`%su~esG9T-^K?#!`P}ebD@)zx< zoTe?|v#^z^n{EzE+W`UBR*Ze;H55++OgH1gLx1daw@^t_o-q4+L{eWHZKck^x`JnUpBayrj{UXs+)}biDmi%~|e{Q4sEGZsbzCNn$##&@QXI2XECSFlBf5bCcF z>fHZZo82`$L$~e^bkrjYCo2S0A9bq#Em*|R_Wv>WmSJ&i%hqrb5+G=TJ4pz^-Q9wF zg1bY|;MTai1(!yGyEX0_+?{UR-JK8E=kC4ld(XYc_K%Mr^XX^tK(AG+=9pD;R*hlQ z4VkUpp+tT>Wq1CoPT4Jg<4si-1V8_yi*LGs6hT1tqB=Rdd%&#F-`qBbC)Hd|hDDIi zMk~e~fJitQ{QwhVI4|FBKEgzz^Zp0T2V4ik$*@bMtZ&l8&|YUT zi{Ai(KdCT_zd%=sOEt9A-S)$pW<6HUJ>{|)s${85nhV_5#dW#1oc3o=AD!_5jpHeG zto2_{bqNVUjn@^x593efAGRe)%YwL6v;y1;Okt{~E|m%0lyr3mnSx*y9YZYc;q-mU zTmBcHH|rN)cW~FQ$a~g5 zzlOzjPn4%wDeF7c{=b@@A@5g?2ZS3i4ISE_p~FdFp_37$c~NJ4_?i|(ch!emO1Koi z%vhKwQ|7j`6DNDTFyjR3psSpf39A;KQytc=j2vg@I4=Bw`wMChYxQ^rZ_;p9v8sGf z+)H}*Rq;hT2XFze7cH6-eBkk_(V;8EG`h)h^N~lEiH@U;B0r=dCf^o+2c&jKN8JLr zak z4qICubSLx}iG}j#8^H*EuD3^ucN7J4wkC;+@Y2#h3n_N(UXK_5w-|dtgKv%;vvq4Q zyQ({&jDI*7$YnXWKLlkx4?&r4wISI3mMDcabff?W{hC7qpPn2vV3ygq5H};Q6k5%v zHh-NtXpEk3%Tk0%#uCX~guQyqj^{Qov0r2ejQOPaVA;6E5Q^$%;XrZ%REfh-Hehjl zVHx52Z>ifdeqGsJ`J`1PwO4;kFQkJlE-e3?=F@>i5gW$er!IwglyfBxP>j{fBz z9p!&B-|e$|Z98)&b)(qMPclYxalE#uXmzAx$?A_ufchyr9Ln1f^A}G0c=Y@FYyIAR zuV2Hi`962zaWpFaH+%8_PiY!_erI)iyrvFx0|&kkgyO!kxY)Q4`Z1L|;pwdm+hS+d zlvuHr@*$qLsKOKm$cmGpIzZaa3FIz+I^XOX1~z+&>e&+=&VWh*`o*t8ZaL0+oO4Wu ziR1J13%P}*EihmQPiH_!!9ryR2Y2amBBF}@C87GQkLy!wc^$^Mc){<~He61^eD8c) zNpI?+D7Do*dz7ZXr7`ch!7FGaNrhkVq7B9)e`0y_VzHtk79mqVMYnUOJn#Nf_D)%M zSyt(q*)Gy#js2us^{vzTzNo>v?KbfGXYO7Fl107X;Dyi874*Nw(f2bEF*3=s>SpY2NySZ>r5HQ)pI-8)~x z#ydOH?3UrYPkbl5h|On%f2w%=ZAatwgoJCV5G? z|EkCexi{$Bn^t$?hEKx= znZH7o;%4+8QfR)p0v86Y2fVIze#C20+(*;mhicl_<=6dY+ICcoIBOWq!;}ZpGH4w5 z5}y}G6k6fg{$|=~kFUyR$q(7yu~yUS5wa}IvE}h^*`C|~o$cM-Up|p1bCXB=>-~?- zv^zeY2W-)0?s$Oam!p#CDlBQ4570d7^N{Moqx=gO*&oL*R4Y;K0v5?+vgREPC#c&hZGB z^WccDRl&)0TW&QV%&VkB9~A{-80^^faU2k+w9cd zsxxmx%EKO(>P}`M;$lq7l9s^12}y-Z><7HgLp-Imn2sJF)({`BMM$8EhIF#UL4ZwH zAD3p;j#V!Pmzxfeo+$oMD*OLXmlE#!^y~%iGbo6pE6zEvtLLrh%ND%Jtloh}okx9z zy}w3Zp>Zq!iDc-xP^E=l-+$9-dT@OJ;3ec;ojF6fj2ei(@|EhVd?S`}6e_eiw3f*O z%eo^*syl=+QV}y}DQ*#Z78d&m8U_ho+IzU~wEMn*l<7ZX$CQRZ_qti=syf~>+Io)c zVoW)Czpzn8n{ssSPz%#d(fNxEXDwP*x$e zLYE=^{^$7>xQFzsLRPJ%HIL)UKcyA$e}1%UyLkc-sHmeVyFb#H z`GR+_k7ebkvf~2QLlsm{gf>flx!530K(T>*-X03Cz@$W-6UCY^%l987QQl# zu6IjO{=o7P%-dtFe^hF!OL_l<0SG(%Tn>L?hU?^e}0%u1g26AmuC zKwC0rQS_kC=az2f&Qu0KK*5pwl5mDs)JH8VDs?BRyO95oy}}H0eZ(3v${B<{F_j_Y zQC=8W&HY|WKmUWJ4@#XwXXgNd-Nb>7B8H~*Y?s+q0@vEXZmHkMo>hsn4|v@%>D0g@ zzHr1^d=>)XBHV4%r9IPpPnf8e<0P$rd({3)m9SJ&ZU6kVYV3wXmvn#DA}NfPl>+!g zTJdy4mro*8j&foiLVudkpPvL0kV&$k@11hOd2jU$XKkjZfBu#F2%`;;Uwnyp>6!OO zjEwY1+(iqg3DG0aE)z5>Wb~Y=@n>%M8aA63gb}F#_4fUpA$Rxt;u==$SMZv2y+!gO zgWATV#eqk80Cj$m!CUETb3VEJXSd@P3e!6*gLOocLikS&a zosu~Tq<8zaX99HCz-j4|EG@_Fc5+G2HqVl;x!zbf$=F^NaC=;L=dn4X%SZQ{HW=`;qVWX&wRny+e1$}>O_Qaq!i7n7)#f-AV<~k;# zL45Jm>N`DK^Nw=$Ns`3BJN0G>o&f0%!(wXDpTkPcj0X9dn0abOBc-|({7EdaX-Z`( zUuAHS{B~U)W09+z$`92glona(cA?7m$oEj%c1XLsr)E(f-$?m9Esk9j!F~^+zjE0KMLW-#0_J z{|ox(f2ny+r-LwXJWzi8j{I0(49Yj8*$oLqV46xhf{;Qz3!|(LYxbWDt+(Qr@CFcB z?d(#YpEJ?-?NW!;Ykxzn1ZrM05Q9Jzrd51C$-Cv?a^3sH879g}wQP|D!@}0P?AE+v z(AeN717Fc~If~6{m#d9F9{AN|>n0R9;s~-&=M>BkL)g_~h~@>#p^XAqe*;nv2>g#3 zg8p_<)B3l`7kub$`n#UiJbU+htiV=M!0rlFnsGDQHvxVGEdKy5<)VnhNil)VM3Jwz z(oLVm_XVsf-csI>mH%o$*klVvT$PvAK>r`Zr5*fxu1Vlll|yOe?vAlf@@{29q#WFoR!LxXJ$~j&M>~yF15QdBt?wfhEO@^|S}zdqTf|W`JZr36oxCOybD>Y2ABx zc>g8ZyQG#^Yp`E2lrYRbXdAv~-dm|wNco02^V5Kc{_uV+cB4Wg93bN5qZ8LpVAegj z2$A_a&;EZ5(Z$ZNmo<>h#vsMn>0$GUsSbO|8DJr(a6h4s0?!l}AE%Jnwb50vmc}td zu8unZx)YVUGe6z9`p_>_1AJ(j zM14SKi^Tzfzw_mdYSNDne(D*k2>-`1Fp?E4bSo`_+up)6Yi}J7;x8Z4;3?ZXlkp~d zEIy}yh)0ibwE(tD%mS&wLSL>vn54#M1+bk7E4Sn+(J0WM(z2s*Lq+XXsv~_i&d(dLDU|6hRXM^{$oISy|5QYdqKj zju5~yz#Xi7iT+Q-nt%7=DD`jq;g>P)3>bfe0FMM}vRID$xU<;vDEbmtSexKN))*E#vSz?YZUcFHKK?s)APSj^s6p z;2&^F(Qye$7)T0mT|N%ux*ateJz_Yvw)MW^tWwf6F}-DjnYB#`k1ijkGM$(n_s8GO z-#-hU9&+=^dyJ1(PDT3N=)I2y&x@T<3+*wQT6vJ=e<%t%{@p=rb^qzXjYIq|{y5yn z-+6=ZSsSg9^A{)oxTo3hClrN;dC1|YM!|y5sKSIBk#!$WGaLZkTFQaNIM89Pk^fho z`+qlxE#iBwbDqOG2hamh>trSa6eq4T&_PG)@fY4+(s(YeCW-BOlMh+jty1wfe_>Un zGuFwR8*b+&@nI*PVnc?i3di*als7947ygr^V7|t4Y~K;1f+PzX03qvxc>ac-gNmdI3*ph zIDOi1dxp{C!t=)o$o!+pW$}14TAc{AH(rPn{s#IkBw;42X9{144L-d6<}`4Fl591; zr1|09$LCS1=pzjDLVucX+c^BLdu}t%hn`eOIkHQpbtC5_1*N6x@iqJ`in@l^Yn->C z1AT-U_%4zH&h4$h?LmdJ*TOrHBJT5PqZm@tSfJ{3DVwuvrCX=gMic*VBAO=T>+)%> z)iDqu4FCWvrwds9$6bYkd75`ml&-V{OtMFRpiZzYs&C6X0OzZG76nw_*0}VS^67Hq zX?aRAetFI?1m0cxTiW5|In7Y8eET<|m-y>9G>>Y7Sa01YYLPCJF8?VJ2fX|@M>X4} zTtU_dbe%8I!EE^>^?U)s19=jD&@^Nmoj>Y~`)IYpprzG--!t2Bo$Jd&?@qR|Oj;6z zI7}%B-q;Vi=GI)ttM_`He$Xe{%;-|)X3?6T+vS;;){I5sE@>xeRBlq@n8sg!(jP{! zrQ@+8$Bd7P-F9=s3st+r`Y)Y;U;m2)@!$E#)^+p5Z%_8!%g5JL$To$RExPT^$v%t4gwn!*JkzZzT}UU%r$+ z*nLQx5o}8xEy=4QqA+Lg&vUAj?$9AxU%VR-daY0MH)%1XYK!Ur zHl-h>#V|AP|Cn@T6*%FER}b5=d9Opca%_gmd(Ge9M0qc*NWXR0s=eiQmfon zM>^N{1iKi$_J@dTF2{G5&r%FJ^8Z6&(LZa9`aQ8He1P%(2=ymDkoL|BP~UoX0ij3cM<}Q3}9yq1`9k2O=-%Dgge)1K@Lyr;Wgm*O^PK|IpkF^X8Drh|Dd%OT)Xai zk`MJX8OeC|$3YuA&()R^u}7R?}0xSV-wP?9>hVVJ6u3tj~Dvg#I(?kH39z zvhUw%rII0X92HcCNo99PzIRqHgn`N zZt=LrSU?XP@vtOd+IUMqpDgo>d>0*LMVxqVvn?>x`Ax8`!JI)>!%c_R{Md}Sd7Uku zoyoR>zTobea4wBpTAb6*%{NR`r$~ZwLXsQ`7ccd?fFRT{jCeT|5Q}gAN>L ziBvD@cO$3(V8Vhj?IZKFb@zk~(e;A;yIyLBeYiO6Ml+>UPZQM2O?uP~{t-c$BzwdZ zy#Vr$L?V)e$-Y?(4mHSO06##$zbWaqFQm(>XpDF@4Mi{nEx~nIEethCYoo$oKVKU{ zHR1N->%_iw&hvP}JBNK;fbQA`qiH?O;^BT+N&4tPS6zq+q8ng7woW2ex6hCm_;7_N zg2VH(r-J0tSEy2QA)t6nVf$TU*87`24W70cf>y|+(yH+NEGI7Xa^+x#uhDJ$DHa#e zoJU3*ubmgF8qK>~brpNV!M9u4R$V4zfydys>W^*Cwe3_6ZiZl&#hz;=O^0Lwj*Lx2 z{Tcvjk+L`zGsy-Up{f>p;4w9dpF`H%-b7G<5p;*+dVnFSkup?LGD62}y)&Y=7va$_ zhKnzpMvXOum(cVypKk3LQj|#tINlb=o0{2&vJDK8sSDGulW+<%=moW4T38#;#iO*D z4uucw>F#VYC?C2gmv%-$iCrK6kO*bCX4yID;?M+J0nf`;sH&FN&TFQ-`f&8aFiw}+ z7QO79AbVmHt=q{!R;PK&hVz3A;SCxn58xGX3T`B2W(=O77k~Jymt6+0B}; zE1#j-jG^c+NFt-a*LS^UW9m7!8Tu@gARS30_p2RS`f8mGo%U*-L;9f5EoHQay|Vr8 z`siByg0Ghb($6qssrS6;2x zU$!t4J;orz?NQTTUqTHcWiZDrZ|jRVuUG~^6o2{GO}(wDwZ18X%HmjfO-op&KXDXAedssh0b9Ze#9TbRR;#Hd6{tCKEfT;rN;2y z)$dC}5&9`JBGe*<2=pLi zzw)$!Zp42neCI_{R9FMj_mpojr!SrEev|?lALAAG|eH%!Y^`XsWdw*}92@b?Dm< z^(0_*Xx8*3A~`V6S19;Lf3}vT3%x8)Uo}RdmrspcpOxyl^Yai>Ufq+!M6p>~00woP(8%hd~?PqGczRSr}kKm2Pd z!`P%%P9Dcb4*JvYmn(0gSC4D8xA~${(#RJ=$iQD5wi8|Fqyhu0Q0j9X#FzWe#_m-m z$QL9#RB6h-O;k04)7R`2<`PD9#i0s&Nqev@Q znXoT5`70l$A|qkLP1?T9G2ar_oKFxA3*7S-3l`tPbFGcVD-Q#x2xG)^>W-dr%{$I_~hUH%p^&RGn{_J+j?y9wG{yAqgQ#j&{|a~D-{gIbWoYn>bfeG zXi;lMv>|etPgC<@u$(Qd7m%Vp?m-&L^TIz+5&Ic6I<`{$It z-Sh6?>>7-o(cYz$Jlk_2PuWUw^`3(pWHOsXCF2{F=(Ws=T=yNVa`Ih0DNWVI7xEfD z6yNa`y9Wvon5*ZTu{u@Z(vWy%)hKkyEIg!7ibHTO>@GRpA63u>FUcSdm`tUPESN5;JdlOH%CTzJTcXP2(tnbN62`g0;FE&!5aE?;3R@qF>1 z;SZNiBHu1e#87;jM4r7|R=}w1N+s)LGC_#tlbJ$NYVgPD6WB6+_*RlaE9JS*A*$@= z8gS;SJFjju2H;cK4B8>pLL0N<(k?xlJZXbGOXyX8jn~-MN7J@cLa#dO7iScD<*r;S zL&!W5b1cP|3=+WQq0wbS;miiAmexJfaTu}V!x>cX>LeR7oVR?e3Xh4u&niq)xhF2> zR5r#`p;V6_Wp##piVwx9EQ=Vx}v^VI~wPQs4?DQ zgp(r+J9Smspmxo0v0RhrxMGa%Q^wg zPXsgJKLH|}XFE?EREFs&6KJq{Z)KxI4nH36vFbTh1GaS0yD?_o zFCauCZR7+j&4yqYX00gFg`Q5j7(*k1R@92u*?8xfokA<7pTj>kE3-Q_JGb9`jU*{c zvbac+Bm~|T@4KXq7OacdSgnPN*LP+!0Gxd+4C4s;c{(a6xP?zpxS`5AW8=iu6*uJ~ zAd!&9iW%eyQ^I{_?F-rhV%fq7aJ>ipMjBGpn*DPQfPvUv-Hy9Tpz6*w31r@Y5vs@^ zKFZec_RHH2=d)?A<-Y35( zYW-LPw-&{%@k;>fP{XZx(4l1_@C%0GN`8I2Wis)1RfKGAXVzGy(QhppKP{O$YBwNQ zV?E)jZ2CJJny@q$N12wGRQOb?-o=y!1MYW~OuAtugZKECZvz)TTE}3|n%2~65q<@s zob!s_6Y|FO^67s8ktzr}P+0JcsTC%^D8ey1|7PFunIDCfMi^b@QKd8erOWwQ8*pEkM$yy-kXY>yD|~}z=Upa3v5WCH zKVxl%kHwPp1Ql<8#H2xEuG0{u_IhXiDxRw@O2UW&JDOAxY32v>es`q(M-*!vhuZ|6 zbysBRbq#`B)g!~5dEzx-35`)pl|v>NSY{gOlTCwPHYi*4@>sWQeg?{N)Ro<{myfz9 zTFvs>zfjss&MLZsHt%H6Vq|pX;QgDWs?Efny-eqjM)ap$Kj<8`mtpaL@FZM0p|W^h zoMa-)6JEVlke83FP_(R3b1qDX!uyW$5f)a2rXi1Ct#$tWTmKhoQLf>xQ{1O4<#s!j zr6FF=vrCAyCa?Fa${&B$BB9692UuD)$m6vN(hyV(SU3su69;S6gAWGV`NDyB5{Ah+Q+ z6p?&4zW?qQSN93}Qj)7LdZ}MM^Z4N{MME~7RYPPkLxdfwe7tEYxh!gT=$mygReK%^ z(1-7Ru_xVkE_?YaVTM%h2?ONQkyIwxO$CTHGs(LN>}0(z~LmN<}E>-Cb-_K1b;L^mB%HrD7nJ8YkNQoIxn^RGlfF$HV zBADWvPMJi-CevYCAsdUJ4KO3S)IL^G%xI>K1`Ly_qY2o;j-bx&NC!TO15pyCilZY&KONVSGzqY^lzOiz7h$bOEAgWq=y+eu*eB79 zYvgL=%g^|`6`3lTL-M|EcN;UB<Y|yO{zFG^5hsbe`TY5ar6XrL?H#Q;tJQ9-k7WshMc`OKD%!1bLuxIGXI@CrGQbm^>BaDgF+3~^j zlGq872?;pfE!#Ka@HSzC1$(?^1%9XU&)~c9{?PlmmD!bBi za4x4Mngamz_ZMa_^rCk&;h4lVe`6X&c7^STs z*s%kY1?s6RChE?WpMn2W3?3qzUc$afoVwPz>gO6nckY)AlW+i4y1L9MwK8DQeDz}l zf;5B69b+l7C=F%y1s&sC1c$0C92vT=?OY8G4vo}iDzHyXlTHA=uF#l#%OhF+so#*Z zmQ~Lfs$p?rQzj6OE`KabPN@ZLrgX`~DM~82p?BStTh>x9);$kKXY07y)s1Q35I9SB z5*7bME;Jk-<*a&RK@xEqBd)Dc`m+pp5L01_=^h3dTNuwG1~*-y{Y>fA5IBQz=q#V- z#|6MS!*eUPh*t%Bu5$4w)6EQODYbroetJb6rTo)jf7LjbD4OOLm2<(iSxya-#| z!uEF1yvQB50xWt2`?O797JUQJ+{oFz9K~!@VaxWLZ$4@J7F0n4@&ZBX2F%%x=7p}P zkeZTBCYZMe7`Tz;Q@RB*&;3=W_Z|JTc*-t?hMl|0l5jfE%q092Vr;!z2W%Z@fIU1@?=`pYQJ96}9C&BC%OP35%fY>ST!&O-R_TO& zZsYE{@2M-<9#<|otUz1}*($?4E6sPS>?+#${Ln4jdUH*Pbf(K&fjmn2Q+c3GL znUe!N6Z=_5!-A;0lsKe%7`-ui&>XNi>qD*3-Y{0(B^qXZ;U)oyor<1iIiLGww#z!$ z6&Xl`ieA;tg?xB8vurIRl!D4Q6_;44e#!#Zbg8ME}G$_AZ6J|{^3bXyp4HQOU9ok zc(S|SitKz{QdPQl3W>Gf2U(J1*c00JUw!-aIa-6kQdFvIx$*tP*PT+FGy@emR}D)G zs9}b=Iu@(Ks2K4AsJq7${?`D4_neBq8;oWLVqoA*0uJdc-CDLk=eredo=B?o#OR&-WK(!zLH@1 zmTenxdU2f8$(FFfSDJC(!hCsE3ne7g&w-xX2v#Sl@n#K~n+CJ;G?KSfq~BE3$0L_s zeKOiKx$DRgM3Ucx(V=6OAuO)@ki1o$-nk_$nuZEMt4(G2Q3m?D2EZ}S^jE-B{^AJ) zE<1!C>rY6+JHpC(_b zV-?xB>v%@OAb7}OqTr`uiSNZk^Fe5*P1}AhYOK!4x7oG1Vtf+J-O8%zG0ksxA|>Ay zw-9Q0|52>LvZtsj&z1P2MlCom>-~wsxip(;Lo|6PRMfZ>)L=Az0I?xK1=57QRs;LF0Y?Wv@px zQNwDi_o0#f}IfVP;M!In!I`vY5V=klcBER_?t7Vl5~ ztmvGT{}Ulbi$!w0cd z$FpOFVPJX~CAQgJX@KqI_Dy+3n*83);rB}Nlbf#G%VOVRnaD8hEO%b<*a+Csh4#{8 zS%uAZOexP%nw3+d_b~S_S4fsuNbcpxfND6TX6K?ozwpt2F(Y1MnT<{@-U)q6w9OR( zS%z9kTEmrQMT4d@%q9lX1`AOJ%CJPIbx?On{qB%fgQBfB3{S*!<_cN{k(G zUixF`->~sF2?85YlR|krx$~++FH~XX9Wm}D#Rz8&3FV#YZmrz&NEpZYM13r(<1pA_yi8Kj?4p;$xjDgTzMoI8D930#c~tgqD@f6wcE&#gYSGW>WJY|DyE!QWhl!{2z@aB> z+m>`z*yO58-&GxMz)LPvlf)^ocXc|la`GaYEpU>Hi^G;ZB}L36ER%Y_X0?W@8hHi= zM!B?0o6Ps1==Z5yvlhFWm)T+bf;hY-h*e2VceKgkqf5pOfvWan)*>3cYL-$XP7+o{u){H3ctKG zEHKvB|GnFbd7_CE#$0u4_Z~ufnCcNdyTRvqMgDo^!J=~3*WhVbnbiOnxfWCfB>}&l z)(+X#-PaTa83Kljt*%V7ZkNhaeNaN&R*eD~f%ji`QPoo#l82upjJn!ii2PpYp094A zYK{Y)-b;A!`Z<9+4Eqml2We{)qXfMqZy61GUZ{SV8L4mB7jL;^NCw0#^`|4K*c3Xm z_ToE_1V@|(_l${a_<);9+#|>fuaeVkyzZeZjrd^DWc(6rysd(S7*nzFN8i|6Y_O;g zqhumGEOG7GeP>b0;Nuw{V4Dxj))*#mB^*VaGfQLqZ1PpsI*_4}#G{EP1Uh!-=aQW- zt99%~X69$dpKwDHoPHA5Nc5$0$ai+Qn_nb1-kfse46c%0t(;+0&tx+XiRxQho2jp5 z+XzvdI0cr&C)L#Rg#el%0^hK?EV&rn%&hFE zr2Pa{v9#iO0jvW?60&4Phu4B?H6LSgiLY3k1C86H%1m>A?AKfwyN1nv97mJY-Fm~6 zKDaHbi=?hG%JMmsK}|WGsjfTiCpqd5IY>uc(&Dbvp*i9~v+gecO3^V#odtZuiC|65 z#0;8l`IwySkgYA%$GVQg7sFScjX2wvJ~%b}q`eNl=Y-1NHrZ;NjFd*loVeI8p|ORF zD2rd~a;;PM$-B7-mKko*5cX^_9ahJlB-l{ZI7!3|oHOPwArLIoq%DNc!ZP&F^G=S# zm8k~|uVv{WaC?S!(jk)hu8?x0sURQB9;E;3|8h7r-w{ETM)e`9!smJQzO0jP)>em! zdODKz_tzLxc9Qh*KNE~<;TQ^YODYHkMyw(W5=5sXGd!keR{dLpUv=N8u!hP6PM&+^ zDc3D^5EH~-S$ZkwnbE7_&Wd_X7tN#_?nM+bvkM;q^W!qN3T=nbV!)Ub;>HFs<9l{P z*abZsoXp1JgwgshBV@lhhn8c{AsVvVs7Lc?Oz--6CyW6#{f8}rtA`~{jG)TplsS;a zQVxDCrHWVn)XdbEaZ2gaH2i@v8{L>LZGl`a_xzAtc(h?K42+8eV=vd$U7z>{1}aS>9Gy>cz2zYZ z01)M$*5`ci;`1#Unc!qDu9>mi8PGc9pcK8KK@d~#Sl7HkJTRF_Mi#OkvG*aT&pFX! zIogEKuNpEWwy3XMTW-{n-`~kug(*2ESo|2D*{&J6eaSW$-4{bETA_jV;D*W>^@WpD zyAozck#9S0+xr&u=B46Z37K5_7Uf^z`ZC64k`GQw2Fv92L*7byCx=e5h263YnA3`n zqZ8OrD)7g{L=D_MR@%J0Q>_|C`Mus{QY9hL*W=)tat2C`l@&CKl{BSG zQgITg?W<^*sxQ`ypy>LNCkC~yEQBz^luaXB64hn&qOy#8zes^1m$`a@2!q!1*@w7h zykbh)1(e1%rljS=7vMI<`V4qVH-rp_^|uahba3hV7VsM(9nO;n@TwR7hK3FwSjEHnoW|x50u+m z2u$AtHG$hdT?Y38lcLG#B@VD!4sn+FLd%MnDd<0fP16PphN#3gLilS7)NX9G@PlEE z6?T{9&ktz?%B!MQeM>@zX}Yo;on?h<&{2y?2#Fvh(%S;D#tOQo44%|P(uB&8H!f2x z80KEFp|3XQ+IZrbhye5*-NjD##yPs^{zR78e38*s`f7wFV3IK~;?_P+@%iEPxuV`U zx2L=+&x;1EnDV?%3Y@UsLvjp_<=51b`@6nnMMW>maXB^SN*zwWp2Xm;oTJ&IV4NHy z1Wp{MHr3}BzRIQf(y0HsDaaT+_bTyQ3vW8GjJWtSPX<7du>ZofCaHA5?WQ*fba!&^j3LC(k#D4M9!crOhTa zlU@!dI_%VzD>|00D~EXLoFY<-H6Rw!T2YZ$wY}3Qior-@$xyb?xNxXB5{hNoG;3sX z62H#XB}nKo&x1&}6?8W2XV-wCIU1;9KQ(liyCb)ys?d;S1>8<4Y!tq;*Q|)fyjg+x zTE>J9bktvd4sNiZMaEgi?+J~ue(4z=-}*y*f?s4LCub{h=4RT~;Hk zc^RhPPSJWnFT8JJo%fdCZGzTa00X+B=WUv|&&W8NGgq~Zi~%h=`|xq6D^|tyw?*CX zUOkf`#{9HsI_b~wirNu(*fKvuON4Xc3cNgE&@kmJ1O511(29bD0SHFXJt!R0eCk?RY5KgXneNXAb z1)*J`ML`OEl3SCwj@XPHLfEmk3`!b2>jp#I?B~6_B<$7o|mjpigUG+who0oYz=CXN7v zvUO#USgBFo4;s&2RC$C1sq%xx?|yX8-ua5KS5YYeY|A4< zC3!?X_o_GXTNuOp0I+Qt$M?me^Gp1z)`6qhz~t2`bdFvK)y-24l8dm}^WXc0>i%Di z5|7u=N9QJ>ogHC=(CxYP(5AmcTRI=i_8S!g3f0LN`u|g@j@Bh@K_5mto(}pV^aWdP zs4L5U%Tm?0=5@SQc>orB7a?PY#{3Nt9Bd?;)^|*_Z2p`9y5=5E&;kYZt3<7^aicWSs_s{2 zc0kfom)d{cLPYL&^i&^gIKLp?v((%ceI{76x0A=+79NtJbIf$}fYCfn`ujPC@qOn3r{nsh!EDf2%;_dRw2 zD%;Dn+x=rjQ7mf)%(e}6ZdVtfe2_;)mnDv@xQei%OT#M}FpIv6du;g;+0}Z>KWmdF z#k(ikIp|y=9*IB7QO&JjeIFIbOC##M^P#aY%=|y3y{0QA>18@v1-%vlKCZtifa};qRza{j&n_ww6VXd-j2lrPmC4tVAutXOSgt%};*SI`FaEWRJE3 z1-EY(l}(4E$Mo!WC7;hB%oJAvg0338&}(9!J8y3WL023Q)}BZ#ZTO_wkJtuY9$zPd zR=>wQN(-=v)A^z{nbZ(>1WOXZdJd_#m*4mk3NHa z_8b9_RF8ABt=;_`%y|-%4pBrEE zO{Mz128on_)R(T&zx2@w`KBd{mXOv646c1r(g}=LAMfh63)p3t&1}Tbv>!VdG|DGD z{jM^6W_>yBF>h;pz5`COxH4tLS4~9juLRiNn%v=feZAbOkq!X=^pM=kRYT*BpPl>a z;0T?6w>UXRAb+gim#Jhr?&$Dzie{iE}%O3mtx zcN(daEwMU(w1-51&c{0xrb7lxY3j*{K|d&_cL>3<`@5nWCN)%EUtyo8G4ZZ*BK5N! zTKwY|Km?2vk+gus+0a#SEHFphIxp zT;5jnbFL<#?FL(cY25|uu<6oW#wrp$>0_5cq2*d~vk37B2V1vu%l76fH=lG4Q5jq2 z{lSUSwU^Ah_s*PESpa;97B?7Ny|JMG?=n9%KXqfh+EN@p{sY40B^;f=2 zoHR5SK5Rjn-Q3l)u~l-pNaZ*0lNflqWi8&`5J?m{!oFeVO+WhaFHhFjX)b$iJr9%h zE2X87Z^kY?gs`Lq1Ad3LoB})0S2}KHZYB#Z5j?BBxbMuRI(a_nf$wt4@7Ru2T5BIW zYp4Mk&);0WG5?*YsVVutM7Yv%%@sN9 zsJgzdnvR!rk}#_++sAdjb4S^ZAu;}T(YJ#a+E@pq<3Flaq}V|u#yE?a+*Xd0>>HYR zK>bcE@A2dLwOLn+ASnR2=^maqO(yWTx2V8gW#@A58$szMGlc4CxqlY$Z0-frpX!|} zblwDdl3tAbqVXW#Xd*zPD}Cd!G=N=dFt1*ISK@MOmsoRi^do+-wD_9PBI7UU73|Su zd+J)k2Ajk!{o$P!PjQE@;*eJ#k;E%}YKkA}sB$t6%N(cG>Xq29zUFQ6e^Bd19lFkWz%}J(;%KHeugEfO>JHMqKHxuE^2%odB&oK>(&i?bu?X;!U!wPF1Xn5$30FU>!q)Og@8(%?5Hxx0;j#x|e_;q~0 zlqtQI>8P-3;SRW~TwW9)xr-N8L@|KXtO=?6W#&h00204+!ZB>voOL>BoqN+zUF%j= zJ8S5od#-tpepD*sDX^Ja&-G36yh{4iD53Zme)abBdYyB4x3v%Z}YH+P+RhV+PovY>{F*f7dn# zPq1u!Z*)1jHQxRLazSr>GgWtjeQ&?p#LtaktnKt&k)Ubx%VaI`DixFFDo)S!?)jiF zD;vf76Ys|z^UaIjXncPBy#HTYm$VkKx*^5WW#u%9Y(>^Uj=RpkAfZSqzB;@4jo{hK z(s%HWSLLdJ;=e>13RGz9oUd%ak)!S?Lc4t{*E3h~%Lf;e%2Okw%WQm;JV(HZm>+sD z9(hZDjfLm}zr$UN>3I_1VQm-)4f&h2Y~ZXR>}pM$@>~$Ajin#v$KV<<$6If1=<1F) z{~v2#9Tw%fwJ(ZvNJ=9jCEX1Q(gGqaB{_5rJ;YX0Ql(o$x?^aNmK*`eAtZ+$dVnE* zfcxz2Ilu3G---PX*Ie&#z4JWlse9dPJ@*=)j^>(j4&(r6^Ga?IhNpC z&iki-$0_COOab))E(~V;0!=u+cbF}foSmz%8f*w@)C`{qxH8km&$T2N!-~%DU+%y7 zZ>r@Mh{RuBU+G5S%{P5t`X`#%)Fi%EK-%;UcLA%lroUv!%)=QnkJQ*`#Ht$>cwECb#TBf8N?7cbiQ}ixlzkDym%FletoCA zn#iD#tKwC0zc<5*SC)m-eq|^X%!raY4LKK_2^N07`@>B33lgk@t zYk_^<_{B&Nmf9l>6BE@qnXAD#+jki|y8B09>OQ|1QQPFWR zg!p8oM+XLrio9c4)*~u-c^d`LmaCc<6U^^UMh~_rFP@mR3Dxzru-J$P*L!K^+&65x zI(J+rY1D+YQ&J}YIuizq!zaE8hl~~HKi<`4D9=Q0my*tLTOv!}<13@(c?ryUuJ~$u z+9Z{Z1no&&cAeb92P~@}K>YvKq|oX!lADW*_fF~lNcJ70p(aAXKt;h3OG&x%R5GM) zA4aFzjhF)#ElOas@V|&pfE?U-ige76eVP6o3}=OF$>vp8e2xc7AtK-MEyEUaf1r21 z13A}4Ha@${`W-9u`eNyv(%wfLl~)w^3{fqq_FotQE^w2z1Gnx;`OLtC<~pg-5=^3S z^el9H1)0mfpelt6eKgiAZ+{OIKGgw^hHjwg3z|Cw34^4=6V3bM`?0#9)x`(l;raaS z!kNiky|ATe^DgmI_r)y@N`b(9ZLmt$jrcAQ^Rb1J+E&VQcK&Y zQ!pVaUXX)vr);e8ztnC2_2X@(YXd#tDlYhAW6qkXn4}{M$=un!ceIb;FJl)d&|&m4 zV8Y}2uJ%gYGqo)#R9JuffeL&&k)s)!gEEiu$+fr5)bLF7e_zxSLP0N#5W=B`)21Qh zc=F|yy6gMwabLMRu}u52b+l8sDynhr*xHUy9W8?$Y@7lxSHR#hBE~p9u}SEzP1R}^ zb!bQjaCxeKFbS&Q-{3uNlQmS6z*n$wvguas-Tl*ZS6^qFK;Jd8FY&c z+8{dmTHc9b(-6Hdu@fYd;J2N7q+tQ0ViomEE1?Jkn%D>hmFRH4;Y1k59S!18_FE&O zugRFPrQABFTCcfcUz2Z#Ms&1E$6tw~PYIG8h6DGS**5NYr~Z#nv7q>dgSu6rL(TIC z*D%X5ll9=9zwtd^1mm2+qp(j8R^OT|UTc><4YSh%6S**|677vYfBZT9BTiKL7-Vfu z=P!`+ym~a+-DG_}jcB}F;7{HJD)oJaOxgGj(sge-_kv5Sp3@p8z}euOo;QeN`b`2! z;hz*mq}sip)>~MYhHb)fA#P=bA$Om;JMCU*JMuh3XSb9g4udcIGumCMMCHhj78wF3 zHcStT! zas|oH9@$b_5s+Zwnv7iSYFZK_SV7{G=1FEmTd+_(h+$zl!`i+t1ZKw!QBhU$v52Xn4E{6{a%K zPT_vbIc`q~b+SUr#lp_7rrmP!JT}l2r)~6neUaK9e64fRA^4m-pGJA#b?PU>m0P*T z@o!Lof6^_Dyw|32@?oW9yubT~?%bTh$f{jjVhnv_+vk2ocvr0Wv{Ki*Dy%%Bp zc+cL#mhMm{+c33+;Bh>C0)JI|e8U(2TPJK={f*ar+ThVe#qfAZDA2$jNe`Ydju4NV zSBaGFCL(py;!kH4%`v2$upuo0pO!S6;LN4Wkj$S@7IE3kKy1g*v&zzaxddCkxkcqd z;AGhstV_l3qMmbGl}>oa6Zax>iUd7GS?B(g&-=%AN$}rrak#JeiF$vL8oHLXW5!8$ z6YmmhGYgxNwUSAEFEiA2!MQ3>e3R~Gzr{P*m#WKsT8YTUuen!{t+|K=$w!=TcvZ32GD~iJ@?chW+ zpNFEJA)}vE8<22)n3@47)XkQSl`}c}js+HK?1H9_^R)_h*1Q#vyRv z>I^`~;qE42IRY#Bv`9yiSm>CVXuq^gYc$?OL>}qeL+r}G3=hgCOmS47Pr22VMnT-p zc*{ql+?cfv?)8DR6PxUe;S?GrOcIpJb7M=zbtQ0n_-s1&@sUx+sW;IP#DAfNa@x6fU40vcq`!>$47^OBaU%Gya(x@bQoeJDn7K}Rw1liD zZL=0VFwvs2E*#3|n+k15J(#9OteZ_Fab#1rrU-OV`pKd%-?u-eey`c}GC7=y^8?!* z6q5H67<53VX1=QEPFS5!?StVFIUABUp_ zXC1=l3>H=6wigd?zZJVxrIPhcjOp^f=l>>MaWbyz0^~O+HLW7SJm@Y14-Q!jT<5cO3v&(-JW!-u1>9Mi|T7V3K^{| z{NUqe56E^$G+a$D6B~F$U9)m*12p&09mn@v`Rh_8PP(yJfvt;&@SnP%Kzv^YuiFr_wYm_{r7lVjW*gbhhEVA%J%Ojyt_c4* zNk#1k`61^j7Y2AIe@*={f+O|%mASDR#v9;pGM8)C zkFnV}RNy{>xX*F%aqMhq0MU!h zR|lhb@gWim)o%2aYi$<6vHK+mS<~0$moJSVmB{tQ$TvopSTgQ}l=TUDB{>%&zOCMk zNfCHyN1>|!qH}-saoK18#$h4>RarLt!uz>l{N(+9P^=K5g-v0xFL1I**-l6IRqvhf zJ&i87J1mr|YBH6$c7?rAo?hJgCIZOtP5-w6$1f*B$<>K~^o1Q6h`kOGj+8I2Y50D% za_PEpY@XXPcIGSul$TO-S8%uA(gPt+Q=mxE^mG$r8zoUIYhYinyXeJa^-!r>ZG`;2 zuYVefH11`bx?_9qD`-D z{{t7vD~eZ`gg@z)`bU-;xX&nH2l1;Tv*SH21Ss>WD8=d&>sL^C!U-qCciX)LzCdHj z=J@1oYB8aaLwN@lu!y^o6;psjHQ}`B4&&GN(E2j!#4YyCDJ*(XBSu5`)-hmw(6_4n zFdSuJYu3P8wP&j*YxuAPA`6@xy?kvSl2%Fsm+&+FcJQ}jc27<4+MbKWSG(Z<3h(}1 zy52$L#y7Z2Vx2bmCkXl5{B-|8xI);a+NNbm@N9vpBL}hMTpV7i{4KBiUaznZA$4jL zhv5g2+H@2?mHaSBPs=~&qaRbr!4`n&(U;c|$VeQ_BjeZ!uV4nP1mg&W+K;c*cX3Uj zeQlm$EV3l(QPrE()Prt(2EMZR%@YlZ?LMUQc>cqO;DOU0d->bgKpz)d*9OpKmYS!r0((`Orvo0^vs)QUq{}}(J`?F@Dx2xJ&)e$GfTC2oGIl(8z`uH|( zIOBHyvcS3v`zcEKQ`EyIiTB!YHFSs8Hn~Jx6`9ra_Ll!z2Ju&gNHVF*X++g!r~iPh zUBogNp-D4dZC6|ss|nr_t=kfr<%$ADsIvR`Bo;5Yu0h7BA=BXt4(l)v9BB}^|KrB2 z!Mwxlv0x4-Vnisp_FZ~q%}STkVJ*`85IK0=<)p6#S*m~Qa*dA&80B72#sh1CU5vE1 z=dg_1cOO5JCwi9MAXbN*VIiL+D7Upa(z?u-29K;=cp;g1V@eBc`FHC_nJX_neLDXN z@`B&}9m`7kJfG1&E?N_ zV#iHnJPWTh=$ttg)=DAq#nay%c*;OU9=&Js zu;Ztui=zXaAN;e>a5(Ze(*D6~{Ljykip5QR#57z3zJSSFr1r3NXz-(>?~^y|S`)@r zqL@eQsyYESKg}e}vjnaw7v+UE6qmwX$O0i(-aC##^~0dj(wWak{nKeecAM8pPVb6$ z<$#NhM;?bKl>W^(6p;IKZYvsteY?{av*YGIztvRkv7f?r6L0FkdS1j21pN=XrQyHp zmJZF8PE}RLCwk6SUQ*ZmC9wiZiJLRyHfCD>FTn2iq%tU1y;2?p7kiz|y(=Iwe67?C zVYfPPe>i-QB9SqQ+zcTT$1!+%TQM)#6*>xD4)K#*gsoVefSF2Tlyb|{C_gO zXE*gpadbip+x|We)0j9&HGasRqt#YTFKjJ1^wZn6pKg)q^GANp^mJ*9{=!1M_Oszs zDdD7Co_6{O5%Pa&jrK<70%tZZm@YYTbQVK!Xz(ddxSAKkvGHn60PbS;?5Yz%b^U{= ztk5+(ISUv~enc{Y*kYa+Y$KGz(PHvul~;ReVnpTWd$zMAo(+9vM( zaf!7Ym>H@0yg+XJR6v^9sL}5vIV9cYGv~iRI-aurjDq4e?bA~HahS~1PhR;#S1zKh zL8pEjaqAVN3OL3rzs~9E1w77Fwr1;?yMk23N30*+G0>SLQS(xH?*AjN^Pk{~p}ON~ zD*W&fsv?B(;t`>;EWDY2?U$^XUr{2R~>x}h8?sSIw# z{b>;aVT`sH_h=wL?s^4eV$V=?%AYB{M{N%h_0-pvzAP=(G@5i?N8&1W2u(f4+n@qv>n#2jt7&4U>L$+~ujl&) zRj+SrGqS^a{A8C}Fw^lsAeh@_G+ZH%zfuVbvJr*6I#m1WWoo^@R6H$Iv|TCyAzQr` zYGon_mDRSu7p*L6D4X#&fE=?=WwBm{OC%r;DPea!5=qjfu4duCtTq~TL$uwVl!%P` zWk1)t##uP&_L+zJZD!vfJW?z?Z*f8eX0Ic6^Xhqzl1b^tg!iAQ48|u5K13f!dF?o$ z|38So|Lem>GS*pltnXd`Um#anV*ao|?3TY3HDMfui&fN?N*o-=MC_(DmfokAV@Nq^ zLs$Y1DycWYGD@E@pFhznDz}`z24m4>>3&>-?Gry^1P50OR*#4_(PUV^{6xTq8NN|5 z`(vxfJM16G$4ghi8#27$0WSV8E7j^|rAnw6{>8f z>nS|lkfIj~Cz8lE4Npc8UPEMRLvW<0V z97+h-|6Xzp)Ix>5o5tn0Kp@*PTk&h4Mw&2r(p2YsINh@~K3$&I+YR&W3}%$z>CE=& zSZVkjt8oIB)q^h5;~oBrM67GN7jSX|?r!rjE6e?|W&KPmRCO3~zNtDyUzPdj+b7HG zw8G;0a4CiXxJddV z<}#Ug)#3_HtDe&2gO8WMq&kyLppw2v(?ojh{BDP#TPnq~|Oq|9B(Iuci>jW#b{?lW;(GHr@uR6Jwu z2E&azVn5thNH|<^8(sCU!wi~Vb*jF2_jEj6N`mj2s2E@un9IRl_R$ONt@SN_m%-JOiIE4(kM$~!S_KnovyJfxcpCmhtNZ1?8R zeErm^2I(7uOjiq7b3$lrsyk-uyV1gOVOeE@JVePbqs?Svs+<*TWMpgUCALh4LU`k$ zrk0VeaJ)NfVMQfmO%`uMr(1xFfJ7Z!^Nl^t>LE()b>c?TY_fzZ@wHvs8vjj%5Rt5F@X5K`K4 zSDtTxK*qF_+_nbswA{b749qBRv0##t#g@n!7Yj;@%F-5Z1P?9R?uI`dxsHGix99I@ ztvKik3=T4Cd0uMN7x(JToIX}&hC8$f(f-(abwc9ve?+AI$-_d2-W$1j6zpRsnvOqF zub0w|m+m|D#3q5^`CS7V`tZ!mRjHvckaeB-AwO1}8JfYj!CiD=VcO<1erLy*peKuB zZp;7I)uX>pMi&y+mOzO1TqmvpJ3<`GG>OMRY~?p0JjDRJR_coLiLvp0yu!DWjatXH zP+=>`kRRoV|1LC$i4saZLg~>{a(K-7MhcFAFGe`%Vf(zCwOom4zo(vZQ9>z-c zu7qi1G^);BS!u24|A^bIBX9U^6zr)m&h=jsEByOt84g8_GPDNiGxMepkbjq5vF)|NjDs({3A3G)3B zzr4xiyDlcCQh;{pmGJ&c8~6Jbqe^qYNyl|HvFX34npndP*H8I)m}lhgL#NlHVBhA& zk)cy2BYPIZ$oIEI^kR9nN`eB|fkGAah}*78pg)r635*B0>-pk+>y5L*xvB!BnQtH?bUejUajB*y-=Cvm-lc+PSn+MJt(#%FA*! zyOGBBCbDE=2Cng9`M${YBmtY#(idu$FG~9R$0mlgzI-2p_DJwjD);RNrrJGpxAE_0 z7idu->YbZySy1kP*8N-8-~K1o->Cj3&ynH5YVU8q*4VsvFVL9EZ~BdrkSNqNCh9Za z!|WGkrk`U1+hS|=Ssj8+7{ebLL3mpdOjo#;{bZ@8yKmL`jF?0I#W^|&26BLAkyPUg z#JDcp(&6tS7Px4#qEJN0GR@^o!tK4=Fzi4sc3p@22;z328M177#wiNxY;9V1q~u$r z&8T{J7T0)kMT8B0e_1Mk3_`-AX>ySznC zGU1iQ3uO|<{?u9%rdFcdc>JnY7+3gV11&UP_@x=RcT3+|^{br&z#YhDTjS++&#s(xH_}F_y@*Mg7+@2 zV9K!&tKFXgVsCBnYpdMy{`ghG?C%IS)VH_LXjD|Lyo49?KWu_FZId}fL3}`QL>lGA z*S{uX=JezyLxjM8P*Uy}>hrox8grzioTI;R8!@I{2Cf?2D>{Lu=*3qjIAL)b?C*2n zhw+vXr88&2j*fdoPv9SGS8gudn0HUst<+uC!8?g8`RJ8}9&`mO471<(MkHj@!6WLI4Q-~T zXEJO&M9?!PQ#u>|v#Me1&&)5YokLgKTTEkTO0*_5K+OdO;zpXIX{80$5N*wBSYg4` zzNY5ZNkPGpx2EPVU+`G=(&#i-Y@ zN%np(smyn+-CLzE z*Od=8GWG^14H6x<0I3wJR{z6aZGU(owclU`-l+yOKx# zjaPiQ`upPp@Ru4UPr=qXk?I;BGk@qCu`?4~N=Dku&DW1S_-d!$U&tO`;4)BGj9NCK z4v~Z~e$r-UG4^iVm-TSqX51L4)gQt+bZ6$|rm^jGSaG2}QJ$=TY<;o_m&9*2TiDL& z3U3A5i6Dx<0|!*;((J9z>eQZf)+Ilnzz`l0pr=uemxU80HVJwRb|eSwlFv<6DkZL2 zhqK#H#UO=J^8lIxCuM&tSVhNn!*muyt8BZx_ z-mIwmx2_J}*-~N9#@Fqw_bLhdRO7d2V>dNySdkiWczpwPg<*MV9Y%)R9J>-}F$0Z& z?Sn=>b{k{+;9+MqKh>HB_extw8xgcM@}h}3-4neD0f~}Cs=+0zL6tbtOV*=UAA2H5 zWk|$Aox%4es_==gcrtG}@xdj-PS6`wbE2#+k4A8DkB zmc8>!&pBffggzdeVI=A{0>U$m?N;1=%rh)Z>5Eahqbb2TTQ;3w^fOvtsQoS^Qf!@J zQH#xO(`x`bhKA%iKb;|>-4cOL7N1bScaf;sNKtzx2*ggXU~)wOp*&BC9#v1cX3%3^ z+g-LL;65F32j~d#FO9p_EUDn_(H|@1ehN^;SBaVyAf#p+G9a!u z*0g?m%kO=U>3#`%@-z}wXdYry+N0gqO1->q#*WV{Y{M=+I~w_8l zAfNYi^HcUH9^B#hgz@o3IC*gCqnD5BcPT9SDDJJ5KB+#?*z8edDecltJtcu4Qn z2(deACovg!2JV2R#_j>vGuhL~?cH+<*CREAjsDzlB+c3#gOQ8hBHg|W4Q=0B=GYN? z8~zcORWXjv@)q>y3*OP)vb{*(?DXu^s4@gii@oEyc=OzyLkhd0nQi&0CYkgB%SdNz z`F_VJhy^C@n<=;9Ov(vx@TlnIhUfvmUUQa_(*+7b@>7SnI0Hi(-fES!d&Bsi?tZfc zhWy;u*-`OR?9&r*pO|xRvDz9?m?(Esdu-nOZ(Nh-0dp-%_<7OWx82<;qvS%=567%6 z8xUlpwk*hfQ=WoK`f2{@NosmL{30*itU-vwG8rtyU3pqy{2-NH)zR4fG{q-%QTMr& zZ*m`?)wzX106oN5%;6kI71pc@^d)Zf&SXvxr&nS3|_sg6+H zJNrOmovr_+dPc0bu4TYHjCralzHZWqzD~-$!Bwmfq8|Eng}t*#My`BYSCO1!Gi`o^ zEi(6Yv3uFhM5QbF%+|_~m|`O|rr7?SHU+k+3(65nCSZvU}Q#f`ddkE{to%|`w`r=02J{zI74mnF&ildzLB7LQi@!~wADY4Ii zp_#sM5}&s>M={{i3;OG+4DPmC*%n7&ikY(ed_hOJ*~4e79i?^Qs>=znvHX>s<0<1w z>tblg_0%^NMdF~({G}szLF}f!z8H*0hc8+5%itfIv?5-KMsQ5H_jGzGG$~mg#|iO{ zNYF606gF}g8wrl|%S@N1Sjj%b(e1%bv8o5_?f5m2L+zT#apGl!T^m>XS0MIkIZ?W% z0ejdnb)O2JcQmH6>@+3@$l|N5#7yr?rX((zlUylWKMNSz7Y3IKbaO%iCtHkw7UjQTv8u~1hy8EqH2;ipgrHlDBq;v(J0aACgozrJe zYeX;0i>x?!bA5}SWBDCRI-G3|UhZ5HYwiSJ?r$5BoCsQ}(snxlFMLn@ZvGHS=)=uR zW<@Y@SLT3UTa+*KkNj53%3g)l+52gq)gey5X=oZ=V z;?1m}O`nB1*B-meJ$<8XN|E+a@{+-?-+7X>Nf3<|l5cWE0qB-N ze%A>2jx*;gi;F*tQA`#yVcjwIn3%!tVR*Ey+7Nv4X`^IHB4p~Q1KAQNKGpMFA2;)f z$Zfkt!~-c_y2N<~Oa+v)sL)eRWg3MGl~L?)V-%45Jf`300}wj?`&L?=c22QqDPOvH zy5}!II>t%V+e{ve-FEnTXNF&n3*Xv>!jg2U%!NL^bN-NOVy{$1PCATRmWC#X z>t1{Lihf2sr-Fsw-aHMH)nP861o~Jrbx?a(J@$fLAzIF`Zv+FLMM7W>FDIDFx&JcF z1~2NVn^w@BB^uIB7HN5_K`4H^v>{+>IWtT@u!j=y+ih)Adqr$H(4!b^_N0O$rJ_ND%0{q zD4MFT)kb`ERH&GOVq`9N1chx2vp+7)vYB=on0XscUHZz-DQ5mR#$FjP9@Cxaq#X?b z-@W45l836p!%H8wJ$v(0v8W{ZEz^B}z{igec+D8>u71RxA7k{9d_ctbd!3|q(wFNs zlllc|D=fRjCgj5sGxJBqLrC$(G$JvHy^$7InY8TBJ@hZdMwfqR^s5JfN3FtmsJ?Ob z%4pU5m=w>G*WgBCw<}H>{rta~{fHR2}~jXzYa7+xY!Nb{KakXq@9 zCOTp@-Y}^PAqH0107H438k^5vh4x)_{aM}Du|&TLq{S8yav4Q-hjOcn>40sTTb=e* z*!IsKkl%GVZz1dLu};s;xhy5{+|xYM_$nURPTm!XV z%r?GXKWDy~Hy;*RIzg@>Ss|T0>Sw35dFQ($2Hv#uKVLo_%9NH-ry{S#YmkV8&Zovv zF|*fEy|eKHHYX^P_UPa`yZDYakun3|kI>ZI^w{@+H$oBzJ2ajFW_Ip1@nfCR8yU2# zB{P(Bmn2@JJfFYAOW~VN`-zu3ao!>26V`W0z6thIUM)D+Tj9+ILF_c0E@x=0 z@;{iexjF$RIsztdoLij z?I`&~7l(=OB}b)%2zOq-mzNi$GXSwq(X`3=RCU-gR9??Z@!REAfU0a_n)ex75D^7S z{G{7~S<70nlU5&e_V&$xg~X)U-iFRF7dbEkZhuj@ZuTbmC*wF>T*K8_s9 z=k01HJa`mw-Pm`q*ox6WXUV?sb*4FTmZJwOl5+#m#PZV zl40`!zArc`?Y!qGe={l@^EW|MSPwmGxzGJ3{AvM45XC{rI0@K zf9q^BSbo>EUowTGxRJcB2T4 zzeK(r^E_MMqR@5k8Hik*e*>6)_1k9H=R+g98_WD-h)1wo3!iPGpF@H0sz5yVlb&hF z4k9|$y|Qn=Dn&EaTE1>N^4YiOM?OjEhWQs0d?O=r%RJD*GqZ6;(uqFkv2q99Q`L`E zxw#_gGw}vd9y$CCWi+inO*pf$_VO?~J5B1mLofDRJmcm`(P@4cLR>*S@bq2HV)H*hD37j{+Kkz4<@Xt!Yb)3#J zSYPaIJwadpA!Jj0`e15G`>}yN!4SK$ue#%JQJ={tPoY}DW%%HaWn1B|xoMi1Xx$cW zw+F;|pU;rRElc^LBR%SbT#N(Npa(-q{&62qlUw6ZW?r^_1rP0Wyb7OknNYRWH~&z0 z&VqUK(iaSVd*4QwH3hKr&<--NWZkMSG&U0p1E$iSw>3)c77YJp;p=DpDVNj-XDla* z99m}n1b7lH1IIa0Ph%=(wD#k9_xMB|eRgRXtakN=H(0XZqg?O2^PWcqOR6$_VN0qG zJD#Z{>5q~(+82d$ZJw4)jA-FkOC|<=CeQyUx$Aj9ovnC+=TnphS4B;wM7gBr`)zt& z{g@W`)jRmu2INW3tUg5*LC5R@3jqrCV4PJ`lJHII#isgZCa6G{x2UEK?`tdBf>l-B z0>IU`MAzS*=a;~Hj(9Xpfv+(cR7dw$Uc1+bJ_4)U7n4+{2CVXZ0q@PcX&JY~o4!L* zsjJnuby)kM-NIp$hHqxpgKuXRNj**-w3HS+IBv@OCAq*;X~iz#OES#Y(w@;luT&%7 z74r0G?yWa1Pu7FBh59GjFdgsh7cV~#bRtgp+Uo7Nkb-DVH6-iU5~Pc#0KA^g(Zy7yvhwn%CxpzKG|r zs-X}t!w>QoED+*rIBcR71AA`am~Xr_ zZ=H9zV4ihvE(MWP!i|3Uae;WcEW+URC3TVhLSzvZQ>|bI?ZMV1H8AfsVA3YRc!wzU zO@wA~954oE8~mu-jnBxS$cJN~a>yfK)-Tj|T4Ia=pm7>cmfaM$(>d+FB2>*E&oe8UQsNdf<E!%R~B4v}J+cMx99G(PI~%AI~4#6883+52Uc^%=X|O z6;#+O$}s7-&)a@n)QrRyVhWXQcsZ`a_#xai1QMt1vM^aFth5;3wBX;)_Zd*!8;DNY1=MNO z5DTb$m{cS>E;=GmRh&q(HW%bQEO4w0SXr}M_7@%$@wlL7-fXf4`c(VHV$Y zq4g0Jm_nj^`FxarJKo`@>;mev0=eE^oKWFk{KL%%LP0-&&O#GMiQd z*@mjs>UbX2?K+#j|+aSBmh8#{8>6$#Jw_9X& z!p`cpg5$NtA5!V|oap=aVl>8S zmUt(kFWwcP&sh z{pcbCEW+eP(q@L?)+^rcj!J)+x*zYbiO5E7v}giXFhKWv?++X%Y2LL+=YA-hwroy% zG6~?C_c-F(e|pltcdRUqzS&z82{=g{-DShSWA9!zT+;K95V7X)jcjCdBb8{5z+kp= zp4Ao`wnXgOusZVE)Xr0bhPPS!VASBLR~=t*H}7^k(=;f_u5vL^W7fRHSX(oS9F!lJ zR57LZI9c~r%c5HSgk?)Z!Iw=B*l(*e;!XNVe3gu^obRFR51_p~8IiO`yB7ku-vRLw zsxVmKzf{kfmmgnNv>nG9v~y=h z2fG9V(k{6zmBk~=kr&SKVfw_!%bh@dTZ>J@O}ajMny()29m3vDSX9 z*S{xJlQX*idHJ{kc6Y-9kw5eW5vqq(icqTn+2llty%~0IB!7Y;e30@{HQQ+~kza!)L(BFVDZEU)6GpALe>CvQ?(EWL zsg8|y$m?>P|3~y?`aSvu%>v*m!+>SMtTx8!(Ca42HN(_zydrcL3|}hTAC5IFE5;w! z$jo{rdlnuq)ZJ1B=66|*f;vA(Y?CG`6I9Ir8Emgj|(ftBiXlgnl zpW^AMkQ<_}+Y!xu7gn`zWA9$61>$cPKEoAXB=M*hpHVgZjNqdAOp@B_?6aYiVHt1c zicW()++s~p7;7H<0L-a1@=;fLRkhQMJRfgf7iq%J@@7=0SS5Vn_W1GUZ{>6*nheFK zqqw{4#x%jf3Fi;j3}eOd*Rxnf@N*1!I{>s7oy*}Ku89}R%MS$}4%jV?`|7M^c_fYF zH0ZP1iWJI}9&4Y6ZWw(dv2Ol!Up8uLE+l;L^>EFCc*=c=Q}5xX$E46c+Kkx4qX^D1d$Qq8F|mC>m$+GjuCSuih*zmznPJd z5k(yO5{<{MePGPxSSyg$T$Qau?g(h!RyPj${C?#ILI?N2Hyzt|Pp+$A(yBU%V^ETd zEmJO?T#vs7+=HMlG@at_PTb5@{5)J)Z*kkHJxx|C6~{8(05SUwt- z29dZ`Hfqt zEC$4xE8(RIdMOtgL`9s(N#xve==xa0>~L6*tgvCQ<%@~(%xj$N^nR{)I`)ktcnfSj zlSFBz5x<|~UTI*~c=^e|hm6-X$ye7HSQlo#I!tMtWFx8H@ z=L*>o&Lr>-ElEWOgbl{N^L#Dsabc@ev~6Nv7D!$t1yLIhX!6Q~8_#}s9GCJLJFbc5 z(pK&tE}0OZx4xtFYHm_N!ynz{uB_n*1DiE1K+}WN+_-u91YrR%4zt%*o`{xQ>=KIP zp2Pc!n6_ITjV%@uV$Cz;u&QTpSV!)2)}+E8 z`%THP(wP*`FOIU3ANF34CR#gFX!JwwNz9{e_LD-9#@Y@{o1t4l zR8H@C?74^ZaXYQ?cKTfk_sk_I`lU#~1)doTv36CC`sNu)lG^AMM`*mf?vzo()6Nka zL)#272l`p2bu`IJR8noc!$s>goApik4-L!p>EVh7dnNn3mCy{Pup^YP zM--X{4+klHNGBgAg9purF#~LgWSH_u-931uApO~mBR+;xpl9q84JWn@ z#p9;Rh4UHaI|c#;s~!rgdrqbUsMmGyn?i`qDv~?ud*>dj4LGY%Nq#>m@Q-)~_R$NOB_c23z6w#)#Pu zMa;-i_!?Jxu-&&R3D(4N8Q9|lU3^f1qy0>V-OkY6uztJLV|Guy$O1UsZrTNEQ}BZO z2&j9XWThaOiI2hJhgh*!*c`*T1WR6qxFxet<$`QW@gtk}YBQsvpIsUjng;4DpKTdx z{T2;4dcwm_U+2z1er-Jb$R44-Qm^lt57QK6jFVu80lm0FBu*>_f?eFqqi#aqL5vulHM<{ zGflr!W{51ZY2@y9nklL6vxlOpk&TP5@%3F|tQ8iE=E5t98JKC&#TCC3R!zqtr5EIV zUcBWG58*xN9^Tv5E7Zrv5`$R&IfWUAZ1Hg!Gq$%G+L3k5m*Av>n3y^5Dqq;nsWd|-qt~} z1~BefgywM}E+Kn2X-1uSeoYH1QtBhz`xs<2CNMbM=7iraKQ=mt0-6G3SLwJ{z zN|n>8^Tqb3jpL^S1iiAEE7=Iv_d&~t!lbIE8^4{0?24i9D8*YErCQ;v6{{zU51rC5 z>ZXV1sg9r4zg3)2wI-p!p9N}+V~a@w3)P7zR?Z5-&abf2x&6v3?b5StwXm|gE|G__ z2Wt`$ka|@>sl=x?#9;g5Q*XytS;1rJtxPz~P1RC90sP~dRy?eOA_WUFh>`j=@D$TR zQ3b$q6DiEG#3YSPPD1`__Nh$JikW4Ga~KXgt&U;(N&h#2c!tj>hN3IEbBRsPk}oX) zK^fcl*qjZ7T0?*j8FlhCqY?xFa~{4(=EgZ$jmhGHk9MOu70*PYYWX?y-ok<8?bQJe z@rH{DkP4Uw%p)>8w8Gp6DXWEA4L2!#);@Xt?Klf&I#vrMN6 znvz8T^vWS!kEuX=`q%*NF7yU~mU&!6thnhHF0dj+Av?s5T1(*)@Qtfz!Bwj~-gudg z5H5(|bF||(e9h8um^ma$F<#j?b6PZwQ8`IgDN$(WdAIAd2)s-}woy41r~SI9*BWW~ zhQPejebgt9X}vc3^1u!p%pTNN;6I&~#Ru8Q<+bgbnAfn@?1XrZu{{$^;QxQDy>(Pv z&ARTJK(IhUaCfJJyC=AW0D;Ec-L=u+PVnIF?$EfqySp}xyWTI~+Iy{iSNboevi-%uN9;SOfge2{1|M43udjKZy($q za-16}4C5<1d2KxXC@+M1zWe$yImIl|=vij`^s}`DR;>#tVzejtJ2M}*H{%Ak5oQLV zMNNM&&D|L<;&|Km1oFuHK~hz+B%f1BRn`=l@eTp9u*(HU5b2V|QkSaNs*6t?ZSn=X+ZS%j0F~u6x00Nx`X5D$mKkTVUKQ-1 zHL+fcEA6@^Ccc97c>z|9JT-cvKBo1KgfmUZamYM$Q?r|XX#yVL*(DUpxY1O6=)9_7~V_U<_f)x z+9scDs94X8;Z_<#Ia!(Y&uzSw?IN0rwk+v& z`^pPg*Taq!s}2vnfaxw4cT#Y{YWj-cY)Z~$Hc0rs;m{s}ky5R*W(6#bVh~QauG;N4 zyb1m7c`H_8(EG4(^QB3XL?#m8k*`X!jJ+j2(4ayB|B@-Ejx`xytz}L=ME~%5e!bUQ z)ArN&dNcAqy`O2k<@wKP4|v>Y`E2TcE$TY8S}n_8ofx5Z6W?G2>#El46Q$-ZSL@M{ zE>}~GkR+8E9%{eivLk@~uDKw!bRBfne`B`)Ls?QLn`*I|foU^8bPn_(_#jvv3|53IZ0GHGsc2?>dz#ug;Az#s;_Dg`)b770Cb}5=12l z_UZ&0I`Q`{pnXhVhQ z_x-P=f-R1w8MG#Y85PtKyb}3qw>Eez&9fMSmbgJPor-ma5gF)9+TtEcgV%F__gD}J zPirn82qEG+vsuv5K?>GwFOYg5!uHBEyoT!vJ8yj(Oro605iry_fPp^Ew_+3Cth2%G zk9ak&b4Ls_`#8ZPUQ03g@la=nXTD!St2ub&MwcWw=8EDVcxzI~d%$iHkyTtH7S6Fq zesQLwP#a479Z)HrVL^TejAkqIb=wP@fSan98 z;sU2l_nXKpt*gJS<>yNbBNwD6PD#vttQb8)KD0P5owDX6!ntP(h**41!fOJiFWi4Sx(UQ}Wizo}6M5K#a| z1rkvyYBq2*`TOy_+y`oKEJ}@fa2DZh%jutU;VSwCPl=ZfI~!KJELIi0kM;x4vgRvs zU^sLpL#~QR>~6YeNa#^{G%}X)yGXP*?{eOTFrI@$MK}`HcnY)RW#vu6)sIask5;p9 zbUQp_+#~KcCF1N}M{br7Im)SocwhkSzj&clRWDc)_b84tm5H31w1MiT8cUYi9G8UqShaprnTEcT3$caM z6r+)$3Nt9b?-HpN_qKvnG3lrAsof&S-2=~#D81hKvjCLD&`D;ujVhF{E(oVQZa|

gtY~D3ZR;X!i8r24EX}vv%Q8080~Zj_{7|U)E~ApN+)6H466xQB-LT zBss7#=tR*fX)Qp<;vA^W%EGJ4*Qj^8hny4&c@>EPxeN?4+9~i^6b5DWSHIkIFGnaf zEWO?b(9>CyR4(UW-fB2I#mb=`)zd|Jt=tgLTt~P5HR=?z=woP=jH6QbpxSNqWP}>5 z?mIxygzAXog2o@|!hH)r*tOBQl;_d92P4giSO|$`pJ*f9IFmBIEbf+`-eVP$hX~h+ zRQ$Zf?!xxNJAU(Y9m?4`du3PmS?;o5U8T*!Tp+wc%ragW_>C!}R#Cs%O`Z6;5h}o4 z5=E14yk~Z}*Y)aGU_`(n$Il>_MU$>vuYtS;l>ErNn^0T2b1h$C97^^e#CDTz$9Z+3PT+v!8 z$}~|5m?bPXS2LfU=+pOh ziHfXNLDlu%Z%Q()izkxUpY!>rbZX9l0%o4i4d*UBe2q$cgQvUOP8@Mh>;ShBVbVEUieD1=B~y@Ar4A)yq+0!41Ex2l-MsJ{&m?ob?-nL71_odE7#=00oG!aw4|2!i?z?!V%K)t|UCMf4kdqWPo=mE6WKhqg#PE+R7{pT_w%I?(pBRHF}!2 z-CHYU|KoGuRx&!(paHpHN;NcoS~bn-8rR^X!+l(x;~+>CZcfaDu~xjrTC`99NN=)M zR_v(QPxBzVz=+wKx~>oj787AGHD5p{^Srdn=i~(!Ez5T;K+A6CbzY$**Qb#Kc!tO^^!&7kC7AO zvkPZ9XPx3_j*RkX>5t$Vm=)ziu3Stlh6k=MO7n79C%fyF80@%!qJduYKI3XaNfkck$=NS#AaR z*_-|l*21a25Sf`-tnpu@nI)rL8xV}g# zq?oZx0=?meH~0%jA7_)kvJM%6;_J&X_+iO)#j#ndzxysRFhX$3r7z1(m-yCd`e?cT zq(c%pLcC$wMv)3jwGAZBfLrflhv^D+5&DVlNL)oXC=`NjTAnrJpUKgC>BBC}z;J5m=0>iz(vTIJ3epuP+~t=ULt zQ{>Zb@vTg!F-b~4%=k@&Kyffm$1@aY#X5b7K63SKu`i+L`>RW2X1%BHPxc|T;}iX zxzaT`<*cU*VhQDGq6_EFcjojeWLvq>8}~;XG5@-jw(}e8e)gJ$y-}}eg2g->+$Sp8@JL2~qdy7I(gOGIZM=#F? z4V4Nf!l(Y0Hy1yv%dvKS7;hg$j+e0~h-c}R-8h;Lhl6)~ctb?7s<&;D?p-Jb!SvNp z1J&}A<+N3gY+zW?c&(h|tg?N*C4u6d)nSD}iM+WQ;`(caJSaYWpmZ4x zksdz1IoCDBPho>(Lhz|UeT`iS^Z|6wA7ON8KI8>VmsFaLXrlyDA;(uvrKsX*IY*eo zuydv4h>hsaQHo`wuX8F?4A|sYN{NW^J@u4>fwmd!X?cr4M+uYK`p+w7g*!Mrn_iXd z(S@eZRdAc%GjnYi3?ml7;ipklXrA(?lbhu#OL;eMHC$lyZ`(vUHh>@0w=20<{b9W_ zuufuu8Vf#(+NeA|3j}L#pJ<5bm^{&3KL+OS+wNNeogYapqoS1DM~;Re(C8H-otJ^u zQ_eH%!HZbwSpUMmw|n6o(q2}~{&gN~DPfx1*K{BC0!hOyB=vpKfR~I~QOvtgNyA*k zIMH}%1t04aQrn-5^+J>+DFvw~#_VkFdWlAz7I;o%H@xook5@*<2|nSKdn6V=Ip}H=sU2|sc))e_5`XDwB@H*8VMi&b({$i!(h9H={-x1mr~xL`1bk?~ssTg-{7)$>=n zI=gswVQ61j@ujpITY%UJsbz}AF(W^#)3YP5dOLME8mMwlB~&qGUIt_aFjY)3kA^9MWYPQy zw09F}D}*OKLA_?KGs0<0oh}4*cSt+IjWK13xhC06FMNn2Ys?sm>i%1nF35O(VT3v5 z0V#)0=h#*7YcT}N-)1od9;5z?lsx4RxsBNwHtHBZzhMj>K# zas?CfjM;cm$WbgXuXq}d=&K8?_F~0-3v?#;0jk09`<$zsG(pev^05f0c|}cT>Hx7H_ju8ZQ7`)-wC9K&6uI#S}a# zmZciA?oNUC0P+oh{@<9o7M`K!UnLtdz0`A0FQCU9|PF__gUnRPycZ%@^*F|L4@ zU|nExO7%@+KLi1P7 z@xtbOnWWN|X!E6A<})==S!?C{D&|fPNK{X|cpvu&4@^`n93fL#HruRchI_3Bb26Ok``3P(hb0+z`J?7&Nyz^qfkId1h zJ8B*LtlmO0SeV>(AIK~iQsU7@K`cK~Q*BF~V?IH$rAIPMvQ=1IN&mYPP>08so--D} zEWwkbts7Mi@6L~3bC5Ffmqd@{D5ukAJZgiJ0thZZd(1t7OL z=1n{6B9`_xXjvm3>H)!o5*%`KSkYmbp%ObD?I(jwVOjcW{YPI2fmr0#QPL20jM$PN z0?J|@N}2)}^p)a|W?Cj*vsegE! zBB&1QKi$baOBSt`5xZh#P`{#jz9Xj%}vp=DU!q;nH`kD_%ydC^V znJ0Te>ba20%LXt{R1YPm`eCSVM;fxj*hFH|MszY(io%@WyX+l^Mzpx`6Hd#t^Hw_T z`LA?Ui!#z2<+bBY{@I(?ty7|vZo=_&`$3fP5nX?iJzSaQEQ`zoHFysN4=anNesq(FE$rmeMnljX>is~s zTyO?8H;?7VvmKFP`Ef*Qv~0QtoO3Sv^}t7X59A)@uIuoq;3lQzj%1s2q>wtUC(Vj8 z_kqW0qZ9->ZQDm-XfsF$`x|Z!M~rJFGKNwGuZ&U2*f{iY1T6tEcjo3-Rpf?6%RZ4o z+POf!W;y7GIgr2P#Gq(&eqd1#<@&2LPFhCEH(C)#YRVeHRSDu;$)aSWuGlh=zn|Pf z`-~qFNGI{z#CpQI694c6yO@b^t4SkFv|o-B2`I?T#aB{^T?ElJ)tEMi-@quY;n1r$ zSX8X+W8-ssLXK3(cik}lPQt0a0`HED0CCtOa+r8sa9B8MmY-!qvB~3ppTo4vs&(*V z2H6+ai}*>ibS`(#X0vN(ItebMUcB4s(F#0xn$K3rB)g2KdH0O-wZFbwu_=jhZib0T zSH@I@uFkUmBlM@m?Q*?6*ylstRh$<}W6zptXJWFk*gJAYhT7&~h2Xn;4AYI&_MaCR zFX@KGx83@31LM+V@blz`4_J;*6b)073^_DY=Mej*jcb2_DZp{(PT1$3Q|5lFn!dGQe~!Cgx@~FD-WGYJm`aRM6!Nt3s=}<)yJ9p6 zIi)cnY^IaLM4ZYz_w#z9kKfka4neRbkR|PjYh+)$vn}D6R@W4P&Ntr(3%JkFGkUuz zl6ihf+@6hTeLk1oX}fyMU>W8S8$dDqru@%uno6^Sa!&z@6j5ITxdHQh2pKWy^al zAwli;j;a2kJ1}7W6OIKKl~40cze!fi&U3f!fiB3QPbzV(Lpg4n6-tkbd}AzIU{;)C zbc%N*i`N7vN#PF3Zw=IC+(a8lBZNS~h2w65or|6_tQGHa=pIGfnj0#G(vd^@-=-Ai z5eK^+m>Vlyhmbq82~{XS5s#)ZB_m*s8%7mMzfV3fzyqrr$a2-5Vj{J&tKCwo#up)= z5D0xrKNS&X(X6A^EJgh{^m(9`XeOwIO;V@5#fRY)#r}DEXYnJOBw6z)sULd3U^ME$ z7J%-S^vUSPZk+QzwEqMav@|Pbnd12cDdf$Hpcjd4s=9JGY9To?sp!L>*?`fx2Y4{L zG#87_zBRs))gO@FiKod5S5YNzJH#4y}YWCS$P2R}G zg+26^TE$yf_j89ZDLr_zMN@1oY8R%!7zM0LY)Nroouty@1vcby7jFle2)R~w(Ng%x zvw`S%GwFsbLa*jpts6S|cBdL|vYPKS0>4`dj zd^qdU!4Z{2ZMiuu*0M!>$^rA7!AnCrzc&2}s9Z_BOQ|v;yLiGh+HGpIp z`+H0&HWn9ByNs16wi>o>Eqp^!#6z8KL}|t3SPA4E>%+M6!w+Qx1@pA46Ih-k1j~eC z3Qhspg^Y(pt`2V*)BI#k6>2KVp0V3k;oT&zcG|1Z;s~n;a?$LG%MsW`7Be}Xk=OxX z*m|~s3;d?|yIZn(texQ)PUbE+Su+>`U9I1lCpZJ%5nhM4u2Mf7#D7ElWB5(wY>08l zJhRGU3aKUODsveR8FD=$rlbc%&5sajwL-zS17)Hw-%2k5WUHP7z@huJiCi7vw4)~$bH84Sewnf?0!4ah`{;ff6IiHVp($d{ep<7M^v0-B9T>FW6khBTys&|y z0BJ*|PZLj>4Vp`+LyG}Q-+aNr)Pr*I^FPY7yszTd)Lbch>sGU=D!B>xkF!t@xSqUa zg|_Dt2y+U*>8ihHWJy2XkLRCkunrRxrK%!CUhXJ)By05*t)sX=pGVJ1-L0oUa)cz zcX57>Mf_IbP|s2^J0zlEyYQ;YdD&f;o*vJ=@`-rqsJIZkv3o0M&$NEp?-44>quoaE z$O2U0fUs;8f~!a{B=T<2tWNt23&DF77msx^^cA^L6Q>BHT-u)}mM3&5T|&1!8=|I< zmYdbz0%u!GxQnfiwXT=6Qz_}qP}LAlKEbY#zE-XXgUpXnaOwrFf4z=WexmR+B1}fu zo2nX#HekRhk4}JxU3RASh+Pk2Tj#}7XM1(sd^#dlPiP>?&l13Gk^WdgX0``Z*BZXG z8ctG`))GL{d`M-2*Vo1Yy&Cz}uu4Zv;ghvAj1i(s~dt^0U&IaSEFlW;b5<})5s zS%k~76BBjrlJtIVPO^Fum3ormT|B5Oo}A)!tF+-P|Ck+la~t0LXQdzAdD*{g%)4PO z8bPBS)9V0MZ2i0A>BsfF6|tCf6}3rC{JNj?kIzyr1?)-?#A=7L6gTZO6;|*yoyY$4 zDp}?ytl=~xOi_f+M$)85%ExumH&G=huT=VOs^1~vZc7Xxc zWs%cW#f3^*`&FCs*=9GDgx|4%>i+UvG#7ND@y_sAVhdw*YHCW*)R=%dZYvVnaqoPg zuZ?U<$|g3p?G9I`R`w2}MRVLQ0m^FxA#rw9ij5Z!i;uzCN*{mO$}_g(HnYtM^@FFo;AUiITqQJ@K|%a4ey=$dDjvl4`n8b>H6P$YoI2Vzj`mgyM2? z^K`G~p)whV8}UWMdkt$@6ze!5iToE@* z5{CDDPkL@!-KQm=Wq%spAa5|bvvI^qM6d(*)&_Y03LOdneTcfkHrRTU08jQR2ssn{ z@=CP&VMnm>ITFJ9MzZz8FQqYfZq>v74;5Zg3Iv}-Q;k%-9~#YFNt!>Lg}?ss6N7g% zI}$1XFKav?e6H-X#Y90R&jY#2;$lk$HMl}`_4s(Pp z>|z(K^I*92Rc#|TB~dxl>K!-TrEIgUkECwbmEITB2-jI=)4Hco=}376_E;u5SH zJXPsPmLiuK*^4FWzzW=oy*@*%Fu$K|pIXP>Pg^gRA z;y7s&Z??hlk3a3eX}v3PR!(esBOZydbc{~)hgD~IonO65%^^h=#c^VW8K_+BGl zqD;Puk#W!?D$G;F&i5*yPR(@291G`u{4;^W2?2!J`TjT8NheN&F^B~R|o$c#B50aZW!-B+^MN1M{<7`My%1}Mn$B>_-Pt!@=?da zO1ox9q^YB^EoCWgaQ{k65fRF{!U4lDxw7$xSFL3$V|liSFwv_dYQhR=pg{x43}y`;nYQT!5nW z-FoH+Yzr6#WL5rQt$P3E_-aV`F&^&~7sL9J&a*~!O9_AN3?{ZoVBrA2i&1=W%wRa9 zW0UEeDzyA?8Yh=Y*8OVPB!;WD?p>f4Z?SEWW^+dO|<^*tT1-*71j9$|Y9pwrZ*MuA4Jej1Ah4l8v z>w;JnJ@&_14qp;PbLfZMc$v~mi3KJMR~WvlrpWTtcv1@L&_^}g{Cs?TWUQ{R)w(uB z;K6)#-+vw0DCsMD-0Agq#v?<5miEkFUZ&iqx$dvoXa;=B9y@WlrdCckS-{j zp9PLph&({M|DFl_ZK`yvMHlVz@Pa5?mGJa%3Hm5Olm}R?k5E`QxJvwaqrL@|zQy5+ z?N%sLXD>E<**#?2V92YxJH#IbmuFi_xg*6a_kF(Lcf@*%B)2qnC?h~zo)!Eot+oJb zC+cuv5l*C69xbX9-}XF?7&c%GR7rPX<+nzwI}*Jo%Goz(MrXmJxjB=4Xw8o@WH|JP zS(BQUYvn~+=c1EA9NV9LY)Wr`$3V7RTE68VQfi}d*IID95s0jRx^L5CQf{>5ucIQh zF#besY@bnV#c$~;C&(B<-@JB-Jr@U9DGscll15TGi1S0>P0 z^=&QejF+3#2te?~MZzNx*sLydLxml&6UGqv0aRblf`iNqH77C)#tt~z1>wp4tr?0B z)-Rdne9%yfh70Q)qqwmc>_ej!FW*GF{=zyCQx1;V1Pua$N=tu3z`mB=^lqvsUk`C+ zd1)i;rr2oWNc5=@kVrai6VxIuHxkB~ufg0dgKG{yVCz87o8w0sGl&gR}g*tz}T&{03)CKqG- zMn@t(Z`VimA(Ye3GwQyFO*Vr+u=2v4C+YGTumX*6Fc;W+?Yy96AZF2M@^2qEY(Ktt zrJB>>ZX;eN83M-LDcD7+*i#?jKilny-`lv2whOo8biJR$O~Rp=SP0ZbM0O*N4oL8* zHyOL^+cN3mR(cW>(W%X9v&6;Axn{l!$uU69eZl$libP=WeDONi6pvqOG9L6xGoklw zygJ*&15W`50&UXHo5)t}iKaV~k$Zfr(>21QFq(>>M;r|3bSMcBWQ-qj%lOeH<97k~ zNBf`zGleAZR>8Hu$=xAnCo~otFudiX-uB7#`48a>4(@&A)W00g*3A`r zn9eZNfi*5aOn0cdg&b^XymS`Iau!`tRDFURpx$cz5_d|C7I_B793ZBMo=yr5le&oa z*CbFrM0)(NMs4_9+!-Y|vDY6qc1{zzM6%2I^TnuCxT45+8zFh(O@`uwu!||1}TDzuxMfB*cGRuL{+lgMg5sHopV;A3|n# z5d;MQ8S;+0Pb;=B-+tFt!NgEA?ci0N4>y;{1LWc3+wZ^&6kBQUU z+YNs0r)lSLp2U12&KKYHWBUgknfW!vZAUPXaTjxC9`JqxvF?BoL@xW>YI&%JZz1Xn z0K+#rR$#2MkDnSM5~!EB428GQO)L&3No}?R5nh?yfKcv|E$)+$m9|XHDU_d`LtBHmN9+?33G)>`x(L^x1uphT)=dvT-<7+%a=ukG$<+mg?nGZ_)#ySUUwQ; z&kJRJl!|3)^)m!&^#zIl!e-c=PheiF{CK;X9E+T>e)oGj#ZFjQn?`ge#jTs>RUO&B zAZN*sB7KLtl&Yqs{(M`d;swo9W6Sc}Dmub=I!;*&9D`}i?f3nEE=$rkINkYeoT&e8 zx!>5YiYGB8fx0ANj@@7tAQ@wuzKo~BQt26wEl{jsoxK7%04kiP&re2q{*ZEVEVrXH zlskO)D7LR$ma{(n`{V#{K2)pW=`1?CgjQ#xU6Vf1A`Gqg*6wJGP<9k{^n~cHO|lPk z@;XIOs4&S+oFD3sQ@Y;A2BX7*sJK^sxt+`2KL)>EWZo(bdMDaPB$~_@J2s70n*eoO zi^G&X#J?S);q?g&Zg0Qb{On&IrHvgs#4yB?bgAT;v>1tWBIF=VTHUX08*)5$ZMw#K z4(En#uR`%+%Leb}?>{h52&O2k+AB_;sa;4Jb?;9H?5F#UM|Py8FI=u?@BWM1`o468 zEO*MSvt%#QwjW)EZ|@Tti4#XC#G89EPoM8`6OlfM)`nku;b5PQZ_c01?D*PZywDsDa z-M6CWm2yh_a%0K4{$BXTg`LMYRFxsoZkK=GU7_S|s8#k!h(QHraU??Rx8-bq(){H{ zwNZ2AT@kr=2Ahdmgr9PR80LMdixRVr8{#wexJBQ?#;-X(>0BeeD9Q{B)!?}&22G)T zyw1O~ZS;h@z{9G3nmo?wB+iEe+S6 z5xs`1(V3|)1;uKaJPp;4= zNIyUNV6lcCt4%47&DSf(S+@!+5jO&Y*oN%yo(21~!?m7i;to*=It4~+U{0Hoxwr;@ zWJhuRMJBHPuSD*}E%DpL()H5aRImD_t1ikv9>tx*u;g!`8m~_IeQ$Zm&%SEOv1u`& zx!O}53}LOeX9IjK;gU0j@~f2o8l3qu0w2%_6=RpouXaeIGOe-J!qXAw)CM6T8<;8r z*{>S?2St5Ob6p_&$}#ota__AAXB7%3j;!`j6EgOblAbsrPk5G4tGW1PVs$g3goZ2h z&^=Eo*r8&|j#uFL?asn6@jwfRp^r%K6%nd$b8R~PSqDNr5N|`=z(80er6QO()NG&D zY_+adpMOs8{MD_XkUQw2;8x3k0laXX+^~Y9?50>XloASDQ!2g4*N^AIDrqTF-IeX7 zx1s-Ui-z*!U;oe@-n{G{R}KH?aIRV9RVO3;V@`b|yNA}NUD=?|CH!8@x+S*XX&180 zP?lgvCOej-vsiT*@E`-@YxtJdT2}J^NV)spd#2BE_+PD@)~@%m8LMvl;?pe8wh8Hn z{jqM4wCc z)tMU6W{Bipg)LkDVW}^f$IF>(H|7x%IhGfu^X}a}x~?ri#OvS5e7*+<{>pevJ8E$4 zBec-`WOt$U?Qa@(fB?1^&DKV9y^X5}tNvb%Rl%zGq0{kvZD1By|9#1Ly0rHYyo~pc z%NOp^Shazqz!|J|ci;OOR(nw!~6y|EVj6_otT=kV<7r(2WmH~y~Z)mle>QpE0*tX2WliVF@=9FVHEt66`M_v zB=cJ{ZuwK*0qPL#lB1lKb%~%j8M}qLsOtU*EYFe3I~)IxCt*IFb++gK8?0bin8SI~ zX^~eLjiKsRIHAPyuAX-XyvFCs?ve5xTC4eMq@>X@sJ7X(J0GC?5ll@I(Pg3EUl~}= zs}G~I-V8YAD`oDlbrL|TSqrzyXk$qXglqcv;3w7XB)n5W<+*`66EbrTl>&T=DQhv$!cj&KvH5Kv?>Gi^B#342=(Dz*9 zxf51)q5=3YY^#CG7zyX$=3Q^tKwC!Pv`b zZpi4!+#-U5TIyv)$*3Gk;0x1^0meF8FXigP-ufRi_{3{8-akaUy+4lIPVs+R=e+@a z5fv=_AMD^!y5FEUCcTrr+dfo6TrF$YsXH9eD@)pM-ETMecW80Rt+E zSGb3N!Ct-85fQhTBZXRGnxIa{0VTEMe+3xE@6tT9E$B@1gB5DKa>JPD=_W#dDY2Ac zUCYi^$!99-a0{}t{@N#2iZ1Lg~)m-duWaJaV+bMX}3St_OwAc zI92t+sIZMqawtJ-fPWy#utu_7cAxUx&s zAv4G@%l-dnq&x-(O$f|qY&E;~qHC=D+R|^HxivYCHt>U0cBbi_be5GHfLfZ=&}gKL zEq{A*GB45DmM{HHkzm4<?%A(<&@Mcg(i2HXeO+Sl zl13I6WwdxO!TUd@4eLQPe>0%Qega4SX%$RNH2ntg&07?Y)E4|Fh@LQv9>tZtMZ?MQ z{=bz0)ym`jw?yBPz@D7{54^T+`A>oUY5fCe`Z!BvlA+n;s$UQL{-%>n`PM3J3+Fjf zlPoOoA8+AIb`F}piFMzca$x1Gw;s#ee<^rjR94js0>CiVBiniZAzmoxTe-k|uZKMP zqZ24Ouel_!hW+*Tznu(z2!-=-xKUbQySXVf+V{dXX-!%deAQ))a%gi}^7^|61v$?{ z=%`oYlf8`)cRdy7B>tT=<_E2R(4WxYfVS)ZLa6*F1S=aSN#ghWA*+xWBP1+LD^LM( z12AziLjRCln7<#@F_qEUD~vD|1((?^uiX86pZNd#SMsHgIgLNd-7~JCQS`$iS=UQ< zJ%qy09NYEHIiqV@&ffU9IanEQ9z*dXivSg>0j&>~=Hr5--QX%A)S9)=Rz%mo!@5!{ zJk{F`n6GsHN)|pBbJcXf^8pB!AFnGN^qSqAG8R{>w#^JC_`!QZ|H%ZYsJQ_AUx6#k zX?NHE%t9*%56wROQ;?DO$N3-L>3M(-i%_cyi0#Rv-i+0AR~Z=c1=xON&+C$A#+pz* zGPwF#ET}xI*si4*Eo2dHNfXUlBSf`$eWLGuIl4d{8h4iasrBLUJFo&n8-I&mrN^y2 z_)-&XzlnUzK`eDYlzSY@E*+l#@K&A%m9O|-$Z`I^hI3*v?5kbLBxpkkosO$hy8tUi`s;K<= zc8@tTzxm&r3MY#nm@Sk15M@bI5cVXTjLY6HzG8IF-I+!xwS(G2@1y!o088@X>!yL{ zzY=P*E!3w8xABZ`pw_|!U^yR)eEgh84AmT=ycOc6pKEYl_9Y-c$=~Y^1URTU1kKsO zb5kcpA`Yv@1x+stJk2B#{DXGS;@y}a)`z#U)bF8yRv7{?1#iD*=qwKBevY3(Cc$4d zJFK1-6^9N_E?5=2%A&G8*_p}QzQaq&#-Z3oy&Wm#0=I8jC#)CS$KJCMrYt>ZL!ZMz z?DNp=#znlTHx`U(7DLQ#f(>=YBHD+-CkskUiZepn$r<#m%dIPKbh2CVaVh zoNGRfbh^Lp`TIdw>kZ0Mb=eK!bz5eX(#``q+ewR;DqPUC=4}>4b0$ogK>qr%mE@x@ zu8uch#P#EI#r|;OHq?#cXp%0ez|So^*(J-z7rM}3BVN9mCZdVzw8Y?~^%5q}XDz+8 z7p`GHd71tA7~1#1c=>qWCj02BxSDqOXXzN$u~3jw=U;o4D4>+UEbf=SpRijZcRt+5 zJ5w;twvrePA7l~+q#CAVII@sFA?E(P^YCE&&c6(tZW^4LJ^4n^-d@jLrgL#~>0V~x z0{6`)OPW-p5CJpbCg>NB|E~@hPm=}xYEL*kTkarzr`hZq-tDr}M!LY;!e+(h{Z}+^ z6rMG@K;+<^)@1?u#Rwfy1^qA)ABj!1d6mSi_OOE1I|C0**ZhHMf7Ck9WWy~BfEVLw zMkf_9B)wgZ-g{-w`=`Q)OR!e(;GIiz7yZlr4*SRyJ7d*z9J5bsq9J-*=dVnx&w%`H z<}mTxKHA;SsJ&u)deyo$zo^1W!ZUC%`i8QPT+}(DdVWoRR7cnx~+pZeoQLAsl$DE z_R+X|FSN} z^qX(C%q2VWO7Q+%hZVZrs$9}I7p%45dU7LGleg#e2n<(-jqD0H0mN&_qYcmY@_w$T zEZDQn%=l-@cms#E0=kSf9e@TbXA~F6AMvi?F^MRnZjWG?J4_Yo?RwXWLt)+HP_mg2 z@4>?G`=p?BsDbi(fu10db3g{%UnLfMoU=rE_a1B;dzV&e%gh5j$mC-erEbDxw+U1Y zyxOPA*n0%!2-cE^N!%myaH3~0S6G{u$#r&*>j+9mdd)|9#ANnNwyQZ&40eKV&KYhy z`({BG%K;VVNeyRzyn)|!H4*6lGqGQ4oBho70d^A_0NaghJI#zDlt#B*|D^SPd&!*O zh#jv#UjsD% zV9{=qp515n=wqgbQ7N3jf}g<*9JfF03^8$Q{4~gezAQNiz#OHK<@8y9Rj@otU&5vH zEoySd`52+*k9(w0*%w!1;)r(w5>@T+{x+>(_bw$Rf%x>ijhy@sA2Py#SJ5n zOUmDt@|r5}bs;lke%}~w*f>*2`@E9y>b@VU4m#LS%Q*Gfs+*zIMSJ2s zoXtIp0dEZww#U6!cMWF-!&6`E^V7|~y%#2G%Vv2mlq|`}X5?9I`l65gq1%_LO1m2b zEc78NsqybOY;9I;tKgPtS$iGA`Hd{X~nUsnT8){o$qWk7gK!i zZ5!JaZmOiS4fY&gVrgj@0l-eCpFy(IDzL_f1f=$+Klv(Qi^KSaiAAVj518c*2~Yf9~7b19wjI%Hf$xMkWDQ_yr;t(XFibd4-RapWbr8V@tr0bIGrSL* z%4H7_vqmxFw339n-UM~E5;1M6g25;*@`-FwO$AS2#)pKEtX0ONtF|%&8s**jl+r+DPxm_pP-qyI?lgCsI?A#Y`vWnyhVu*^U}HuTBm1p{R@iB&bfkfo zR1wxZ>ZfuH;INUmO48fI3BUDnnGS>5WZ81m!@_5eFLv##o8As?4lgNFoHe9n8Ygpv z^(78RtBY+6<6G)IzQJ=KXnqeHO} znRxcGpt}%XJ-*fm4xSBmb8YaBqqf*jAum12mG)R>c(%DR3i@$_rv>I7_(kzPzQe?o zOkF`dLsXZ$pUGZx)Oy{XW^u)5=Z0Zay2EqXl~sF8OLFu`BiR)p&f>vWf+i&bCkeKY z@;>GzahB)4KjTTIL9PCq_E!#yABLsh`xCwYtPjCi=>$gqGs`XUw6L(A4(_61@;tbb zu;fddn`6iGklJ#lPV4lcFlWZ^sNTjo61C4!u4a!(opC!b@D}#AX|DD^`-!l^4&HxAkPg@^8Czt&{tetg0TuqktLlPvoyMz#edvFVG!QI`R#yz+bg1fuB zy9IZ5cWoRRK1gQXcjlYjot>Heue$o)uG{C zIPp~)cZs>RMPg_-dC76tu|vb1A3xf<$M9kgKg(T-@kpv2B71 z6j|T^S$!-~{=~LW5T-Fj%G#j79rHt!Vq+k7Z=Ln0UW+ZaLv3%3x_Di2+t>AwxI@Ya~8E=f;rz#I0ibX}g*!-3_s<0nwb(>>M1Dy>%SQ zgYH;pP|{CE7)|_jW10CTSLKY8Jf9u*LFJSuj)vO>sZ|rAnqa4)Gv)wuc-}#HuM#?< zWBouEE2!Mbk1(Gj#=FtV!Dgx%0#5pJMc6`uOgCdJt-CKl{JcGv5%U6f)m=Xs{ePNN zT$%=zU$#9*>BkXYL<|@;2r^n=OR*=U7&jFeRJ{k5`fEPeBKg4|!!?;}h(&c$J+PEn zdOv=7H*8I^B3Y@Dl2y3=YN8}d)UpB<7jd5y@-rRViZ%xmlEm;#-v(y_A703M?a!$% zb8F|oecFQC_eP1ri^BXa70+Ld5iO4X1{~o#AW0LC0S4gP7LFS z8Aa%1S$+k1qktv3?~;;1t?EVe_3TlOYED(6`OVfCeYtQW>&9Ws@RQ@m0gJkWx|5(E z<|*=UGxuA!?d=kv6N$zJ4CWmd{F^zu8};`%JLGn8y&;tqfQN;jS`U;#I_zxh!Jox0 z>9_ULSf}gVauTn8JoZ0Ic~N(g--cZDQ3OJwB*p-pQF%yzAkl1Jw&^N~k8Z61&%R7k zlA^gQOHFssq_A&ivaDeM8aceFXJ%{>}!>kk~n?+d`EbJwktR+@Q zil2*jFA1*5#oQ={cQ6O{f4c2i5S0Kjc}+mC6pb=#wydO_1{vfGSk#RExLR%%*261t)-NLcJ{?M}WP zbGlAmXoq@YM6|b# zyvp^X$WTQz^vP|R*q5;<`j6)5Yp|yW!kRnbEHLu&71enK(~CcH8khbQCVSnh&W^&^{2F*YI02`OBmakMP&Ix_c z)koxX&c>E+Y=AV4UMgW;sDT!a7G0thKi(`dun(O`(6*N>y5h;z#`#bgtB& zOc+2{J>CYF_||kJA3iTwz04F=6t-*@;lqsP%`9uFdT6V-EJfhYEcTpy8L3GYIs=>>1mL`iI^?YPsM6lH7# z8R^qoi<%g5Sv`2stM^{je3sJr@~ttiQpy3=PboK%1t&pWqY%O|p(ApRUVv!xrXCQ5 z(ES4o^u;3R0j*^F=VkUb?)4*oSTW!ja~#mlMxC*yR2`OC*gYkzBnt2wL&^i|8)jw3 zmKtVF(lIrB4-^omIFiFM-l)HuE3Tkc)!)Xt#M*VVR7<79>XhW*@I zE?-EQkmSzJI~CPZ*^@suOcW+RHi%a*wM{wziuRUQ zqf#U}=`uu_{b{L@&FLDp>rTWqGB#WfgDtxF6;WUixp$i|V@hxmf1^Lh)eBi&Dj_3=>b=1;K63I-6M=v=Ib}|>tqEd3z>QNu-oLE z1cEN7Z$}D=W}xZcC*C$Mi$5LCq2r)5(r$Tr51jk0t9Ly*xN85 za3w_#ntz`$^0;u&tQWIw4yvsLhP~doAK$tja#)}JMsd$29ORpU@5XKxhZ8TypYWKEc|+aXLxlz?Ep5aa=;&yHP!xHO;F^mjc>4#*-U;VQCzQt~{qB>EKJNJzQcK48Ci$}_ zJjt!E3Y{V}_UEiriy^_>x%W*1NwvDbtztO{NEn8snfNHjFcgnvYGPHF&ejLX0KAWB z>0schO|n<+Zy=^mUlCJ|Wv20JdU3%qZkBnW(wm`m&6bX?Xz4+)Uj#%FBJD8jx?;zp zVit~`XwDIS^d6o`E5$QT-O%Lz=#3^QkEyO(S^<10tPRjY_iT6LW-{RB=doGE44Fen zZC};BC!~C%D?e&)?&}shBXnO>s&g6uvWFZznzt;y!`8+!D@$Ep8gD$te@<$H5fnpe zV}^{a5PlUPzc1h0|E5c;&dH)jE5K<5n^OoG)^2;*Mi*Ct&jK+q)TtZRLCYOCR#cpI~2>7BFI!z##rSI@jVC0un}mGeQ?m z+n}u)f=IPa)b+BoLcxp?%%n}p-^B{@&9^SUiG_mN^c>blKL3|aX8*kexPi;-e(Yi~ zvyMb0$3nQKW!N`zt)vsm$`m&*(J_4`Sfi-zj|~$-SIM|^O&+B*XI24v$mP0t;F{kT zVqR3Za4ThHFTXB1Vi=fqU#lF0HKSTipg2Uw8DS!zySda%-xYVBw%(nY?wiimG_6;B zEWCNclaI95ydRl>ij?43 zj>EpSsvX_}>0}i&5SQD;tZ8<=7I$&;RbQs<8EZWDf5O82e+D~Nb3JxwFgy#wMYABa zDzE&Ilv>^krixo$ll(gLXsbqX%?F#ksI0tt_h`wiw0V4)G8hQP zHT>xPYxU0+RUo|T4{LC;eR_@P35KbZBnS6+Nt^De>-PXkpkluVW9YRzcIjPV`HxR( ze@Tq&SiZao1YyBQjX&3>;S~_yzA#EFdidHlvJ14?q;R5S^A{4F7KIj(h|r8wAG-h# zd1GgO!Q3ApNl+j@UUziw=$ZWe(b?7jYOZVU(vx*?Ec?0-y>r9oR_-16kY?6h^Y%8A zHL-Kc@NlAXO4_=n_*dkK1?COqg>0_WkDIy5j*{kZLhBk7+owm(wH+z)^9-@gpwENO zm1T?|W9sVIlf@$qI?Vgh?+D_qdO;#j0Ye`2e&;Pz2X9=Hqtka&|4m-TNrCS-C;^7d z6CvmKcep~A7OG!(ap5kp9J3h-Dhk6#cV4r_$bstf>`xI9QZQ!@5~-tO(@ISraFZTT z(*W3w5C3~&ro!5m+T+-bdZnAwFVE^r*KmnW!?MmdVgn^@6AC0#Rh)ShUpSLNI$mQy zSJoVbnVb1Nq>E5sbMZEJb8L$Dkg@HOz92!%TqE`Zo@pb%x)Og}*%E@uKX(}1qruAx;0Q0DA%DBu)qq0k!9e+@IZo>;DX&v5{u;`dHNq#NB_4c zva_(pa$R#>I-GgFMhkxNMp5Rv}HE4W#- zL@A?!tmDKZx?bG25ORc4i5Ee=k$tq>z0&Dzto|AFl0`3DN)xEdoy*O8;3!@ZbJL zccCg{mZ<#csWj|w-+(=Ps$+zc&lsGlwpxbpqV7gAM@e+#7{73yFVyfJMzXzuOt5Aa z*cy>%k1^u@^<1m9lRR~4|CW4x6M3xS)_H-NM)W|T&EIBrZ(#C*T1M(0(64vXyTIPD zYh=4NcjLl*E$a$kct6yRzKBuIJLkIzVb+e3W!vy6zc;?*FHs9k`feF z&~;8UUs1aQrT)vu`u{RL7O;N#YTe#9>VJf-nuFuSFe|miLQ_eRFEMbgH*Jbt?!X#VBd}L8B}L zDlKSeyAU(Q>3$>3sSylGbWwHDoMSBui~}vIkTgT6PK?=K22r~LPE7P9lNW&Z4)=sZ z&J&f4O`kCiFPI%HS6+r6gsBNPgQ$`BM9fb=X`-&hl~Y&uid=*KjtPwXMIXDcfSt|% z(R77}1-^Rg^$G%CLgKk!l^Q$4jyp7qW@EpPuTOE2lwJEjVQN5U4=}%cHDQ*8_fMp0 zspvh_i?8xv(8to&=bLZFjS*aUkL9@R+o)dBLF-7NpdzJg@P&mD)HxE_Se?^pSy8At zOWgH@6$19^SMpnf4F}6Qz`;lwq0bsR(Ag==g^bz3AQuwnmZ61;%6Yd}1;HG*eJbJ*eOg^D3-iH5};%at__UkR=%Sq_G}rVoqj2f12+RW7}&D;~bCX6q=j zU-82y9~ho~H+iv@=T!d^H1gkP7Cy$d{vwQ!O#PV^|7wlWrG_~|%oiY+aCtiK}@O^R4E zl2mr&(h7x(nbpx|z_MqGomUIwBrl@n)7JHKsWUr0?YSRK4-7xl8E@9P*WBZCT8X*@TR#4m z8Nn6%Uk1T7mVF+6{XrbjD~V%5d7oa4Ue5|Cc}tacmymu!FRIDLSji7xi0mYwc{hnh z`5}2OT+iVN&mKV&`NwzuSNQJe`6&!faEXfD+w$d3@@5)n|4OpvBx=8YVT?OiGcL0m z3_KM#8q;GHO||IEkC+0SeR{j7dN#8Yf<~#Frs%MK+NNghuuZz%eiIy^^4cu&Y|V&|KYW<@G^*Rp9dVR@S}L!P}?~*Iz%GR!NFP& zyWOG!=Vz#e*_^axpir0_!|b}|mmB4_Lj|8bz?J1cZ8HD0OpO`DoDsK?Q%$poOkV#0 zm{gr7*PdTPTEEBuzsjUaXp+fU?a&{ln~!C&*2`9{8(I7Vdl#iNcP{1Z<-#Q-wyJ|l;RBZlLbKc1lEx&KEPP$daT@~YztD*uc`jZbmM zJRh{n$yEi8kk$ytz< z6}@oVZcO7%(gV)F(!A==Ox52ko_t>EhLJ(d`@UvYT5)>kLuId|8=ifn$1l%TfWc^Zc)%`I0y~wZe+WDB84#EnX z`CqZZ7Y)KOTB3&`)D|eS2x0VpW-X`6`d5Ar#YzyrYW%%9zz}S*?`0eE{WGeA@L(a!5 z2`&s=;28X60QI{5kx7@K`0d5xl551Z;J)=?OI7JA$#T*1GTF_QM|xahm!G=mad-|W z+?DUvkqn1{W6AX7e83Xl@K;QK>1F;$*tCp~m-w6LWxh3D^uVVOLNt2|P)np{A259h z>H+^pLH$boulIo@C($kVkAXr-8`U6jh{dc7kA_f) z=O}g&11x!ZA z6EpS)Czw?r#h<;OxahjGoU*nFjQN~AC=Q4?lA|5|6A1rNQSFyO;G31T$N!w<(2zm& zODBaTFr+3D3rOCTn@8;~SoID5}}Mn{1#Xy&(Shtys7*uT{t3-4IwG%Q@uhG%vBUz@6WCo>yXyHOun zM7wSeP_`J>^qB4^paE{K4zsIv%#N@IYC)94FS8%_&xVRUNwVjr!@Mi~9xm>x6V!Jf zo$#awwdJNdEp)?1;r7oBMUYGKYmP(SiZSJH+?5QfQw!0rH@o&Hk`8l2^t?{F{3&EG z&dH{=`fWUV6?iC2#QIkPGZWI&da^XrnrCr)c&>!AE+sP{Gx<(ER84 zws7a1`NdhCKxm3%|AjmT^Dpw4%vQ~6W5d2Ur{&5gyjtu3P^I>qC`cTBnQsEar>Sx3 z`SVpU)xYcfg6b}e+a+XGVO$G`Db0w=e}jT^+-2RkUpOKDU8V91)L9BQ>&DklXX}al z@1V9#JjZ4zqYefuwSfh*P2{*ci2ZignJ3*upNy<|JH8c0&A3pO_dv1@#*56-GHaJ~ zqr*Jc9fuwtJl)>8Q&I9`=B)nSpK-k`7f3X$%tgs(doag9`-oD2`Nz_bOL;p+LtHhy z6tdG@&Gfirxrg|D^j^w}vC+zUB;fISWCCqt3HhSB@SIpVbN`wpX&s?MQJUzQ)Ea z>%eB1RHGQ4;#dKYdsLT5JBO)F(7}eIZB)&qBm-3_G)(8`XvWR5-pyppsI?23H7~el zug-Y*>X^{$jQBY$ML8%Pqdb+kY;J4b`ktTNh6cY|9-hy=dA8R7u6Mhy{}nbMljbYY z{W%V6=p)1o%3yI1G25V8tB#;Wn@7}qho++=8DqNH@KNU7$SY%K36J!ngKTf^5AUmB zM_FSDIZ4bj|NSXAduYPv!CLLeIvCNQHUGC}JT&*FPH5A?vi2?oXt^4uifYyxC9OcZ zoSN2_j4BFQ&H9w=liTmNfU0K8C98$Z6VuDN@ntvdYb>tf9WI=qwyRqqKs~3LN5H@KA7j!-4C-Iq?D`j4^*>tnUm?EMD+qKF zd2bKSuPmO?L>{dM1H&Gn3vB&dSCPV_q<-PBwPgALz+o;yC-EE%d9@45Q1H$1ZtP=UP{Z-#bDv%>f3x` zsv^Y}&ffh9RHE9Xj4`oJ*y`O#kLvy~Jo%9m>tp_6E7jdk)mM#y!xjz;#dVz)^|;+s z)eD-0+lby?;KFfhDU?1NJxoiD5)i{g6SeF6GMw|8P)syAMPBWs5dXH2>< zxS2$@_}A4lO{J?Su04<779-z5lKx5D9j9FF%HYE(TBV~l#}p_9H~dOBK=(?vo-^R5 z)9o84fTJStIW>I2rkGIP)zWb!mwIqq$o%aZ^?q~CZD`g_pBKe3Rma2Ag>Q#(#_074 z7B0`_%~1+~`*dgM%oOHF4u@SnLks{{dHst0F$P{l^9G1t8dgo^uDWa-lTmgAu3jzIYp-(L2DhkWCIQVbx>Obx;zS5L9-n+sO_G z&e+vjBn2u1ZE0) zXuK`)eza5JPU2{rO^xN5!vF#FcJ*rM|LI~;bnF5w{PgWvk+;YqP z^IdjpNCvq}*aGi9#xXA?2~8nY3Tl8&iPpqB1aR-;?LIh|qX0`qW73k82_x5v0n=DU z4P;cFCZx zVGsMoKbcZ0bHx6bWN|Bez5*hn5Z`$}d^F!b$tN=YDu}0q6Kn(Qfv&}BznCER@iwJF zC1NkFi|D&RfcHg@_m@Vk)~NyLp`358ucY`OaAv)HAY72)Z~8nn`2+2#-Jy}Bbkzv7 zeYsediJ1=3-;XN1Z&^PRqiFpkYhcfn%TPksz~F%L#Gn zla$6~M_?NcLX-M-aZ8&jnL{6klPty_74VcrIn z+W!3c=Qdo>Hj6dsyCXTlAN=2YeGq^&O1GA&Ql3Y~gNgXy{lhS1t}gKCy&%a3&*9r6 zFlXP_oL?kI1uRG1#@<}OF4<2Bjm!2`=+8yr_EtRlQwD94wBi$xMMPoIk>>7Pcx_*V zEw8(V#^Ly^jEZ3s`5j3I9&;KT2AQ23z2d%uvPNsk@_fsg`JF9b4V7?MFiD8>e65s^ zdN?VCdi-^lkg#1ukM+^oHE(pZdLwOBqzd>TwH4mFQGVlasdB+{MuXV0O*O|Lwe`{a z$-ZI+1#KgeYG{rFS)A4q(TJ_hnPNJI@<`{wIN#u^9PHTFK6;Xk8RmCkV(NSY8^?(P zv?%P8ku_UoNnX+`6CoPjs=8KT?KaTEA}vd8HeNu?bSz%kq?y~Y#u)#2381ICVmE8O z-OAZuR|Pf)Lp?CT(0aZ`w_$tkc%xM=47;~YDC|)r>zpchUz?7ir*gx?BB5!-G$nrM zZ2@gc{Bv?}(BO4$&|E(Eo3Gnn5)2J0bIDH!U0a+QMqWiaWp2mMg;YXwFeGOZ5RL3| zu~)uXaUk;H*2X2}(n~g&G@}!qMdMj97BnkXis|H(MAvZ{I_-J`JdW$QxK$asb;!V&6*gkNsrDinvr{pyK(8tQsbH8(Rl_aG$iQk7ES2ltJ$^RN z&E8f8TQq6WUqf$TT#=D^ZNa#LT*sPHXa#hd6j|ufQLZ_~3tTW5RG*F8Z#n9J`jW4m<+$q9Y^)9XJF4r7Rs)OMtf`Tj?@d%++0v`-z&gptTim zt0LDbR8lxjAT{Cm6dJ&kQ)W>tGHvKPD1HrB^Bm7TpY-?J95sy6K#D1x*{fr+KJUvm zAaCJ8Pu?ioRZYTC-7;M*dz`UEuBVI+&cD2xT@Pf#9xdHNT2Cp8vWIu`nd~JMUmh!X zDx8lEePYn%YskU)?Cma6`&phnAf%_FbV z1)*?2N&QVU;oedtD+sEo2P*XRKIoIJw{FYqyA*TM$~u!$y->bt98MW`RO3`axfOp_ zn(%b+fem1T!pQZuL~L_|08WdKA<9jz*tC0pasxsqX|Xj-%s{b&uVCY61Ged%}xH^(tX1U#5kzxIx92{vhAh`KH*%P+3& zwTM@&$YO04#3H)mh?TxSh_HsqsgJ&}Qt%}DRM0%%JFAhk;$CI8Qpbh*t``lf@pRz? zr|SS$UYW4JlWOzZV#9#a2blvtdoGLUMdmuvE4XX{kEgp%Nrb0|jnozQ^n1;R#~FuP z$`(_&+~g~vezMx0W{(A56~59)#>skLT+SaWbwSy522N-vu4GgcscH@b{TQXk#?jVp z^G5_?{-ZBvWxs-?+Pf~w_#^x?HE%S>;julJc`rb4_bxbt^hcVFUao}~1R1$(l(n_JX#_-NjS}mXKfSqRSclKTgfL8tX8X0g! z?c>^FG|$9rqcclYX&h&NP^aQ?gd3l;Kwn^=sYa%v4-~1`SH!0uO`P91uUKAu=UkY` zsLOYG6)Quc_g$QdzMUK5@f=7epD$6`mrj%wxA|e{OM*BYxvX!H9^rP9ZbLd)b0(p> zG$j4&H<-e}-56)v&>!kucpPwNw%(3R-h)JdL8p9+_~;B20!DwTUdlA)>M2zj%kGT( z8iO2i@mt)=eCJAxjkusms;nYqyR-#%DWI74U)woV0YOyl^e7LycGqo!qBvaaKx zK>{9hc~{WKH;jRUYt+lz$p>20ss5r{A}eE`WlauwQ^vS9=O#JurI9^ky1X9c3P^S; zD3V%+MFK&JQY+p4Myo^7j1>%-#gqb>&b$Xi+Hyhjwn3T%&QG3zLqre5P$MVgG!>F} zQfJDok_5({6Ch%dr@R;-TyVtUwQc6Bzufyt z%GoqCx}P8NKw(Ss1+*A2iJMatX<{E#)K0;Tvu|6PgxmXbIIB zve%nb2WljV$itrV;}+V;9S&p@=Uhsu`0Ah=rB+}S@f~k=>By%37e!)wu=sYh36@hi{_j1 z4hxO++8-Ki7D}-W7-Te{l#9pw1A9G*4$|AON}7#H-BBjy@3**pan-(GdAqrc@YI|) zuLmCUz}YL_cFwwso@?+Z3tc_^I9wFvh)7tqm+oi_Fmu|NgjmP!XU)qt?}Or@vpOew7e#NTB^8%hOT`Db zoUaFCq&pcf4W%WOHh;V>oNmr3ma74ktTqT1M-&xYS7=;vG4SrY4i-vt-qe1~8+VLb zs6k9^r@wL1bgbSiO?U7*RGG)W1sQP=^W^nP{}?N8wjKsc@$-_d)%bK&zSBP6xE{ON zm5cAeV4ikVC)pZJ`F7344ZqPt^Pu{{|3=AdV_p}u8w+Le&I|C3aC#P<9Ve@%G0sQ& za%==^nir?8r%-h49qrM#rQGTt)jrbI`if0Kp&pF*9&#Odm;Tftv2Zc2%a@6rSv3b$CH8VO~<@;4VmHVM2FEw$On9#RJN{$3ZlIAmKyYuY8qFr>8}#U!Zsay zd%Eg!J$chYujL*lQ7Ay_MWzo+&BXV__iBSOrKk5kt_XWc9l(x}`4pFoHAQ!rnU-xK z_s6L>^#%GMJkR>rZeRC&rK1p6g zh8S8vgxPVuS=jX*Rb?(VwOQ{Hw&TJb;Y`7(ZYoAMIj*lC#^)%OfND?E9UerJ23`*= zSnq2$k~p^Xi=hF7gdKI6#~*~Hbqd#j9~R&7H0;~Q@|nX;TTxNSj(a2+(nPPpP19$C z^m&5G@I5oE%>5{+{(bSsm`@~+AI1JYMvCt6F0MLdrP!4}+*8Hk^>y>8C z^T#nS0Z1*csoPhS((sNb?3aFu?w>8|F`1L!Tt!YXKvlA?&XP9>^##HBQ9&BT4}(46 zHIZs|D4K6c!$Vo|&pZ{JnX^GYBow9a#0`NB$xQFOf>(tfrB8m7fZ1m<@=7<*=F6Si zYSu!>R{EkXykpACh0CRt73}T5I!o}-Ld(+lKRZji#$U(G8enwddtnAq(be$U%~#`% zf>m^NseByxj=S(PH1^Z5$zT}Vf_frH8@~2PV|WyrNDO6nU{+W0@Hf4{O+xO+q;S+B z!>;Mc_sr<_!by}}d8TW2GP~f^zRRn%?zy&hYW>A6@YynY zUq9Aey*nq+MZq5b!8IC1jky2X!ylr}!%GuKlG+3iG`fRzyOoVke)jP@h_`hD%k6Ck zSsA4fKQom61^i5a0aS1=`nS(t7==VqrIwQ(1p^7BQjA)`l8MYAho#MRK<-G%bf?vanWgd|Gor$+^I4pP1wTkzk&pM72~_XF%4USmy-)L!-pyo{3h4?WFhUgu*EMq$~VXT=DMA zc|c+C^Lw}=J+EX+leM8Xb)m1VK6C_Do+DqiQwiF3dNEnnLHt;01#x6z`JWABHnv%X znHVl%neBpE3!oASk{fN>uj~l|_noR;5Vq*$&7dv+n%gIoOCzzGaWR}DY538s*6=-8j;dEO-^Q-(+f~kPg5CtJ zdb+xe#+t#GNwVdPt-pzMsK**vO_8zo%-zG)8t`cU%6bB53U*7Trmj4dCfM@Ke+W0F zy!P;S#9(LE8FBn7O+A}LP0*yt4!PM}y5E=lXjw1~7U-_=fYC3j1ZkFX(78goRrL0? z+!TgrjEwQ1Ehh5_PepvbN-_sN1E=ql$W=elpj3B>WXo6hFC2|;AdT2){NCV;*}FYm z5HF9f*KB!WgT62}c|-x&BQsSWA_uJAwI&QOd9WND1e{laKxQvBv-Li#z3mx*o5Mj=j5)|^< z3}(J}p}Ghul5(xs=AnTZ7o>E6cDbvl;dnF}jSYU!M1p|sor z!-R}GquyFd#A-hAyYOZ;zVD&riwYT4<(pX2&QgHz$e^hTmNuE{x?6a$Zm^W?TKKr{ zasE3{OP?)ChT0N82bp~2ymEIxQswlCa9!Fp$Ezk3lTPX}r~R(sXXz%OPACS~vEG&~KcZJ3_Brv=cF5UbI`hRvw~PQ9rJ0 zZDwPc#c@v&-x0HCO_i7(*nw76qlxM4dt`d|q@Uo;S|Q$hfewgcPMtz=nn@)-5Z==Y zJ6J90TLQ#NY)yD}-C~I!%LYaUGRfc))dV71Y7X!yApkSJ#mCDAcg3581mWat$Lk{B zWvMu8kJ%Rg_7I!tq_FD2I(N)dSHyUjwp6I8+T*x0yX$qGEoLeFn z!3SnHr0|!)XLgsc1+Ij5-K1trOQ9{dFZ1C!&c+6{ueYl9=IvSVZm+wXFKtM~9bAIzuc4UG>n zj4vtpKTm!3rlijkqq5n{oD|d>M`V=Ue^b$yjkrIt4GfvQ`= z3hGXSo$gR$mWWJFGSn zkmEuY`w9tNq4$)GL*_m?c=fFBnU54!=v47~4;L)PtIfykE-F)_MuL#mx1OXu#~mKB zzrDi{e)`@v&Fj*1gg3jJo{MJc!N-=oo;i_vMw(sdG_kta3S3Wd zcJ|@VFlWYYBt~4fzzx$=OTyk3q5H2*bEAfn3VEex2l&;27izkPa3+W8+&Y3ZUE^WO zW-W@=A=9%GQmHVat>}lDuE1t;d2~m5|F6gf?ms6Db3DW zJC}Vsx2tTiGNYF%)>rYVB3XtJ%XqTzPCwH+q+n2(fiZ0nFq{d2JHo1VH9h=wGg0OB z(Iok}1U`n*jpvCtCC1@qOt$tMB<@2R>=OG>&vxbY3?|A^8!RQC}XL zo814?#z~eT`NBJASMYnE6F89f(N{qO<;lWxRA)-AGmnK)$%AiBK0_3)jyJxQ_JW5Au3H*r*7uZ8y}g}6Iv>nocx)3`Y*O@1zSPg(*7;}J+svu5 z)4cq-gj9!?p(B?9`}R27 za1C+(R0jvc%%6Bn81OFgB*13ql8O!}dAnZjWBH}$B&NJuFE_4YG}tVlpw7 z>$l7Kl?|>Mj~*P|k%#pi{6OH_8QiY*` zyACA*px^n5+<*aXNyZeN(i5Z77LMN>?D4eL`~skWDo7qMt%Y2;3oUn6qD|+0<{*He zEv`=+6zzO9TYXF5?`mZEO( zdSE;L!rM<6)JIjESw~fB&PU<9;YazB^w>doCaupXPvlucIk4H0f$ zv1q(4qeMd8VB?UOz`obV13UJhw>`ZWOIL+ge8K9X=>SEF}xa@HmjjB)6YQejG?^MCqg7J?3ZIlaAV z;f262H;;;ldS`%X-jGXOE3c{hqHN1(1-O#hZNp$#^1~k+zUnhRUjNs%m(Q8@xXHmI z&63yZi@HH*@IT8d3pvzk^Q3eG;m~V-WR_RYPpb?{rBy{&AE7a6`WE)s*V@ncjC7~E z(m|i(CwE5F9f!a^HaIZUlEhp!^=Wa!RW64dC2=yw&JSGM-#ftm-h7pdzFW_+Yx_mg z^{6rp>B#cmOS)14FY=*RPcvqZ`G43$mYMbKTWv(YfnmBkD03z={i;-2C}f=ti7?ab zaiWNFV+#H$j`ZFcyh=xbFE=0391{J`S?`(uk8tYWq^3F_Y3hB_Rjs37C>pge%Nh07 zJrUEab|B|=(nnmD1#A1Rw=kcRit20I4$Bn*mIAtFtdbn^?sxB771e-K2uDGL>$)e# z{U>HOO=km5{f0!Lb?_@}if3r-jZ2cy?jTLl?N8-aqV0Gue?Mvo5RUaXVi0pg2(MRA zE$p|*YT%$5zPA;dUGHA&g;W7h)NJ~Ucj6K^1`$Hb7cGI8OYzgWZl#(J9qfCAT(#s*Lw`|;%C@g{ zzHEH?s1%KGH0u`N{bWP;UWwvW^1{c@BmbykdN!<4%6;;=K7G#0~5m3{FhzKc|(8gVlJ9kKf4}2+TN$tw%KC;U+rf9Z}DHhl)dajmSTIOqhU!@3(bmqpjn|+$;@ebb1EIGqsKp`I0SjzQ#O&l?1wtEe<)m;szP{2xKpxz4|9B{df9?msgB*^MvE|K#)tYWl~3pimc^ zdIheDPZ{rse$j|345`1EYE{qSdaJ+RN?*UXul{23dUB=vjiAzMfM>J1ucNxQFXQ&C zmI(!zs;cUOiZ7i3sky$f3&Yoh=45qEO@yN*!rS_44cFmA-0+gZk)Lac&50eyD)S)7 z;!Db5=ZRXti67M zCfqP+lyt)>Y^v;I{qG@!CTG`tip6b`%oP@jc>Iu~#o=odbS6rxNe|WLKf{c~KbrXq zu#nip^)A{eW}SlOWwj-X4{r;NQhb`1DUT9bs%gq&35wung( z&I&{7n}RIjdDwN~|d-xuo{X`1x^2n3}y?{U)|6>@6Bq$)aP zhlw?_O3wZjGE}tBzganDWgn8`77C*VA~II5nb|$8CMC;Dvj?;Lufa?BR;DuKt=(E5 ze%N^Mise}}_1H2K0Se3N5s|Parw0ZGuy?hHGZ5(jyr^2I42XmC6>=m5^)NW~?2BlnxbjZwCE^v_E16=== z=*7Qz@-~L>p^_NwR2lnsRR3?Z4@vU|B)XwZ6|(Q-2<~jMncy(1H1|%OYP1ZYc;GOt z>@d}D;W<2b*|i(6`!9pz3eCGX7$wslXHZ4Y3yC>?hYG2a^(?EX9g6U7Q7tR)8UK_Q zoK_SuJg~Yu-5w~$eOx7YRUkcbum>Qm@G&`i->L?*1xzsPF!;?oU>M$W!(TtF74f?+ zdW>iHlUAbD%BGEuxj(tFeN7u*$bP|P*~#@E6bt{a7U6e)5NSX!Vy(sa18C+q#4e!L zx7xis0MJevTGry0DhVE4t=Q5>7EH+ycDD{h%jkDnSqkWCmPBQ&Rb==tcn*k_A3_ii z?qJu@q8kQfEp6*Hy1Mn9$BW1h=a^J8G7-Vb8k+9uIQzs6sh>R~2-C$K_uVKZ#`(co zY{Ict(D>W~w8N`-7L(8Witr%_N!J_+TEpPJ)&ZUeHjjcloIWm*%S&{KnBGKChl7Le zu@L_d2$#8zdOu;^($a2zVG|l3SV<7vo}F`WvLd`?K<7w)j}SdC#U7`6{H46YDrub* zl;#w1q}ZcOt)2egH0HPs6G8i$4;h?UWncfV9ytF^$H$GKO+0#bl&yzq_%S415)4Ah z=kk|(7L6|4!pS!|$^MmIODxz425%Op8k>zUXKajOh(NiNyF#aTKVF;7COKAo3tgaXVYkCi4E%lGz zP4u<@8Q1lDXlKE|H<1JZ9=gL;aFDkT?G1m{)(^rUBr2+iz>3I^s8G`PA@a!IF@05e zY`;&GVU@R|Cd}`Qp@muNslT(QEO8f%c=aW!Pll~0JcM?o+b3z&ZBqB_8h?ZrqR0Iv zE^Ls5QiMwEgHEMG6E@=fK zd*0Bl2w{@O=neDh9S)S35QK6-Vp=kre#Rj`GALQ+w&hi0GsipLWEHdoYum{w2j ztZ|n1;=>o=cX4~!y@0V!D))Diae`c(@FRu|ribrPr4k>dssD%D9sf*(Eil*WuzJDR z#m|VYs2TPyr;74`5O6CzIJ7&fseLeEjii#9?ioKr8Bs-OPM*{Bi{*!=zWH-C0{@6X7>!2ng##oZn79Ml7#%Pu@){_oNR zPu)jwH4^?5SBKU#?t4QEh0|rFPgn*W&l;E6{*qV&!1u7OwhDP0|3Pu<&x4XiR8{B8 z@XtYsf0w&jpx@`NpB{2o&MHyY_OyQ}Jw^Tx_0#MS#-td^2?ixAh_3Vx{6?D=9fEI3l{WJmCVSk$Cj^4Lvk zGs5mu)aJbd;;+?rxxzz=>VKD_a$8aDL+)0G&i@o9{ctje_7>*eBG~ZWgy+AU_)qQ! zR}Q`<;WP9|aZP6hgqH$Oaraj&68!VUU*>sxM{m9=FQ41`q5b?>G+wd|iPsg^zrF3W zWQ$1FxaYWKbm&U9#*x~VDDr`8Ue^cPP({Bb27_=QpQExBL0%zV^eiB%Fpqqu#ntII+e2}v%ef=FxU zic6;@OXcfQ2z}*Eh&C0e`9f9n;-(q|>-JyJwK!y6!9Ikfw#1qOzb6Z3mI$8rv~ZZ) zcH(w`7ZM(91lms|y?uC93qs=5eH2<)-t=%@dyH@AquzMCKI2E*Nazht3xCeG+ZUXinIjG+@x6B8A@RcBBSr9;x_Iwjqgn}{@jQZw zhO$`0o0S>?j@frqNa}J(j^UD7ZD4tYidZy;KFp2}q4S6X1$?`!cD(Y&Jaufwu>J$# zNo1Gkf_(io){^@r)==mR`p=Z7*YSE{8{TpRDR1RGOJF`&5y-sP4<|}vcniVXCEpr` zvG-A{1yViB7Kv(tO&Fqf7VJh|P__=-Ce)Hixab+bmOFLW+^M zrH_;QwgkV)@rGpZ%qYE$i6WO^HsFM!JAa4wyL3s=JWRDwmGVVm;*YZs?AT}E$BwQLEEg( zLRhKKBgyOxCb0q1KbjI|XZk;X<(lE{-*)m-N33@K?a*Th!KlQtgy8%N9-xSp})!wsaAeV%soBtmT0{xfX7kCM5`DO;p!WrBJ7ow0YF)C()Er?)#-T`26Y zA+155Ai5D&=TG-tXY0#^;IU+EZWISbFb(-VP$z3w2JIUqqOY+uj@RobDf(OxYnK}P zO>g3ED{`AyK~g+Pj1cOowLzcWyWhhqU-^MW0!f)}!q&gs{lPhUYts6c8~B?~v+X@q zaWj!A=Rl&P^>cwVP$IldJ}8hh4~M^Mb@1@3C;#Brnzi2=H$OnRRnCl9CZU5CwU>p) zyvw!;XYLmrvmrXzdSEpGF!?$ymb~!b`bcRP^+2{da4mAkPi}_dQBGX;lOp0C>Y}p) z_%Gw{$4;$5`yrkUUG&=yyu1?^B$Mq9pe@1qF_KfyxKjg@eay%C=*ruhdxNaV&LQfy z?AzIMNlLO(6=!^8-w73m z7#ZsJQp%}w@dMHJ$Pq@(_h8p*-;>VZb7AwUQSM<wmCC^0#oXw#1BR~wRcCK)s`Pt%U>LdWw@!72N{KFxgHh?8T% zI8{{Q47XXGva$>b>#M%V_WoPH)o-vy&;vsVhG36|;ey8MdmNLmyWf`3gDj6nD15VX zZrHxizDpcVGN|nhuR?m7o;h6|YKPPK%92YAfo8E1kX> zl%@y;^h=X}Mo-%lau}um?MJ)PHqVi!leRja|Mt{2`;MoJe|xH!w)%4Z7~wwWpO+53 z9X{U}5Na^#^(ILy%}*!wJzr~3%IdW2uer!3xqrZka2_LWU7iFf=6HVn$2^TX%g>PD zbmG#VO9jE{(nao&`W&ZtKerDHV^s6`K$SZ7Tncrh_~{gl4{mF>Lf>%rz(OjqG>)Bq zV5Q}J3C27I6Ix{$yLk|6EO;d+oTvBmDMGbGw_*?mhGavp0VLB}d|?BwQ#@Sb#}!h- z5T{tqYX4AtDWu#c47ElvKQ{Qwn&Siw-lFQ4wO06##$zqMq4HdISk zWG_`Hdjxk8vUF~u6*|m%L>fHfHBh+0Qo-und7~)Wd&a@yBTeaPiQ!zt682tCkBX8^ z=N0badMMxX$_(krg<)xxfHFpW?mnGrMIh4`=YcJMDUhWSP+|LPLizQ+CTT}$#cknM zNx~dRzw#PQGHQ1x@$O96#@*$590tgV&{QXDbge5uquCa3ZLoZa&XriKcdosj{G?=_ z@c33Ih$Rf@NwJ-v=`ulOIX)h%MCw$!Yvae)2LJ8-OWL1#bB=?IiC_ow&S2B=f`r2bEPOd@PjtFgAQD! zmz06vJgc_o1#moOYnf`Teh=?HclwWv3xdx4R-z#MJnVhS_lhWns#8_FJ(~NR5w3A^ z%aN{e%Z}G(UhR-4h&%nvy9Il;aWih(PpYU{%{HrSmWesX&XgWiPS3Ygv9eC+$NpfN z*zB5%{Fb9KXrUeywI_CWBQml5k!-J7C}=*ImmPyeJX+(A;n<>++j|I;Tlh$5oP5?Z ztEX8HWD3vyWN0HQpHHojK)T=$IFG_cYbdFpuE|whVjRC+C1I~(Q82o49+C9v`0_MQ zOS3pAcM9fcPJYp>L;5B!IGpg~f=3BLWL=aTbPhi7J>16p+_Zej(}DrV7iq6z>qZrm zMF|JUW08LmlHOxhsT!!qDxe^RjwbjKYX4~=x)#bI7`fwsAPAO3zAm;9zmx+hd&B2j z5)y*|({=oFzgr8d+B!4>y1~S-vPAlR-!!>?8Lw9|B}_e(?{F*=my7ZJFo-@DY0T76 zt?VwTB#@IJ1)^W0{;++TiQJ0kgDi>YsHSz^4fyFwGvykhU z=2DjCwW~_Pk-Z(Ed84a`!iPrq_D0%E5(zaH_XR$Ervc=B5jzS(4R=F>GnRtEF`bt; z?X4Ot;gw1%ncG*B!n?lj)SASJ^btsn)D&!3n7`}HRsO!)WDrkQUClJ4!^47cL^ERVMWto(iw|A%4iRmnf!Th3%tZ$zn_RYm<94Y8> z=PL*Vfh7SQL6R0es2_?EzN2M88)7qA9s=bHPCvCMf#YW{2I7k2S0F>8KVlW4XN#MN zSX7qT3Rp`sMx5Fy6t30zpWx!VdVAuu?@@bqeF|5unZgn><8N{pvVWE};D*~InQbB7 z*)QD;@Kc5YVX4D1(xuR~(`rmLwv}@@1E?k~5zUKM?W*~bln*2mgx2W?4FKd8yULL0 z$M++V+063?XuG6L!+Kugy~l;?*~{U*UliOYNSyjh zx6Qxn``e?Mz?c_KyTFEf#0qca2rz2WT+WlUg6*{EWWPkJ;ayNQwG&}9p8!4MN zaE=_U?5_0eZs5J4IYK^J=&tZ+AK}C0Ontq0^W$-0yNl{HXNl`rK^g7=suDyWZt{~Q zt8zhW3EaYxoor(fzB*!Qu-M8(D~U^~>J3M0$2c8Iwd0ern`$q+Ozz0^YGT8#1SFYy zL-hDMLr#r?IpbZu!;iteEb$#3dAtWu>r^74@RVr5dp~lWmH~xm9Kp3wZ>IQ~HZLQm z44wUmS;R>eJry92nzx-@ziQL-T|V+fW~r+@0OM^qf~;sckD#{4BXzZd=L?AJKad{W zBXD62ns{J^ezDOMjGbi!!2H;Zf_$zaE#^{;qNvIJs1eEax&((HF*sp@vd z!}@V8Q1ExXVDucOgG6dyML zRVaCkWxxg>KWzi)3dz_^d$Il~znkcDPMyvOI%iim^KdKC0d~Ek>#`eH6aL=qkCIir zS!+~|*ZuOrQ$*i6v|3(2TXzkiuzCY+UgE3zCLDTigGLwUDZM61kL0>5`%hbO$tjIl z_?Fku#r*72ht(VBHYl71SfY<1pJ)op+|0iuXKFuIhj)Ofz&#zEPR`BOmyS{E_Z_>V#mv2ljT)KKOZdOfj zi&Vh~zZOxzw>e~nL`9h<;hwq!_W`G z&V8=XOJ~eBw}WQ)fBI~W*Zqy5)tiQ(YA#eeL`XCg{M%xQk~c~mAPLkr)zM#}^Fn#p z`X^Mz6QHA^LVIvlU5PIvY=du7ZJ|7T%}6w1QMHV=b59Kfl)HBQ_fEEG3ccrP{Txq3 z7=CbGygW>NUYLQZJ0whOw%twzN|qBPc-Ky^m3`sjm|DLenpH=3_-P+|`h)*$$-6UA z-s|{|Nw~6r(Rv5+6eW~XmyZVwx)kvqIRTfvt0)z_!yOcqbbxKiMeMNre z_X%%osqeLd$=A})U~hZh37py@4Xm+mh3Ce^?JQR(hjAuSY6XVvP-a8ScTaAK`aO1@ zXVKG+Xf2}Fc-eLqfk(16YdWWsFHaj@DM`3JaEzcHcg$yz#E49^KA6=_(Ri}&j5uqrg? zU=Jc%sMhyw8GF_Wh_+kQP-q<5pcnjX(!5|qVGNARrj|ETywGa-w#v%j`1)G4@9*Q> zHU{)}yFL=a6NK70jq=##_lwrde;lWKO;&1FWn?&4%9WuAmLjeNaL%)6f?`Zh8sFQk zI7_l*OTkrJzl%TaN=3DdT#@c3i<{=K`h4bZz4)?rE3rbKjS!_a;0i4k8(fLxHGR64 zI|aEAoiI_lF3W2Kh6)o#9dv={m-gR`O-;(y(M6BD;Z86a^~Gi&ygIXG`YN)=@`{bx zY@8l|#cp017FX#TS1wN2-rsF&X_Z=~T3aSMTNV#k$$(9wz5fvg`<_zAYaqE^?9v)e zH7BE5;D=G7+%fC049T#9Wv&^~?7SSLbCN+TuXqf115F0+LT4^WmTGIZO~^B${EV) zJgLk8o8=~dS3pS8;tsSWZ?)x@8t9ct!Nv~GIouWXV7P@GRZ_`=IiVZ5x|7$LL0do6 zBeeHzzo4J($}DS0Uon62s#(A`5Jab7-BdYgULfIXlt(hkn=!e3JXQ?U3@;4~+{7N3 z-0tJiwig5?2Zfw$nuI|PW+XSH84vNNiIYjJj$BDn%`vO>XDjK&0E3fxGO)oe{##7i zPgoiCFbWyt&TVD&7AI3vxfajA3tck>DsR}}Di=OVcO6SbeEB*2bJN(8+M=Vyit;BF z;!rV!wLE*V&j#4Ku9)g;Poe^YO(LR+d32qh5!hYwCbhdX@Nt)vR96F%LKXs4&qWn3 zUtI?*BXqvWZ>N(6*9gjn2PrgQMB59U$oL&ldf&CCM_@g;KBI~NTn>hZEJz~ zQsq&ptmlQ!tn>=Xs>bD9Ks>Jkq6)fMfxAuy6(PznD|!O`@JWiH?+3DM_qs9hWEhvs zeEAsQv<~0m^v%5R(4n?M5@5*at8ZbpbKI3?B>4R8u_Fy%K9S$M9C`an2O)S4HVX|p zvHk*;2vjAni;x^?P1!H+evkmd%@es9zPW?d!XVWIij}1?hKklNciTsCgA$C;<9K59 z*DL9atZEc>VZcvWuAQ@!!KS$-YB-g&WuFqBskne+b0;I`D~!rP2al=H zEo(!2j#OsnRrCslHZ#WFz`QEgTi!A9-O90o<~2&g`#M#7GNx~Z?+@8zQ=#iwyqY`x z@P-%=UmDfd3+`J*!Mn?=czx5wg&4lgOH_k8MI#Lo zZO%5LH@C?h*7b(S^HC~Tdu!irF+#vDN%IXW)Q4DlOPXfn(e zI+Brun_aLMZd3Im6jcM`M?bWCeKUE;gSfE1n-Do)`Y~+0tbT)L4?cO1N$||pYneXN z-=dDfYdULr7+a5_6L)MvI5fg;oR@czCzb4G{=;}Kj&KAKVGje34(J?ZJ5A zK>-6PD7~t`K*x{7bct*qwjgP64#Y{NL^>t4KlI%B(%l4p&@#K(^f8ZSnXk?P920JF zDtDoqGtyR?2GW@wPr`EHMnkUdg4-q4j2jBqGLwq+!dP(G*wa~xMH_gRnK8GJPM?`{ z|4b&`L1*&`k?MJpe&~VEdy5*@;19*-0?r1NI!J)=rm(G%vrp@@?XN>Crp@Xxc5$X? z=Cx?@)ppFxgDxY!`zTx0&o$3xe3`!?jM>_JJXL=U>tiF@WD*W%q8#Sd=8bedYXFiz ziMO0ApJ%AgmpN(F&1KUZxY*owm)6p7P`$g4ay{kL2=Dl%KJ(Pz%cl*cs0jlX)e}Nj zguO4h&bu9^HdqIm#z2$nAKEaIfBj@t+~ zo%Cxk0?>$gzwK{6oxt3<#1rF84i0ku=J7t{#=<=ueb@s`a$LjczBIq6_KofamD;H~ zS`$*06ILe6RQMv7uaHlquTQTKvt$^o+TY2Oi|1MmOQL@!Nwz+lx&z+^!>y|KW)QC( z8AqT*%^*#BB$rIRyG*%TBm*w`l#>Nz5<-MtR?aeVR7((Ut42695T;5eC$0FY*tUm& z^^%y&zK7c0zW0+6Y0ojb-M6xL-TOwsJRCH68;8zMGzy!B8ALcyNuQ;Xg2*htxz)d9 zI==B=b`>`y>;9zb(Vz>rB)PX~RB+uy1N2&EzKk@m8RQ}^q3O*;Fn^wS@qTkZNUmB$ zzP5fH9C8*MiNFbH!`aPDjQ5g2Va!b^<=!cmhXL%?N!(evXwyDZrb=I~$DV+;T!s5X z0Kr;>O`;LW>RQCuz=yHy!J20Zws<20V`Qp6lQ5SjI6Iy)QK@Q*LdBu`bPZNmW7#CW zid~mZt))Ngd-H(|L`LP3!Fi)Jv}P%id4(@R^C|!l*p)*R6UrDfvxRR>yLd%ZZgF@i z;ww5?9Ykm|2NhWOjCo6Qrgn7rb1?+Kv{@6^Oq%wYt+6|{7X~|Q#F>({W=5cf?C*Mx8%kfCTZ|qH#ar2ILFu8nYqR@1Q$>ik-(wukE_iJDl#5aS5zHU@wQ1J z2UUMFQEGj&CpWSxOZ@emB>WsT{FM3oRCXgOoUC77E$PNyP+{PgJ+pBd{Ec14`(~o7 zJaUf%H0%uCSIhY~DPnN;^KY7o?%Tf|Uqfq}C(FQowQQWp2^45xmth=C-YHC%V4=D- zAss>P*Rq?DP?oc9kN1Cnm8Kk?NyhVbxty9M}wCz34EQKymu)-#53H|oZxDoKv94^7#ETFig+^(tOo}j3*aM8s;${bn zeN5(r`WL3h4q)-^y{he-p{dBsx)h$<l)SYQSHRE~&BnX&raBsHP} zPZ84?uY?J!#jAv$qO@bV2^J@RTuM|kOAAy^!PrKS(hhp8D!B((H<3;xm<65|yWkCnwVXp82S#oU}Z z4{AE-OnJ|AV`^-Jz=w17wM2spKQLd`Zyz(xxYVps@m03eG+o+(FZ`P)|5k~2DQBP>N(C zVnpHlW$(MU@!jON#%gxyub)NZyjg#ZauI*Q{vXyA|GDY0iYLf-KddZ*9$OK~=yl4* zbg1VswtALg8#%vacCr*~zQ$M%=h1QVr4=twG@a0(=E%VeQieN`Bb>?{Mv)wZwDrzM zP!Fmc_;dibufqX}1thChX&=s47a}8jHIs&^&gv;uE{^> zM}Ru;AIb(M{oweKJVF`|G?8iaR@p_$V5m@@echSfapunARjc7HOE%8V@ZKNq~;RcIjedgg7q}i zbv_&UPmq8aCijzB@au(kXv;pCw5E9_k3yhITFdyrxGme;*UOZ^u3d*OeUv8JgI9Si z7)Yj!53#0DizNvB*KPjCG1 zF#*En7?|=BHR_*kBDASU3qPc_-i(p{OH8-&mQAxTHy|2-g@?x zK0nUu;-O_8^!;Z|z1<}Zo_*l!{Uv;ArL5o|2Bma;K~%DfIB;o-YiP zY#aF0Jqb?LzRKm6P1k9C&eLiLLWV7x62tM4MPni8wkS{i@p5!^Zwpk~9Sm$vX zbJ{s)*4FgBQIL=0Focfcl0Nd*mn<5buS(i9qj5-ovflhpyY+|WQTER{iyO+mXY~6( z!T%{!f-CDrA#J5 zO{9OzFP;H#njb3RDD$SNcs{Lx{8w2377{tw3Fs$ z5NS^@A6sD4?3(&iIoe_rkm!HZpYX2=G6(NrWmO0#lvO6W-&u^u@UV{a66@Ncl3Raq z=I<gMa6X0$ai1r~Z z38xO7(<)4#tu}&zmr_3MD6dE}L45F9`dG70MVC95eiFY>(8;-^r^2=^r-gN%xYrikgtIktgz(b=#*LqQ_iParb^yM2xrbmvyFgRFqLWI;8YFClq0Jj;L0G%yJ$SfVE#*_2fAH3R z|C+7 z`-fymUNCTbzJyVA`DSe%aT|Kzs>^AC#)*rlwL)T=+@;fI zA`y{i*Pp!yZXr{*!oD^k-vTFTMt?zPU;A!~e(ddBcWL*aU|?=HsA^x!>`STJ?x|^- zALz;KyXJqjkown1)ZU%EmAQHFUC7y6lWu=EE(HbfJTq zw|C+1tI%En0w2o?qoJgvZ=rIZ)DV0 zZp<*3i8zw(4)9{TbPmrOpF6CT?q|F36aw~>hzp)dTr0n?_o2uLt~1NNFwcHf<1O_B$bdk1peZm7IF-Vf9^v>`1=HDwTJ1UQpJ60?4 z{ZsYK;wb)yn3VU-M#bZIkUvB26KGv5zJ~6d+3t_HH4(|r%PO+IkIQLP%hPV8ItTC- z0iXKSW1*@btkZ_`{1Jo*e-c+%FV>PTh|191sa0#|_94#fGVa)`nvV4t{Z zdVureNL0E%nxmI?w7!SW#0B?NbIUt%r&KrdKE`ql zhx}X1ZBWXFXHJEeX9K3=#*2a~AgVYG$XA__lzl4bcts;E*P8A8Z>9O(|oaGewN#t;{}1-Gfa zg78c~&F#;kDn$Unu5~F9dmQbdcWC-pcDjY{uZ@r`g3v{T0tviV&bkl*1Ge9dh#9BW zPkn%Dd0)vlX-=&J^0GBOOO70u%*>>txa}7M)!@N|)arYCrBQ>d7GVx!Q=cx&G;}>* zW?Z$;t0>!bvQp&Hjuv%1wxT%7y$ZAfA+;N14UD`NqdY_h#zA| zH`>=1EqFOiMW4#BQ@95Y>_l0EW)jTeT+{{MFtWmMT#IvPa-!4&Knlb&zTFLTx&j3;t90R&`~^^p1T4PY~oF2+7jd> zf_-wUSv3pB*D*EC6U;MAPpx}tl4=EM72`_dHd`${Mf#YQYaR7(eSsREU$1XGSwC+= zN{s0)JSGjiR;Hp5LfOj@o%VsAH7Lm9o}rJr4bW#KRbJ4RSRBlo!o68f`4=XHu>IV3 zVtL$U7yr8fr}8L}-^!jN@OACXjtw#FD7Eny(J<+3b|?ZhH{;H$G*2DKE8fjOq2CU~ zpfR(@u!wfCKY4<%#PEnlyZ+8=i2Nm9qqqWXqHuCy+J2v+Aca8W6i|*cdJp{cT5QnLgc8(`wY{5XU)QKM=~W z4=!XOxdl&tfM%ekYh}fY_);T5SOhzP_srkI=ShJ@$Byrzqp~DrK@3xeZVq`;n6imB zay0}NybYM$e+RhUWHwr@ktY(VXsFSeqoc1|LKnG0P5L~z6LWzS8PB^IXwf}s*zabt zI~c2Eu>jb)Y?MJ2B2G*+j&FPN&Lhy-$SQmbq>tOTKDPe~ep1ck2C>mT>%S70x^J>~ zJ~)oI4cTmC?NNWW+Gq2Pb zX%siw*5OWFZZSKq&Z48HehOq8iA(>g%%ev-Sk*}+KD*=z-1QiP#;IC91Sctq1VXZjszS3#*LYsXvHy-+Uwv9~QCl7G*N3rc(sD;FQ{Y{JCvHiV-^ zY14U1V(#qk>NP)IMsh;)Ay;ra1&2nvv*IHVpTZoXOOujR0`x2vdqABnuwj+^vf2so19n# zQX@*>VWVs7db9Z3zh03=iy$ zL{sX;R=a24a2;blrj@NX(kRG@Y*X#oQH=4*LT;pZH!rZ}a(@!$*#7Wl^%4L0pI^p* z)$9SW-9DhRSpqGD&wrl@9XU^6be|@c@wMC9T8y=nJMa)yQ z0pN3We$BP4_*xwlfpZvygR8FmvHVa ztJ_{~H7RznP<3Zc$elSshW(&F@_qa}QImDw&#ybIy{cSKkQ>Yxck1^*b zn?$`zo?|_eoB8sbRZmw?&o$u7{-PE4>7koKvhiGs?^Ez4RWY$PcSs=S%V*v!u3kYF z@7LSv$^NtLQN7itf?N|Mr&=01?nZR7$t6lZc7c5|dS>-8rqYArmGJdb>lscN8+|+M+zaCTLo@|%SPeSxF zJ6~0dnB{hF# zxy^LIeqbi(_yHN(n|eL=OXROix|0gwE~#}-Vi%2)T7HQ|h;#~5K?6m|TN{C7{5JTh z8(w_3@>TF0ox5(XLfUBcdc3fiu~k2HC-V&R`s#Ih-e^4~a#SBlZVqUn@U?Knhcixt zD9H*{u+!oGd{V=8l0=G=a%EhE(f{GFb$s+d90h*^Z#D7zsuL*plX-^iJAvVoFqok>pR&1nNYliZe7{+5G~6Q~<8d4hp5oxE%eALAp8zZco70(hy%KJ2+9yF*Jc!cD^Rj zW9r;GsPtrZ_^f)j5V)X>-0?uxkQA*qJTG_b-0{G$~aN_Hi^n<$(wbJFOJ+# z5q)C++6f;*w>MvBi&eM=ne@z_hODbN@9Az%>|aS8k3*KD^BWR$kD6!c*77VWs`b8u zL1cau<4o<}>TUWPhrN!JqRJnrdaj+;_8-0my>E0H|Kt8L6aowsG7nevr;SDute462 z!3pISQ>v(O)rpRc+&6#8?hF5qhy0g7gN{7#5BcxPGlZ`K)^)B%8|a7()+Sh^Z#5Bo zJOhA7RRvdcFML6Bc)~`P7}LYX;zx+h%{C;-z&=f$KbKv!_cT}A?cJqP#Vs)6J0ZG8 z`E+HKlR9699SFD64>}H-5nQfzpq_n5w)76zk9VJPIwt9r7W?X2CcQqQU)y z>(F*F*!zMYlKidVaC~1h__F)IDg|dE>pBf5tfT4>&_2)2!yK_T}gOU=3B4T=BSP zd|S_O@G({@qNe5_&HJkl6cxwR*OOP|L(54NvprE#DU+BG{xLPfMdz$su*=oJWy@4a z`^|RVc==Qynw~$QbK^_(6Hndk%a6`M&6W2Y7cT^5YiX?3Hb64S1L^uBzj3($G@^%d+hb?^?8~%!V32wy(Kh<|74$Vu<&%f`uTvB zaQwP2#~`*vBJC27a+`gD_pt{0e{#WXT{wHy1_Yl-ulQs+EltVOPTqKS05Fzkbn5IR zKQ_*U6Q%-GXvTy=Ar`g`GsDB5dtzfCHLR2&UrGq$sBIGwlX!b*$HD$`o$YqEgmXP| z>xF@XS)rH>^*3*1}I416i!YT;z!A-i&q&JbNT$;Mg7G(Wi5FcHk@6MTo2Jgm6D zJbj81b&?;XJqM>M(aBI@{&kT0W!E%pg8dw~wPy@`4Y1mIhB(pK-BfU0p}l(chk`94 z5Q5TR!=B9TK8&URxEzl5Nf%i4s0Jc4Cv=UsjG$(sLI?%&<)_lFtcR+2zEB;zNAg^K zS-IMLE_=H|wRi5EjTQYR?Sj?vQHs3AwXbvaRe<>%@kDLTW!)a-M&7l|?Z#C@y0||Y z9>25pzCzCsz-D~T3EE=KmMfz*!bW<7z{)l~D3Lmq@Tyl+cYXr!O1ctGRp6S=&l;_1 z6mmO7xw`3czkL9cs$!$0@dupNNkstk&}MojFSt)0>EwIQ=HpEgVh<^g>0;enQ8rw% z892buw6s4}TLX zowN}ywL!4pMl!_Cm6mxD!SMMO`ugkD;|uwdw3UGk#8p}cuOsSdo-bFNdwiMx&Ij1=~D{ey*+Y)#UI*|17F` zy$CHS+T;?h%EV)mFR52F3JVSka}x6otR@3mM_jgqvw$Nd9ITKfg9hW2%tU9UiQ;(a@VkcBcyejJ7410Ga82H$qD)O&q51OCL zE$f4!;{;l$UkP7I7PT+HjhES#FH4u|$9&_i_q>`pqf6*;@+%(;o=k87Tt6*NpBig4 z#!}u+0?1P+!?9no`*oPP-6+bA?QJg5@lEnx#|d-R<}@0YmGoZ5y(MPX1bxul66Jy$ zp&Oq@xkh`RU&QC3VO9cNAaYv+q^U9EAG-ujxJWGQZmgZhHKr9$U7A3cA_iLWZ!-3M zt*x&57cQ!tuV>mlBW^Ax3-N1`K~0yL#XA&5>7ZJ?)4bFQ0?qII-n-hovb@KSc>OoA zWAfgLUk5Ca)RN1F?pb5)-iDOh6so8P*jk`Tf!zmCQY~gQa-tli24x&NCPeU&1}Y{^ zbv97LpWmV2EC2EDPfngv60a&M@7=QhgIipYD(AjhieWv@%%4xvJGn6+Bnk3H z0;vr;!m2r=5AJ9lWG3D7YM2dQqs#tEoXpwkjiCkbNGj!|uhAXF(&NY7sp{RPU~<=l zI>_Ap#)L-20@SE?3-_~2OU0YDRgsY>?5?Sf%y{(UfJcTCq>MV_j}F%SW0p%+aOIui z7QcCe!IAW2t_X5Zi<%;n&!F3$3cA(fITHJ?eU>kYdQ^$DA#31!!3=~G+Ie!N$>f3w zCGU@_^H{%!l#pfoJSTZS=Kpc^)nRcp&zd0#5Fmu$4j}}0cL+g)+u#m^O9<`>?mjpS zE`#gf4uiY95ALq}eRp^7@9zG2&UxysxBB$cUENh(U4F#08+{hx*~sg@+a~N8CFHnl z-q1CRdyRjmg{5Nr(X}xG8hIIS%S$(z2mav{Cph{3_8fS~7+8UNz^13QY5{2S=P zx2D>CKfs-iV>zqn7;&;8jAex;_C(!Azb8<@;Q2x1o`BS7+dWbaRlw&VAh~7{fkxuf zVPQhO_KpO(*)j`!g|@lw3c^RkclTHSE3ANyn+W{;hY!xsU@ za_dPfI-5X6+lq%d0auNk4g%xgcPj8G(-0y$r{{x{mxL0D__Axe3; z7Am}O_m@vKI*r85_0$21yi_v{eQ5EIdrJ_F9v}B^=@~%OdX?qY`hl(^wmukD7oM{w zJoubyQ3-p z_cy3)O|j<=*qM8z{%ZomPvPnzLw2G-lzI`?zx)Q3MlAc+%C_9t@eAG}$svdgTD;^T zv~dDjNXqnhe?umNdF8~@U3lB?$z2;`9m&EGSCXg7w4r%Fpqg_2E(g2LDRqxQy=4`- zyRnD4sT{MMJe%_~jJ|7X!o6JTX|tof|rhG7|!K4g__?Z zd0!oRX`E7jj!f$$SL4TF{dOUb^XQc;OqrAu5?EB{E7ZDqUYn`g+6CoK$yJTHdZe4d zp7pakS`5zKimdZ^1=DOtv%x;eTh~9j!rps4qxfu&p?L+G$0!PAR$Y(8Kt)`*9{q3&D$Y)=N(OR#c8%cxaQLL z>2G~CLcf&ALEGyn^yQUuNv3#Tm^@Sh)W=Zuf%OnOvYPikoj4VSpyJ4ybS*zPdZ*27 zTT$Y|#jxp`?zD$CPc&hq9FuLUP5RDowQ}oU*oWvEeHAE33%g8jUJC6eEn`)&$^hdf z<%MmTVgbpsf>N~MdzKA!efMA(rCT`M!ya3YrRF>9(C_gjd{8dzgI46aTxCuiiO~U1 zB)Bn^V+olLBX008 znmq1NUUS7(r;pmYWX+Rn89#12>q@v4A}bi%`m*8B1m}%rwsl4I;W4mU?_-3b+9CUt zKK!gYH|rSb)4_#Sn!tD@tk%u8%EEMpZvi57+^ZiO7TiiUXVGn1=v3bE5Zfc#`4D`t zW6C5c5^m&;!iRcoa)TFkL%CPoa2&xr|A@GYtQ2Tc7XKx#S(a&#_?dpwqXxsm&6gX;QRUO_{oWS>e=yf-iK-Ta zwBenATVhfauFNe_wE3W3ydFmDpvwMnxkjNDDFq0jpR^F=DYV4`85puwVf4}djH7c5 zrC=1kZCPHecGdHD9!41Un{icG(cI||{h`BkLkkL%+l(8twaIf$iF1=$;e1dj+zICBW-L96TQ-f(50|K=Y;?oFht+a>&cK=2$eeAWgo=z+*XIXnw^y6w{}I$~H$X z^YC(d22cJ~G&l+L^}f4)@l9S3@%3#ji{32ddMeN+i?g+h)GZI`{j3yaeY~OA_U)hkOhG`2)736@W@Tt@Jogfgv9&$axDD74e%uIlcH3raU|wOGZAy_M1rU{68Iz{Pk3FP4j;~(O*0M#7%1c*tXnMbZJR) z*Ds&{saQdtC`J}px{<$CQExFi~Ip#w-t^WL9<%c)}oSYOguDvCto}ABfS6|(m zL!7kT3h@Tv{pKck&%fwfm(dne^9gjWbQ69%(V5|ub;8GDR+IB>PtR$>E}}R8(7cM| zGw%hI??*826Er&aI5N*Wn%;iP58UaflwrB8q-7|ni*B|eE#}U63wH`w;9O)o=Y>Z) ztO&I2Y{M`Y>jH<`Ig8+DPN%4}0H8nZB0OCtcfJw@Nt@rp((eaS+hg zFCv9zvMnUK`T-727;W#$={T>OHd)Y{8n>2-^pW&#Y28^ zhR@cxH%bW%5D-VxmtCW&#SwqfBve1GlYI&D8Ou7vJ_dcUDHR@etD>0?%$=V-VvN^B zpV;IQrV`-D+@jaaus&713hQE$w5Azbr!qSu)m|Ut?zp7-Emh-KlPdnmDi^OA8LB~7 z?rgKsfT}*HU13HQ1ry}hgC_b!Mw!=H-Ie+=bdT5!!%WK=e!eu%TncvDMC>1vyg<9T z{fA{dShc6jox?7={q6|9RW;3cRF`5Pz4-I}E082o$zk?+A3uewhl+Dx+)ySmPQC+>fV6&oDVikGL#|_!~5`3dz!)yL# zgVt>>g;h$y9I@qQmpzBQsWD_|`_R=#BWD#%4Hx+6o0o>B+DjI3p8eFBB zPePsGWC?c=S=KVCS)55l`;|~uqy6@sG%)14rUTr0$GbsA_GH_KafP;ec}>nda2^l4 z#yk)l%@-LM)Zla^IH=kr>ytJJ!4>Z33jbXnNPDi%wZnDBM7N~OUF0@z01alrA9b2_$uP$o6$ogA&bMd`8j_iqTUG$~z zbl)4Nm+Z<1=;l8s+v1_m$gBeTm*4K=z>auc+)NIc+?M(2N)V$}g`mZHajRfVsW20U z{^8n(260TbBIE&jFtWGL&1&`6|A)dc0mh;iH2u^pZxR38Fxi$(A))lboppF@)tvwT zVd15Wg+UY)-WcP%)=F6e8%fjE^J@X%V1J~XoB$i zi^kr4U}n_gm_tD@ChTq}miUTeG$Y6SJIxjH1OHy=xljl0bDnq9tmoK_@03morKEkd zox{}|4sWrvJmoSVrr#L8sA1hJ+p*pvh3)B9j}K2}bTp}ruWdKfDKd7YCkP?%YDrTu zg`w`+R_*Uz(|{prKpJd)l?{EuHBhVE!N=iawQ^vsl+<0Db>EA~tQELEP|vkl`$W6U zZ@wtunjedY&+GzPy@sfLBtWWJK@*!Gbcv_YLw9Pd$UhdjN1gfTaj85aHY(JjmZQ|z zdg8OLQ*wlAsxd^$W{SAAIam5+A zA>3DFKRo?YjbTVpw`ZPzT;lb!+L_oQJ)^e;Pt$Jq$zI-y#*d9?>_z{YlhBL-3OpVg z5D4Lzk#7;zIkv&h1LwfY_a)(x^afsR!{jTwvA4Jqb-DxED z7>h=ama{=^qX)InRQZ9n_r<9~mQIDK>nipuL$w{i`mH%H8C6Yk>K~s>-QCL}7|pgC z(xjZB@<-MP=%H9Ru&+tGR?s0OCQ_{i_%Vo&T2Z>DI9*7C%jaS40O@uiDH*h?GrUrG zi<9wlIC_g2LVZCsnnBd>!yB&Bo-R^VW<_U8S<9RI`*cgVa^QT$O9i8i6$c31^WyBBm@K8nY}8B)FD8PO=x2ES=f#cG2%i zoP<*DBgUCGb$j9F{*k-rW^w$92R9qu(a$!Rr?7^zn*z3wd^!Qb*oZD=fueef1_`hU zi(*0H9m$%lUBDQ;vwK&xq>gywZt9D;@V)a{%enPdB`J6P(#A%oa?EY?(s{1O^MLBJW&Oc5>}1FB&J9j_%k6-sOu&P2llw~~ESD$P=w&3~ z!4M?81^%PoO$ps+FbBHkFB%Pf5`+e3O71>ULb{UEVCZJCoJx;0rS8xN;c6 z4U{?NlphF^jMIR4?X}L=O4;q$R2k1&=_F6bw3dU_bokODVe`CVuYZIJ;AJzGZHT`O zlB!wSBo6bZ=?%W!J8{nb0=HdSC~ray$sm7^T$0!ewZ$lVl}JrF@2Wszy=#S)J6xmY zYn(V@b+(rMIxHd(mUF1cE{-{qRVKDY^I+AwV1B>0rCL=>VN*|4^keVr0qaC1*dlqw z4+#V*yXsK|F!kxGegy1UoNdqt5BkJSl4&6UrY5t5*uzUdRMfT(r}Z7(xrgfno1~Cc z7*~ltq#9d0Q(Fs)tCfmMCI?@>pluEwQSTBC(nC@dLrWa-jTvSJ9G(>#}$EC+H zx=3b?+bdi1Ueu+91=Lc{J?tp$-`3H9?kzddznrr74`vhnz&_15k-?Rk2@LuqX(i9K z3C$Km)8I33S+gZ}swo3aaAGwd%(m8PuxRQUFn0&kM%Iup9S)gS`=5KRQ_3EuA`Hb^ z$?b*EJi6S{$I4jiIU1&HvKx84Sc+uto9`TPT_!ACj(r-rc%SVuBJ3e>u?@+Lw{jAD z`UJe-I6=}by!cc~i5cbY!(`!B$E~{8rpMt8Q43ddd9ifdI7#Wi{d)aUn>OgLIaUzp zHG-XJB_|DkD#6F5<`9MQNRa0~HV`UDq7<|x>~#K4Hq;R2!4{OnSW0`fHafnY>IHT& zatS3N15yl^%1A_}od3*(s}*=GgI*%p^vi!-=pK>|N!Lm5l(bq%GWw(Z*Sv*@38o|Y z@57H3dJK!UOCS8wMD}PtxH~LOqby!gd{}=gLG%vcZEaD;TU(_MwLLvn-zGl;c?N>7 zOdh8f^i*88N$FA(q;rgs)TLL?Ia@N8NHa;N1PnzvP%RbMUfT0aB%es!jhLh zOQD$kij)?=B7>=3E!vzm=B@4HdxTOp&jtA8lJ9f1#wKEm?;~l-aK5|JF+2*%948fq zhiFEqN0s{A3WTo7cu+fq)fC9AUw+qyJH>j2nE=EEsD{6>8;QOPV@~+xpG&Cj@+Vg8 zYVuGQ1B*MP6Sw@nmh~vzFqzm}kXi8Bp%d`-*#wO7E@(z^e1gg+ z6Z?=O=q^ zwXZS^kWO4RU-+-+F=a#I0z9=Y5$pwSDhMpWbC{hT{Ftos~d4Ad2` z%5VUGNR2&c{47$^W~8}Oa+#r#8`^U{8&7l8s8f4$48&aSwc3p^)dUJv!P z59FnDuY0b1j=mXDy%?(}kW2on_t!I)P#b^0z*bR-N2S(6(}RMOv*PvLmoq3t^lo&m+AOamss$bX^-w0YoqG&A;7M$%N;vIzQLSaU zMVky`&!H=-(M!;3Dk-zKDScNy3~`_BMrrK~;|(s)+~5V5d@QLJ3gdrZT%F;jJTdP5 zc!lz8ooiE8H#B)`)SLM=rVdBi-pAU=?C99N(2?Fmh+XT?Qo^@TI&h@E&pvNQst)BU0JIP=UMtBay#`QieBAz+_c=ywO~Pa=Q;Bw9|t-NoVFfb!h+q5O0}tQjo>_{lz4Yn z8bg0kRPDlnNt0j$f|af+KS?O-k9B$@C$vxyxa8>v)R9XL8Urr*-L530k*iZ_q*1h(plrg!VMxd+#28m{$85^89}!vxiXoeH|g!(U-^?-71Ns>K*^kd+KWq3tV8!9>Df;eNwCX4A;{Ma zURsE)_exmZ(l(slo;}T{o+IAyG4a<5+sPgH&9}TUiqOE$k~TwdOD@f_$q<$yRk3et z<~d@u6D~YadL2S$!CnG_S>dY946>+M#j4})Z7^l2HH(i?tFXr;R%Ge?*(yt4l(=P* z6w;nSA2~qOhwq&yly8uz@1?dhK7=n8emb--to!SCuCyxzBC7_23w@T)h|Gsd@3i&{SC z=lG+KSm7qmN>70hpn$XS;0@0{B8AkCGB#3AI%?Ce#De7X` z8f=VIMVWPeeV$kNwa{gX2NwIi@B_C@w_XW@li_mV#|P4&%|e$<=447YDSpN2mLCpC zQonWxeYoL6n&(9?-?;Fr4;^04kj(}A0FtUTi-p+qu;U2fDNOIIm&MtnZI6TMk`aWu zWGyybml@o7g}oc?Zr&dspQHNsC^iMZe2O$h-{l=uuF>_nwmt*I0l>l(#^irQ8y`KL zLWGN6*I<}nhhdR|=$dM>au~c~k5nJXOQS_ceLtqi3FQrEyqu=evu3L>4Y&_m&B%!s zT8wu%+PM1+rr}-7wWo!@@+MBU>56=rU8mB|w5XOF8&$sim^+;yLPDTMVANFYD_gCN zc$1k2QM^u_Yf%T@*dIIm5CPjBcu8i_PgZw~W@WtTFC$w>3wE0V>{n69T za?FlP^C{Ue(SkGHk|y-q5|DJ!*?=tpZ+T7WieQ_cNfDq5m6qg;nT6aR(OCcm+BBig z_iM8K|SUzD^NGW8#$XP*57?zU>+^c{N> z@wY8$j@CNtzRff(G%ELRlP*U)mJtqKy|f)!pE;=o$Q{OZUwC33`=&$<1t>fbZCv5H ziciC=!%0N zv);8&x8^n05g$47T-pfD8rI@$>HC4|pWZH^IOHAtkObCfBLZszSuw$vzKXM@>MKu7 zTG}NoM-a^t?zV8l>0H3dc&Tpv`iPFp!VjGDh;y-9Haby_0IMz_4aqIa1eK+YP7~3W0%zwPBhqNvAJ)RF3kj-r z4Xd8hO9b6xAM;1b%zm;p(QChlz$*oEa(=I4J&gM?2kCc4->sM;-3`kl^RZ(z2>%s$ zVtGMN+1bBsjoNEb(P{3rH>P5{!VVBD(9Qib&{O}{Pgr|(%IeF@0vq~zjjtjJYUm9a z7nAfivla)N32j07sQ_k(yA?1*=qHr)@HVN{6h+^l7*E2y>tlc(@ox(xm(pq3iJDoy z{Mo$16~o~-WsSAT?Dm4TV^LqfjRq9uPlD-$oVi9<7q>A(t&+sEu$sQ;GynSdoigh9 z0;_^013nV2P`Cm+gDaqU-apVfTH=Ig=wDU&7pZCwzK_&9Sg^>-SW8WXo_e3@>;6lSL3$uL1JV%U>Jozru-6=!b&- z27LK`j9fEHe^0TMimU1A>Ekg#VFLjN)=%jyV12JP;kgTZChn#6j=RfLd*z6O3Df#Uxy2)=<){yJVbx*nP*k65;U+oE(yO+sPL) zQ*1#fptn-9T4>=5p>@ofA=WNFXM4h0!aU^9+0n^LIT7$t{|c(rMR&UVvzB*B|EP`c z(-E`q8|Zjnj6(1ajQD+unZ_VyT3hKw{L!pv4r1+=xu%#8T5c|6M-sq*01)DVJZKl? zw8&h3-06q7ux!tKC2){lNMG^nNzf?;KXtK*YXFZ*4LwK|yCwY`5EVd2Z7uTDrCSIk zUv@#lo45B+)Qyv2v|%>1#Y~5V4eYZN3D)cvkxCRX8xw?$!OanDQ?YauZs8$8ds?YD z<%PRafwBlv5fS4^z+H!~XGaS2afk4iTX7u<@>x;9&|jG&DW`WqqqqzOUv-cHtx9Uf zN!rFa*NvuXOL(F5P5gN$d{jvZP1()^*insdQfZdyfpay)1vJSmH2Gnq5H}`n-YKP& zQN|F#`l6h=`TbEcP^P(O5%sdYed6;^Tu-$L?F(ViiSBqsxr=srS<#?Ejq-w zI{$tW5p`x!IZ`Vz4wtFuJ-O;R(Vi%cXHUby1$ofJzig}Ktc;89JcF`Mq9WE)K3?G$Gs6vCh3$N=T9IUD zd(WTPm8qS$6r8e!Dd4k%o_7~_ewRJLsE&_#?$=1&$~siaDScJkPt&qHbs<_s)A55p zy}PI9F0}RmN)!Ek@V0Ho6O<1k8z$}f?#VD0sdRN_)EVZ`?;zVoo`0ClNKIq+k<~)D zjL`^2`$<_VH1e&#>TC*k30iZ2{p9!w1-qu{<_hK@;4MWF4ujQJ5nF_k>(vX1mKiMQ zor8U)h^0TAy6WhUh>NsS2N{5 z8sCvoyLIphgARAFX_rQaXru**o(<)dF;tLV7ErFFZA`|N5XvA@8PD zAOBNJqvX&wFDNGopX@WnQ-DPvZRs92Q)PHe7!Ea^PBDdYoZjG9oVuS)=yLHzDNIK% zpM4k=mpz5ZJfC9S;;1912b8g+&AoObyuH0`6>m4B8vYO(zsDx{L5}nb-6VwVnM&=< zHO!sziL?{lAl~pqSbgqz=cz1IJvFk40SF{Xds<2|54f?Y3 z^ciTOd7DM1xJI~Rn^Ie+5H8A=zI*a2xWxjZq`^Ke-EepGsox?{bs6dSU8ymHzd!p# z?Y|#W!jP||g8d3Dqi%U~tzH9N^43c{GFiwj=*7slB3<6dFqxKV!t=~hl_Lc{c)2vJ zH07|FAWix|oGUqlDx+6HO<&0`6AAUKYygLbpe7Hrl3CnyIn12d!G4+OQt>0!;NS?z z2cYS-CIZkD;Af=sgHS6J^Ne*$LsFf>86c@HaR7-ZJwg64qdHHz2eH5{Lq@kSIS{x* zXs2Ydf@DPwtLlI&B|>sBb?!Ie`iKR3`>xGhrwC+ULIH zj@v(KsV*%Gu$zxF*&zah$a zQLcN~)bzBd)L%p3je5>sDS3U6waL7SRdEZH_akj?_)m{ckuOna=u%J zET|6iTq>~kS!|}H#`?YoMDUb^;HPW*tlXZ-r+y_d($)j)lt`!O`9-z&UKyp{WaQFR zUoY`09&1A_!ZP{q-g8A2KlIOZrE~Aroi&H^aXs1EPhYq$ATzexHGhVP%aQ!m9Lh~e zA>f-?H21OnHKpVXFqefm=$@q2jQlav;UEKANT?hI!6*FJ#t(=L`w}W*A3y4!rwFxl znJxNPsD5%qdr%A2GKgS&r^Jw7QUu{k$tyR8h&zd2x`oB=MWKvQg_S@!RObw}f;ISk+8V>o69o5d5#`&!G&26maOaX zKCD=#0a;2azgT$|51QB~w9|*#l20(Dlqw@0w220F@}t?7ijcPixqebs%$i$;rG)tO36+C5I%woh6|Gl6(;acnRRr9nh`wcuIP(aaQ)M0^d$aodj5)sW(VG1C2xewv)hMFi=JnxmD}fIsl+Y`{ zKAF0+mco(UF~cYm)8?XCR!*R=<{JxBP_asC%46zKA(4g~_#pW=;iVu`KH9mb!II#? zAKz2|?~l(pFZID6GJmyT34W~)c@JY7vCTX(>ZlizXnqKTBcyj1+UgI;%xCRW${#uM z%q=J|1sjty7=O{$JRt_O-4H1RSIL}nm>Qt+UB9isuKE1TE#6N2d)d9OS!aHbkd4^Bu`Vj4gGC$v_oX2b=7f7vi=7;c8tWZh_?R8EvUm|26XhKER%_ zMtFrm)szoTAi^d?rK4*&$On~ABrzKN!4p=Gp=0y7ghW83toZ|~S>=Fs;erB=*_KL=zE>_*Y^?l4b`-BIVHi(^1T^9DeoS~nkokx22oqM<}E0gHKMe2;SMkR`eP0x!wTb50v=-iO^{OYP7 znZY!l-!{Vyj?0qaRKbDPz9Yc|rIUGttHmu%-?WJ>Tr9c`#ttgg^)r<~b%V7jc(!bx zbLI{is>U}nH5C8JDX+a<gv+kA~n)R@3 z+bNGI2W`c^UKA+&cxL?_Bghiv8dW-1Y*hr&1A7CL*{H|Cr%!)Xj(kY4#itaYu8(j? zq1E_)APnb>CgwNJ*!}6>%vI{L)1K5{stDlPRjupUf00o4I$4=IkMH)ezA=OyTy5K; z=N%A^KZYJG@#-1#K*HhP1;U5Aw!IG*@X2dT1M^J>Mmd8MM{`Bv-dPSr4@%X#_t)<2 z!SW5(DEg1hftDx_kg`zzB8K4t`>&Y8$p+haL>K01>eba4&d;)6)ZghgVi>+QJ^rGy z&8^rYwNc&;(wLZu5IV{ly3;ZP&v4|&9MfGXS5vCN6qCMag@Qsf!}sbZpRMxTpQcl8 zn(-zY-AMeIx8O!+*0FXQ)l_$N(n+jL8?Q<#laqwwzO<&}bLIM~Q~>vz;vD*DXym`U z8ShMK573hTQ{8^%nj2kgVn}42MqCj6o7*OC-p|sHmVRv1=bHKC-?M6!<-BwglgSxDX@Q}GawVIDfA;;R z>$5Adrv6wzi9Ua?vuN}_pLY+b=RVKycxqdRhDdhMA=XZFc4`gwqHCX=dTGe}2PO3L}OM-mi49$&k#rp$zpUX^4AM1UU6?7Rz0|kIa)3;%mZ}^C@&2s;eZ+ zZMQT3hY`-UTt^QH%BBMTAPo!8P}g6FX#BZoE#=C$M0E%!<$E~!;kNQQ39zxLKs_Dx zVdGkV>?8%{H4MriK7ZfvQ?YFmE?raL^^535m7QoD2vk}MMR%KKe&8dz2_+kG` zzeVlPg#Yfol86#AxW}OJ8_M|8O4A(iuqUeYlEt4SGik@>2-}9LAF_&v$dG|yU(?Mi z*mU%y=UZ;Wj_DM5Jmlk*N$Y-|y-|Vn?FIu)2PF=}KD@s4X*gJe!_!?qJ(m|AL3y=k zirFe`HYai1;>z|2P=D^OOH1i z`*nAzcd>1|QPwS%&Jd}jkDp*=lu$Z_PPQ%5-|pPfGdo7C0D0~lnQ^wX%4|74$sc@We1ot<^P+x!bQ zr04-*XXzr4ej%lW-&y2uW92tmZ}iH<*N((eE5|dqvOInKXG!P9VQoHl)8~+OXAHS6 zoR3+oTaGw`%uK_KKde(1xgh-8}^MpS~*qQ<5fQCcjV_XN{`^& zcfV`&gsT(3zwTWG*s)PUlk-tpdt2Q4p3IN^nGESThH6@eQe#?%6lbt5eFIg`uQxR3CwL-USAZW4qwNAsO&g?}Tq%K!4JRE{Gv7=Ccv z&$TYx6G>3!OYpze#~zop8mA+jVB=C=gg=0;QX$`KR9rG^PmjI2uh^#q;;y-0??evh zdo0YpE0BT?pHs-l%V2k^xkZ1R+GAVK{CHY{{QK z75hik_SY=`FV-mcm@($Tt*>wEyqogGmI*KUMKD=d@W?L(mxbZf4EP9_*;)XUR9vYJ z>s{kfO?ImUBq#5FV~&f))CF8nW{q@T!WT_Wl(?$5X#EvtWHvXcL6x~5RUL5FGY7|;_( z30X>He5~j6U~g}?b9Y7noL-@qQz}ClYI(oahB4^^)IWavc!w_FBP&?}-l9!hG_E-z zFZfpZj9XLdRL?4FDaxTW#xul3M2=Jgr&CpFVoGCa(9N+iWuj<*1ig=nt3%xhXmaOX3OCE{Q?z`=SI#b9wyQfYZ zSoVT~>lUZX&v&6pgDz{GX00cX8Q5nJ(Rqu<47+AWtcPPeL#I_^|3u*pmgvzK0nWYf z2(xHqaJlDSlH9;V56DZ5)zy12kq{_%1pX|&CLzUD{5ZfXJHuLIgTd?@y+t!|-o#C& zoal>Z9;=szH?p9LPgx|Zfcrz8n2U6}u1Z8SGCJ3;_;s=9f~fMo1p}>DW~Zmk6hLD6 zsJuP>x+yK(O-HP)fnJr@w7uhQAMKb|wGvw$LH7J<35_;Gu`Otsx-~9Qih+(aJVENp z*$)(YUAh?|^-M_}nNuo97bb<}YSKGae(y1-()~)cgZXJ+(Brg?phQ!Kfog{@&!&*! zu|n5%23K}LU&E3#{}I;&lo+=IH1AamHzG$aUkjo^#le~x=Enns5gOxxf{3Ks zdsZ6#Q#0RBatniSpZ{xAr8`^1$NNtl#$}qf^7H##7Rzw?<=S53e^w|Sh^V#m zS@QTRc;VlxKs`k)f6G>VOhxJyg*a+|sN~Qts(eFG{=_)c^f5X}ibG6>aJ(bj|8V{-kjo`(3^h=2h&Hy11p^=TzC zg%*^WX_}~`>5@N&IUkr1_8q)^#M0!?qNwznLDK{)2V4u)_P(T5=!kTm<{!z?pc!LmKFp9542j zBU-R@oo$xJOZC5t!R|;tA37r7D$JrfgNy6#J`HJ9@7Oca6bW57F7@I;D{xBK5-G)@ zwdGaOC?+5%R@W44u)IzoPhVfR3JnOk-e#Z@-x zX(7}O%j4g&xL1ur0Rpx82IlFE_e|<48O@^qdDbaj^_M*thL`4h9hv;l0+t1A6Y!MO zXKO7eUlEsI5PJzrd$fidaJn z^|#Cu(bt${c))m0G#d^*(lca=ZL%^n4M043*ZPdznm8Ng-D|xN;T19_eUjs}L?P6P zH*(D!)!@qHtW#0Knp`TUCxoNdTBtc4Q(@lls>aCMdm~=E(|#kLEkz|kczRI|~T9lU@}vOwKJpO+>1gNvhfw%i0&Tx^BBvic;c1T!PXeIaj+ zNq;%#agKS+W7>j6HGGX$q5!D?{2^^-Rtcb?GGAv!)f+ zs0qEIc!NFVra2CYt6G@~ehIT^6@B#bNT(@qH$*CG(I0L`jfF5pn2V4I`h<80-KpjQQpzr@CDBg}eWa%V=c2Dd zry^gjGo#Z|P(~nR$&NfPBzY#v`ko^XGOgYT?TL(w7odA2aeS}*KI(&vq9*`QYsO#R zEB_wYI@?ll#8bCCH(OAlt2hCIrd|UcUXou27cW82>3p8}v;P3ns_#%jb`7i9VRq4^ zCQw|Doht~k`Y1ywMicUB%s_yY%ZS+@L^6Mh(>4)ae61mbfM3z2IQ_&Vp ze~rC&!5hC>dX*-mb3RE?&ke_uR`C|7or=T*gnd#$;kzZf88vfCg{e=aM}uMTDNqCTnkz$bSRYlfe*-XY5jaz+SQI z`@!o5nRFb#ztSk#6t?@VniMEfP86Zi9)Z4jzBb^8kTTuZs@3Z82^b_Ye zVLJ!Y?(k>MdQZ%ClDhVjThx)JpIVl#5Yq@lfTj`f>pj$v(`{`jF46KX5!rB-g{+5< zIv)*1$KLMOTW!7OUj2~}89yZO_Q3FwB-Il+JQ1~*dH{LG+p=RluKh44f5jd+4Jlik ztXP?c57X2r*^Yk#SrE5t+_i!(nd@R|WZTDy7vnD#uMk|Bqx-NO>mS{C=*rR0y{nS* za)0N+B$?Z|AM6;Z^b(x*h`f2fdvIjmY)aP{dCqR;KH#UTKiB}(Qn!LaF=6$ti9;P_ee$n3u?QwLJ!m+D4bJ4W* z-TSH{vST9>zP|M9(6XTdp364H^a)o7$09%*+RJlB3j3*Dz=;pFAqtm?wAg-`^vi|I zhaQ=YP%TL>wZm_yplZa+-(duX38Fpq>Falk9$J>uhckGS2HM<`x3{xD@3XvSYlnj6 zA4?tVs7UiwT2}?lsL1KLU~NV7T<~bKIv`I*hRXhNo2%ME{-l1b2a?p0Be_hp)y`Ii zzhrK~O#kj5P}`9)kNt7L}ZoEB1ssNC0?#+vO z^ue(b)@Rqulj$-HTX+)ZQafEcb)yz`=IHa$+3-I^F^hv*ZKJ}5H{K<<v6xxgoYB`S#7_0$D3rl(DXs)Iq4Cf4vIZ8r6B2)fcvom=@gPV45LZ^SHYro5}|g zxN``@ux;=8-FNk&dmUNm44oiq&Ea`jzLLpuc035`iehWmJ1RS-x|A(LxE00} zA?5?eY$6xw!LE48!E2VTDI?uW#lWGFZd|JzM4&r#V?C2-RQ_ByU88r{3-y>rI%7j5 z8gu>ek8_-}Wd5o=AY{$%EDU;FZuqRXcc$~`)eD`;t}I|Yg~ho9x!3W;aQUp+cGmS^ zV^3R7fY(#xH(dGK#mpmp;^WZIIDU2`JrnrLB)Ka)Wb7#IC&wwBYakY4wBoNsrv#jg zY0KH{oa$ZCxr?j~s{<@PEK(`#ih=4MO@kmiR?<@3EcD)B8rp&)FZ6+aIkz46K$P=L zTXV!03LhSR?~i@HT!v;P)>V%LFXm|M6sr;&r19L76+e%o&{t>-Fxws4V%t>mZFZRE zxWPqC+-q@-_2MFwprb}J$NNSUsy5_ls{S#~_PFTe2w(;{;*5FrUF!Lzy5L%PprG8i zI<@EV!eEO@itTnk!G7$bdq&e`F--~a6lKEM3(sSV7;4)+5AlZ171ZJ}uWqj~;$cry zKLAA)y5^yniQ*%hnYK0-gt82~?K#b$#$*;`qTXY2*VpY2Lz&BKBU2+YE}ikVk~`D+ zUB2=Bdiizmef%DkJ0KyNv1?3VV;dI2Ol9^IA&E|=Gd+WLrXM{AXo?&h8?MJHdkoS=`-yarwFL z{r_&&ubP^gbGoZfSI<;WpO({#vX}2(p@C`5vaFVNOz{}5N%MTNrJN})w9NiV$}_0B zjGDDAb^tPTeKWI`|EBG5x_vXUV)s1GEj5O&SnPgjTOQV&imOOEc)EPMYZSr)?RjZV z3N5hjKmv?h2{)*XR z7Jyfx%oM-Kwbmi208C=funu?|tqC^xG>Ej}pccpijCw^?TW7FYm_#QIDqGq_ZA%mJ zm>FlH4{Dwk-zY-hpQG-HY`jMs|7bp^V9d-f7#z8QL6n1n!kV6K!J1Q|4OwEpuues=cCH9-GuK)2asQ@jlZ0Dj0Nn!C z+s`(L%FP<&zqkCIdn$sQ+3uV6m=8FWw-|_zhO?RE)dGu&E&3amBx3KPZU2N?K#)1r zJbfsM`=Mq*Hya#4ckC4mY8Sv@Ce!x!gu?%K5bMuU;MTdTIQ!;|_wO5t;8 zXU|rAVlT0yvRP?^L5`I)Tn#)3w>9`(p0&Dg0TKY11|E@?8f9OqD*^w<0yNt(AlskP z=Hk!`CE7NS&{B}t^^s#yev7aR)pSEU70M1@SJQ!u2N;2l8k+-0BSpC2O`P1b!bT08Mghx7AnY1%X@h8yeJ%*S`L6ou>Gnv8O=JppqIHjW zbVfq^*38s`pG_PAEjalv+ZMj4ZtSsi;NeCiUO9a#!YoteuW`(;VH}gPIcvSmmsUyV z55Q;{PDk+JN~EL=(W}7+mAZ^r+hE&jD~y^bp4Bhrg)+a3vtFl)0nF=3XX>(XwF14( zjy(}&XO!wJuKm{EYjgvj@E~g0bmCbGIz_vcZR~5q{xDB4VefsXVe5^q2#24$3g3=rUe-qG)aC zqy8Kz;;S-tNm_Pax0&kMu(w=iQl&hOZKf6qGFY;?6*vXq9uAXm+F&QQHv(etJePT0 z$7AT{_l?4klq6M- z>t{tg(aeL$pKVtKz8moL-({B2ej7d39WXd@Q;3&}fMPxYG-ma+8OrzhNwHz1)Sb_3 zzG{uX;>4BJBG?A(;H;2=q_9HaqTN{{c<%y@`{@iS(k6P zZfH6kzNx8B2Y_`AJ8FXjd8S294PN%71EzFMD|tRxmuoupq{BYA?7v1$|5Ueh0+b(_ z5;+c=4p>Q|Oo*)6DVpF58Psh)6YMbO#bmbY&ZxR1vXW=Tqj=tpC@9NS+9i0^$Q@>_$sKQzA5FxG{*1 z-n$xO4k$<|%&_Syd}{Ul&`iVtt8*jgmAa~eR_UlRz^eFCV0%i-4%h!_6p2A8a#%d` z|LMGDA8Tu?`LNDn4xgQiTv0IzA*FP=-^tW*igH#q0-rkKIF%*t);R0XxO?3zo%V5e zV-MBa?IBfDP1N50nK**93Uhkbl*c);zBhi zj+TexN6??ufI(oS;{L#UOs%pN8>WYe&!ehjHO5nazh;ChndY;}OSawAZ=JBuveYqh z>fO8k#UHAh^&duQFwdY%Gj+Tg_zO{)kR1c3Pbv>jB^G6RX(g^)ci7P9(z6x^KvV$QghBumZ4 zqt_19%4gEA*ry$;sh)QE1N9$o6H6OZ>!2v}qgwlY1c<8-voCSLF^<)6$8N{nkjaP{ zSA9%qmAGZtV`v0}i=Aul9S~d2twHdu_+PQ5Jnc1YE3Pg)(n{D5&RSKhdZx7@$)wD? zZMCol98+!k`ZC!5w$8*qWDge?7QQj0-cUVLt60W&FaHdct`@pkxNd;`6r7t|uNYHGOhe#wjyQ)`wkJ!$IIp<@*1GZ}I>>lFSr zH%buBKB|@BsNF@l<|sRJ@l5$fsS5xhTl&>S%Xr8{xQFTm1l()Q+I#d7*|($05z`l> zZ1rDf7I0$ZTfZ{(RdcM!dLPr(1<-J}PM!L~8uyVv+T|9EnhOe!7;@u-uSwZP>5J-4 zzb#7*|C!Q?0{BPrViEjURpArE@pcOGk9uOkwxp%buhV**PCO{CS_UJG!`JTD9S`Pf zEyu`#Jd-KUV@kDUt78pD%(PgJliQnT=y17sja|I6#qdKOP0*ztxH@(zF=%_~nz;tk6Is#L9$$asNdAM&m&y#$w}A?T(T#+_!P5iKlX=8u)0jY%yvZ@{#uLydJ=( z*}Bl)?H@vUQrlwf{{i)@#_Lny7l(y!m)rhSH1xxdw1-?qOdfVPEOp(yKei7jj9F(c zSau@WkGM8SQFZW-i!5ptuOSr}R)g zXhlQJcOPbsleRn5&}O&^+`U-qg^v6;Oj{4TZoxLa?{1S$-3a#4Ag`Pdcm2Sq$(WBt zcI&=GF6CEmcD;{-n;F?B2O48Gvr2hp`iMG3?p(VQt*tf&IP|SqfW{W89loq>H}Bk! z@g`J<(g~6Ql~5)pl_8*9zFY)OXT^p^XH&{)%)5F3)nA+d#v==IIVtK_Ue&3Plu*ER zc1KJzMIZF7PvI{_b|7;gvLe7r%leH6+p3b!M$@bpL<3kpV3Yhc;Wz$ThINRdQAXTq0VXHuohS?Nr$^kniDZJz!1#J=Rti6t~N@^P|eY*|~_Ck;@qv%220qXOQw) z{#OhYO4`8ChX85byk_5R)N+nX6j(T(3YEmAG09@QO} zyDIA-jHyqN^frpD)G80VJU1nfNUk?VYmYOmuTU=P2E$A19LR}D@1T!G9JhWDw3U}$ znJ9MAXo%_zW2b|Wm)eW1jghhqVKXR>^UtJ#qWIB&Olp-`Vv1oqEKI9vldXksvSHm_ z5g6Jh7Q_~105taYpG}W;J~8P+o5&P*xgRK+|MWF!Zwc}Du4vL7fS&w5N7A1t1k?qY z4A*ZCO*@MKz1|q?3t*l;Gqgqep06Ih_Bpg|WtJt7zk#DM{@PA6Wp2bOVy7NE5{nxhJ%9bDh>mv67+LDWT|F7rgHKPWPS|RTx z$!iTI`cD{QD?g%s{%zCzFqGZho6K2oL-SDSvuAH+-|E#i-wZVVZF@R!ZD(%hy2V#r zU2W~8%;+qy=c%ONEDK!FoA}_z@z*W-D)j|)g1%guJ4faEAmE(-LApI)pIA`lxc2+v zmyxh?i!h<&OQG^cHhuhV|;cDMxJ0Y>As8;(}eWjw`1 z*X`3nrrpH8E&HLa>K3kcV&*OwMdss1K3tsIsRvJq`6vmeSD4!WoyNeWy?Qmw;wt6KC5*wsh{&ZbD@=})(p zB(xWsJ+e2lB{c8PXs81yjiX@iOcT*pqIcd-^I5dbQLQLTDe;neIn&_f+;1^f`!lxv zjuB3yUDLYm*J1E7{jrtMD3u|xw^lDw^0;I?&z|Y%cG}HIlC}-`p~#!#fJuiQkP#lO zMUyLkBOn%?YsS(iaU*<1Ih_%&$Ml`@K*8kI#ry2+)7hY!wy15sULjqBjgOg0^A}w8 zJJb0si4N`?u`6U_uEKd!IUJP3d6gJ_;=@xp$}CetdG)rS6lLgR{> zHoI_pQ{=A4;C#Um-A}WAFOG$2%_ndAqmMA}C|W^#I$R*6|{lcl>L_~P%uARL*vVot7GR587&BA(C~8JT)cR3=Vb>mIGC6F>UuUuTx5t zb#2wF0NY3`R;&1&V#z}p0+*2yg%^K~L)m!~#>Yy$BpIIZC$*G%w`qnt_6_PzS>swH;SR%IR` z5)ByjO9pGlDGK?fMjOvoGbQ&TD=>6StyQ;?<-tyNI$EPi`E?nWbluI1D$OnC=wffr zC;1{Kk%0~O806XMYMs$*kxTUK*-GC_&8^Z6*#iXYF=9K}czEE(-j_0!9^dMx?4L^m z{LQ{ERUx{1K1OueZ?K%U2R`V{{&enXs#mNNyYS{r~-pg4v9fnasq7jwZmBdNqM~aIhPC5xXsdB zK}c%MOP!`&mGy5Hvpa>BHw}00Qc~iL5n~ygBZK)xBHFC6P2itWmnB7ssEB``(V3|6 z+cK_Rb3anO8{x2a)sj_`#ld|I0~3U@C-%3pYu$)4s%{>-{b6(Y`2d__&uG0j9G8FO z?rS;`j2T3lt6*Y3=2nyg-Dh{3t#3+A&azf|yom3j zFsM4p!?8?J+xSjkkc;ojLfi2lCU2T08a*etvQa3iAu4}C!@1w$^I61}8zqngM4_1n zz$6}RvHH*~&T7DT?>743kO=P1=h#kA%o=%cx^1gKC5VS2a zrsN0pwU%geAJ1;(1CC!4y|Oyy#+(&S8bY3wLW2c|!;!hg!qptv1Xfcd>#XMhpU>%` z(aqADEjK(PJ5Hl-AmEE%1QBW)s!Zhz2A+7&o)iH5C8x-t0HM#p^Y3&&O zvrG^G)lWF>4V5(;&JTTcq5a&a@kg857X!AOc9xt9qQBElyL*1jXFE67AgmME`xVG= zkIFFV!yQlve_okBaU&z77#my}-@~m}(}lBZF4b_4 zTnjXTtFu~Es~uGLM;iedp$id6_rSfY@p{+NhV2Wd;wEio)Agf}ERptoy<}r!N6woc zU1sL&{++NvKS@4+Y{8J)Z}Mt>%mFxO?`LsTmuDsf*U)dBs_@KLn^hDQ359Gm5Li(# z)Z|@qmS7CG4hIGT_s6_ie~k0p3VKSM#{*O5Vo<;d=T{lK^y?a(=>y{~8-*&C!!z zuTRj0#b1iP0nBtB1$-@}IRt$K&quK7v5SM)2}ossStPI>ioC`hOC?WTNJ_6yTKF?oh zj}ORQc=&$dVt z%SlO8k9AF;K!5)nD6D*9Aukx1y+X)_=vsya;nm$?kB+ErDO~#>lk?-_tPm*3Cnbfy zgHd1d^p0acrp(-h)dFnCHJLHDlY?05g~3RB!5%K88Bi~CEe%#743?k5zSR1L%ayN0 z3ZP&0X71n%K{*%B6jnp!zaH4wdBDwfEU~&5#uGk9Coy-}?*_SOH6}P}1q*Ce?d4DB zc@-rA3J_}e_u%rlz6g=f1p|N6O)XRI3C&r2eKz_@1V9vEsU8YSZ@+!^WWd(oT)F8z zrh>aOph-vsP@O0r}r$Xmgl$rX35-t$Yzn@Pn{n!z%V^q zItN*kl9JzE6M)bs*4mww zV8dB`?j3TCuP_I=J-lXWme#W<=S|ot7e`;Y)-Na}fOb%@MY zhCOSYrg0&Jh!4*{;A=AepZ*-b#R`n7hsKvXlSwH#%Wdha7Q1AISj>tj-@&VA*!1aVq9H_?tFr?K@<&5 zo*EMBhx;t|FkDfX;I-R6%cTzCzo(PkJuKfYdth{ri>atgSbeS#S`P4Tu!oNqLUs7I zG$3mjUXux9p} zhG$zJu6!(%Jp3`WAu`PZQ|o-q{7;&`59EEiEq@5@bqZSKA_upjk&l%a>TuMzD=tft9D2!i8F$Z*HnU4h3%85kH%Yaj82m=dzBung zPOkA@P2=V4D6r=~Wa(kdE`__0Mo{g?@4vP%?(1UvBl88<-xAX!3rZIr@AI&L4; zr#(E&qeICjm6^p7a;2&CrLK739JAc%5-VySPf7Bs4zIk>@wwN?Biy-89~Y961*>h8 z|J-whwlE5<~a_iK6J zDj>Alk~xwhweA_X^y^8TU$GHgG2_o0!`SzfYAv={MTTQ!h(3x&UcF0Aj=S8WC0TYN z*%pR?NXd*ALOu`75@aMq{5`ed6$lvSsN`dUX|aKR=Ew|l`s9t)s8BIQ@@-j4GFqh3 z6g^1lFl7WY#rEhpYL%`1vVVG&4>WY5S>Q-!MZfN`=f65pib1q+eM*Vyip^k&2U>mD z{a|1aq~e8|*Ltej-q@GEhiADb23lssHm)H^RAy8-NO>K=N*xc-B|g?0o%gy`t7Stz1tX9-?cB=u?1~PExuP@ z!AGh2C@dVr;U5H`z+SAG3$#z@$NtitAtA`S!8Ne^eeNVzjyHJ?f6-+Oeb z-4i{(fhGf_DGeADcuRG^F*M#|`ksmpXtS8EtBy2tLXjUOtPwL3eV(aX5f15VL0^^qDpKr?B4H(wUQ3LrO zihOQ?rOn~qDuowu7a-JuRGEBIt7x97sihH>dNgvT;S84IY6I<nDKZ7W|L? zz>u7#a?|{8K}#(+pYqGqtxo^7-zr~K3H{ls99}3eMd%G6HoFt4IxdgU*;)ErU9rO{ z@=W}JCtTNvjGd!+;e3xj>kxP#(o~9cxTbCQXm{6A>BZ~Ra>F-x-6zjduHAyJXd60~ zUmh7!>9736)0aBIxxGGke%!VKKK^X_+#6GcAZ8Gc@(Eqclksbs#qIY<$twwOkstM+ zdIh^){%mGsZc{mR3)N*f2~kz49FD8l%6*gj3gnJ${xuYRscdQsLO-6&d(r3>NPcMq?< z9AnL^t~o_oO>qPn$Io6`FAaGz^W#=-8EAS&`>8Waa_ufuIlI@14=83W}+(mm5+Qm?N>n4-)H0ZM; zak2~UN;X>T@eG#YDM`Yura|k!q%RZuj_q*fx&669@NVC8qW2`a-Je&>w-W7Y*E1*m zd>o20a>W}d>aPic7mvHhYeNR_TZdWbREff0vQT4H4SGc>TF}?&HFvMCugDcH+Dv)5 zKN!AS+j$h`2V^IX3K=%eVUEr({&q=}A2!=gOug5(lw6gfw~?$6Lg~+h$H*71Z||yF zCd-4WZ%A?Wz06erGr{^F^tkhmv>FM(&8^CCF2D-1|sSTZ~M8h=? zCR>SG)i!396Lh8^Qw0_$-J=21o~YT8QjGR*CR72G3T@(9*zWx*m-skdCrN>kADht^ zOM1~m6TMZVw~e$3lN6LCeM`0m!~euYoK=;jDWx?=Yr@*?&f=5O`O;|EIq{v(ekN_i zF;@3{#cSuh?;v?kkxRvrB+(Q8S0=C&5+<|3n z+GZk?-(=r@@ik?&d%JS|Bp$+%n<9OC7)cWdP=^Uj!&qtf-uisacP#Dh4 zmx19gM^G~HvUvj|x_h28OKNkpJ#swkmg^o-uJrRGS1r6%g9Ekt;C|es{vHf-N)|{m zWb#xhX>*NH$WOyF(>B-92ZOiWWWVY^=o2l=W7)qprN8D2N!r68+kqUQ4)%F)1^gx(tL&T_Y0xqU@L{?VVvSe;z zY|m!2mbxk3M8+RxTXDtcDQPkyefmKM1TMyR#XnVi3W&3 z`&f&2+j-4^01!yntX2;3{mGjHrDOcOOVo3u6$mf!PP@LMq70-P#vFVUi8uOTe^2rv ztL(M~5Xc%Ve8uipD;Kb!S9pZ{6PuPvvR@nLOlZbtVvg~Pega=Z1teXee9rQ~A@SqU zzpWwUUax)_@HM3{Y_YhUpGL2-3GC=`?#TI6kta*n=a`h=8fU)U;=(1zwE-8;5msrJ z6kee~;@{zEmo!o?*PcwT1JSXkUictM0{%QpC_)Piw0k9_&9ND~`A^G&ObyglGszik zd=l3M(t4=by+99fZTNaqRI(aMH75|v7d}b9ZrQvZjUL)cc1RDZsLByC-_2cQ+lw`S zTFGV8xgN(U3YDNd^FS=|1_8wJJ9#CqrH1{(j|Mc`NNMuctSh6>h!Y&6>j`xAU|fMi zjOEj7^w5JLsq|~iQKFn#1B(OtUV0NwqIb>Re~2e58EwhiJ$y>PM>{b|H2K-+k4BVt zpgdH)wrm`1Sra(sT6>>}1YK&**3&73^9WLCLlB`;; zH>GdQfR#N2Ye$)znm+k{fnBFQWlOUyVhpUzE?p^#_u{lDo`+@on;WgKqk|!6QN2hRx z@#*F_FMT{DbYpds-c)F1<3-z}1G&d!0N3?1_M+Ys65-Si{H?#ilu;`kMjetEWpTkI zIt?9XSD$_WMAD5tUlKHg6#LWSiWZ*?)qgWa0p3Eu7-0fMcbawqrO*A^#F~8+WAP}b zawC_qghvMCwcOtufdZX^u!_HDbe6ZY1N&@1cc>gqOm?M~QIgMtW@St-=dBDXN8wq& zAHSGyej%&f&&wls$Ei529=Sa{OLbbo6`qpG32jXI9xB6iO#r%nR?ja;4!$9G61?{4 zqCY;hh>*eY#i>2d&gpQgt|uz&)f_Nxr#qlpZ63|n&k_>1|2y5_8!O;D^QVEyB?(6m zpa%g>fqns-0<#<<9_oIJ5JosQJOvdWtlkJ%1KN)EU#!6VRLJEq^~N$S%^J0Dj`NW` zr4_~0K52!r4!|sl-95r{eZ#$_dR}oPz}n0**Pv;gLciGS?QCyZcFLK{sZgmM{o0QT zdlaI%5wUQ!{m5Rl1xJf`7PKXY8wx+9-rF-*#PCTnqUW}ViRZq3n=-JE_fr!OO|@$W zVMu0u({dpQXL_-Jrn%>Mgc;@$V6?;@BNY1(6ZSFEs8;12JOOxhnNvN!9Y&0Y=wmCA zK6uUu&lZ!!jtmr#i8^HiZCaj2iIC<`5|bx!!MoV*uKf*@YWO=c>S0ZogFZvd+t^xe zRov&t26?hSIAvt%ZHV1IPQ@6;+K-_B3U^XSm47|L!<(HmDqzN~VC-%d<$^~Lrm8%R z%R_nk6&~T=7K^{_$3UJkUsJzZ_oga=z6WQllZx2kA7~bwjYhsvu5$lj5u}6Hhj%}G zKkPcMtRv-AS+6tp58+!9`LPYIAOKk9NrI;}T#598#Zwqe+pRsa**?TtOZw<3bv@v7ioJPj z&oxu46367zRc^>47Av~$9Y9$In@Q<)bDT8t`%JMop$b>zt?BdV>mxK6!$G}1*R^b} z<~>eU((8u@SpPEdl{!&_518-B{gW?*Y(8*A-eCHk5K->&I*O)Gl=S3))Zm!)ADev% zP4n-%oj!Wz)dx9`+FzXM{}I167g+TwMJ;$nd^43-&dF=NV=IWu z25F?BG=l~3U_dr3kXj1UUYT>56b1OP%>-e6$mS#$l=JeO-Ue3k{sVquD#dElIK`_lU z&*h~~EGXWp9qm*>If9dcI%Ze%6tfy~=B|Te-mFDZ2hJKf zXn>5@0>ShyEpH#|i(~|JED}j2% z9W?Db4B|l%nV!5~*YCa_@AH;`>OWB6?2Vk%A_@J}K}p9%$CaA}R{A>3=ntZP#BWQL z_tD;!Dd)G`8M!NeM0cC&0x`Q;LaeyYiw_4bq0SX!bK+jnO)(v%0^Rg%xY;B$u;y3WV$f<`Dda{7lv!U_aR-zd6qiNpmE5& zJQ=9tYP!x)=SBl4QM*^)p-!JRH^i?E@^=g3T7B)u>b9V!csS1@@hGQ6?q4kbxyKUF z^aAyRqU{KX5C(-RwjdUZ2Y3LG4)ww`XY^mlCv7CUmvYQB^NG|ItXwk-%AyW^x_edw zf2t+;vt6?#0&`%h*Pl>?7GYl%3l}AI)t)@`j`yL8`?*=t5)_()4@bW;rosfVMjJ+) z0vemnOUbA8Y%n?T> zd!I*W70}LyDa`n8A{VXmL7-R5Jd)(3+%$8B+l|HP&KBll(9J4z)S;k`?78rHJi;Z@=j_n@gP4@B2 z+v^{3AurMB3c{(uanEvD*mhs<&6OU$I}mf%6mjs|n+>Pvv#sh;+*MH`=xcj)bZcwo zm-{HTvTc??m-8cAbjyMKFZ^=#-BKss+ZBOFobSiXb;^csB~rVhyl__tS^^;r^+80e zANwwig>S=*aaPc>XZ`i=muep^2_|>t5$PYrwSd2mALPTS!xjTLPCffQjp_xgm_iM{ z2izg^Ymb)JFL~<8*LY=y_fCK5Oq2l(QP}my{1W{n+E%8~*ruim(Dhy8q*Z%YYRfQR zZkf~raV;Wx??>aN&&PU;sB6ki#8q(xi(4hJ|-MzpaAGurgFg?4%43hy-8G z%5;bBv=zv3*NmoI`v=YFM$?EVo^WYM`Iug%c3zLPzUyfvX=hiY@1o}SkT&i<%^Ya+ z=gxnt@RX7iEDe2pmF~ejpy$wi>odlYn8a+UnXqZJW6Z-LTiq8@%_47Q*73?(->5NW zn?YPFiJk}XEoNHg^LTCD;TQ=jV^?y5U7{5?@X}TWEGp#tjvc81*pq2ab=eu2rf#Nl+T&`hf2`iK;n4F|4m6j zGS=*4kbmE5w3=D5YC!4|53NHA)w5<9H6XTCj>{9NC%aI7$DgSmPj;<@z?XkqwJe4H zj$zKN5$0N5f5MuhmEgZ+lXaO}Adyf4Cr%jrett~lm;~A?ZB-nki`Dr!7#~=?93U@# zBb=)Z@x`IGUa|x0NmR2;K}1jYe9zz_T`4+9bf^eS_()+52+DM-MuOksFZgc9-=gdFYu9o&j{UWJzS?@7yw%~J)|pv%-4~JCd0=_V0GOzttTLd;js8P+zz8)F z?f0g&F+kYgRQRYrTe!Xx%x#4d&9z244YVI6-49YqQSx=pel#C$mQMiJCj%Z8p4(^QNXhN1`vLH(HjO%s-qX~=9&ISsEBDE|Hw^Xh3h+g}yoyA~SL0LF zY|DoECCl(chq=JR{B?7^>@!YOJ;K(u}W<`JDH88XL(_<CaNJYq|T*ORxYrGg)j z^5;0n*xO8w-XKG4ps!P$E*4QdK(;p*345!dAZN2XM)+;>^(H1HQhkKVwY$E$V{@_* zXrsckl@3k)wng5YPT`orGU`%_X_7o~LlGECl@1d6G+pd{YTm0_H*hs)hQ#@nX}#v( zKQQzomV)H#lD+DCi>&qgFl4}Ei;YO@5d+6vcJ|fG`@h?plyBz=9!F&hvuvG-OSuCn z4|8KRfG?+M)smJM_87EpmZ|m;*hb+RK_c2N;rn={1NI3n1f}=K)u!8T{bxru>%U^QnZpX$+^M-SSYoq{am~Cl`gWYIxJr zc=`EmPC1=bZa?Y>s?fr}+uzvNmvtDFu!AN#`cpFTX=al@U}tu@D`=E`H+{q+Xg#d_ zByIe~Ci7w*cdxma)8w2-iHHBPgbQeTG0%-@ImbC>{58)OcLy@fGw*IA#eIa3rx6~% z!-%VTPWqggUmQVV|Eg9nSE-|N1X+kU-stFjlZ z!zR^O-XU<=2^0DHUR?Tups>-=Pr9k$>FA}KPsgzn=?YgD>eb$Io-#;-oHTm%WA0Tl zRq)rM7P&-_-hfn(aMWq$+^fS+J8!Lelcrpq26eF=T0rt_p}bL60o4k{X1pwV&6XNy zN!eIQZ0cNCNqS!T1a&ARjN0&Fj}nKDj7(T*?Sf}ubhVQ^cJz37JR{Q zmgKmS%OrzCwOF;K8aMqsWUQ(_vY`N5w+EjT)ZnK4;DCBkkuCR>2Vw9F^*9{oLUiLC zynEfl()%vb?w3{wA+DtgK7wM=lmirrB5U%*rft=M=9H^Kw*o9lC4vo+GN0TmkWMu# z&r`|N=C0cG^5-OM?f3noF?DslQhM9It_NZ6A;UHEjO^~NTaTU;y~|y5!w5d^v-sRJ z2{0H~y0iz!?mY{;wTK6n*r=2O4Q^!QN4-_z4~V;t&EiOmhAa3&@j=;b0Yr;UR}P96 zzr3kRMtZ7FxIRc&Xc*e###V#z5@5piSDYcbA{Pvs5Bhmlzv}PExp&X-LCq~d`1|!U z>S2%v7ZnK49v9%(I2h`(vhK!p?cCDJgx1qF`t5D5s%i8*>TRd+6{b?q28-W<-KX32 zOXoHdF1uyVZ^m49^-uVe^<;}P>z5jqh^YDKv&g7QG$S!g)-Tc+_ zf%Jkab$Y)+C`Y%apU=a)Vm&`1cN!B0T$r+9NI!J(*5JGlG%Ocyje(I&?90~jbP>tK z>-T{k&;H%M@IHP;pI+X-7CN0F;aso1dl4%@VBnc(q{t7%Ow)(D)UQeAJD#9dRW#{I!js6~5S4 zbX84k2brvsBs!LD#wmwh+OtDAV=Rp^!v`pfZ=C2at^6RU_e#-{1N#H;%Kei3;l|ZH zXqoM&ZqQ*O~dYzvZSH7%H5LBh2Ss6d{Jh(Kw$+Suj&dawRdBZjsg zmK>`8f7?(!*sv|>>%1;({s5%GM?yNBuLa_Ar5a2%AAO~5_X_Zo)q3PWp6_r5IhKaz zQ03Fg8D_>phg;00)6EEjt@YssS4F2=3A|uJ_1Io#F}~kn4BQ1cmxa~#%uLVp{Q^Hy z_~cbM%l1vOY3UIwg10Yziu}bD%tyNoYk%I_)f{=s?9&0JYZtyNj73NgrNW^ZF0xoQ z28O6MZ(}R(e2HTOO?Sgp61Ci@x z_{2-XN21cmyGB`(H70k@kGz#H)(rS$WmxhRVX5X*T*q&+ebUqc0!uE|PDN3lylDFd zsZzL{0+NhR6;8fyh=7+2?di<3)>w0UI*grGP->%kT=;vv*ffU8lD$`)# zuDCGtFN(Q^jtnrTQolt>(et;XpWK3oguTK@`(4gLnfCBr$!&KbxfTf&?m6>ajIAla zLwP!#;W8NG0K0*(_^TBb5F|5VFGI6=`%e#^aI>tlcff3m{=8MD?}TvO-n0#vJuX&$ zehY@oldqX4YA}vk0H{q+lCMN@kq&10ss+3C1j1~HB5O4mN6sPLEH2nyQvE~{Ng@_R z6;VlhGZW<%N{|3svEG5B84NXny`w1-64+V{(6m?aY|&G&9@|uN5n;}2U8FNQa=eN& znI5y~wm;k%^HLAlh&H_c6{GdH#va*p{_*w3NT&6-*oHNyGM7VUA(4rv8Mg07EuGwj zpcGP3Tt16fHIFi@_k&3hh?c<8snQf?c~ERRe9mLK=%4+xcc2zqbsPeX<@Tkt z`?g&LL2Y9S;kQ5`!TnH8B(YJ_J3Pw%RwHoBq1ByT$*uVM_A0t7yBEkWtCF?@j5=$k z9h{8J_Er^WX`GJGOadhB-_h*VLku@x{92-5u1=~L!ViM6qNy*`jVf$9@6z<^^dcfBC!4yD~Z;e-DA{^}c7cE0?*f4}Dt z3d|-oQ1iGv(#DJOv(`;9dkXb&$5w^BEtvi5G?y3ZlH=`9B<1PPSnmt1UB109cg?}B zGrPO~-t{Zgm9&NrcGQF8wl_?p(6%@H`P50ke$y&P|84c>!=!%+=M0|D8x|L1KwDq@ zPYFC)0bWMN!GAY+NK_HF#8|UmW%fH%sn<7LF9Z6TWNge@^+BP4cXjg25<%d7s@d4Z zi4m7{Tt;Qtu)x+oBH90&YKAuIzHHT;)X>cNXPovpM;zlKDIo{64q;_!R@(Imc!O9Ig%HVp|=z}=)c-4S8I|HIT;4UG&AI1n4?@of{h2Io0mEN& zcI!R-Ca7s{H4-}aMnP1jng3}OxZi$3s%UR@aHsAPi01!J=_*^xuUI4YmA7S!@3c5l zTRnTGulRf?H{|$FZSu$YgffF{?wEUJKqq&M+!nK#@I<+;(p6rWa)t6XR??MvuOix2 zl`^QxX)mI_k{cGkGdBC--Y>lxk&uoP#t}_V;J-CjK1o#(Ei4mMkc0zg-dKF1pMna!z4uUzhR1UgX9Zs}&H|zEOn3NI5 zpRq37{U_xJY-O!1#}n(#>dSAuwYiSKRexXZ7+Lqorj+iB?9XYtv|u!|V0Rhz_RO(> z&4{R7jHD_!-zan#=FDXriN-rv*;1wMu1`=|z!fJdP)748(QCsuG+OZ*1<)Tnv*%4q zHu4OM@Bf{n$oEgI2h#tYqpOt-$AZ`>lN-3Vp`~h=Qy0HP%m^z(VK;!-&i+XH;Z<+ z>8tsSW=yV>1l12gmmasod5&STYzF3Gvy2jx&uLQi&z}u5_gS`##)i<2#ibd` zan<{LfpgV$EzOJ4GyTi6MTPU4?Jc<(9Gu{q-jkpv3jLORfIsNc65ACYbY#Y;|)}&51 zO>mU!g}S+Iz2+fSzV|i&FexzlCVcSK%kbP@5`0*BR78Bufa6b^SP!{V|3P@iKl>ed z3bEOAA{m#KPuI*(O2Dn<--Rs$hmx`fUY2m<-D5mT6ozv2DluHI`@(8DnjfGJ(dXYs zmwk98mnbn7oh1)#d8TZ6s~P*IR@WOn@<3FCXP#rR_{<-(BJpU71bEpUCkWg9w5Jr; zwd@_jln_fFJ%Bsc_|aBA5k{KJP&6kSPX0-_pRy~WgLvnx@EXq;TG<;;v+`V{*UB+ z)tWRr+>!^snMoV*7r~#_I>VjoG->))nn19bi1-@lwW)#7;%=4c#otSo5V2tMuNHh8 zKN(<|mZmu;Tmdvzl+MBuKkhj(!Ye|3oQfCH7TPK3L1Z&)VZ>YxRqsjI5T?sNV5*}L z@#F`KF&Z>Gn*UFjpXH|<$LJ`?J?BXWyyhPBKd!B}Ys`NCb4`OB%l?~dndS^#!&tYF zu1iE7#jsRc@3UN6tZ*8!ECvspL8~k7tVYzia@s^>j2gVja-zYMVV+~K=GtC_w=#ii z&!)KdV|9{m1<9`?mn`fmE17WPR_OJ7l{0%W`)EyPSF@jotkaLp*X{WzN799VW+*5# zeyyFp^C~mAdpG48Kzjl84InLq&9D*NV^L1Oro!v=k8aAu1Y&Zo{4(-O{>N_Kw74dF zs>q9Jva-Kg4RqH#0V*;W+beVz_sFYLe4;zWZ7FK;1s(tZ_S~s_d&q7;G_Ng2`*Uok zwr+7&e@ET7Vt20i7GU^w-~&f5awn~386N%Tr`2^8{6`mRrR8=4p+Byh={ue~m-WlM zyKh+nH*G_oFc?4d)H%-YpCbjT0U&$X)gsGzKmlw&So5>kV%OCxK22vft>uGl$RJd0 zFJ(el!ZU0Qvp!JE*(1my(m`rB>p%nC`)!Zfay6>9DSu?fcaiIOS4##qWX{|_NZP;r z(I|@gH|ofae1_~O(aBCh0U1Tzdv{-*x>}^^DengzHf`{>6-{wWQ~8tV!)kV1AEN!l zd2yHPelL#fk9=!pSJSxp-)3a6=gu5|)c+K#-KgJ%y=qtK%xY$d>95!2(Rgvm*-~+^ zYYJVmrf}sFW|P3x3TuRIhPOd4O2O|zMGc-fRX;)(|$ia?z!jnAyqIjIiB`e%eJw;%N(?1DtI!i-k;uRX+k zt7(kC%XD%c4K%T^SvhNVe;;R}yI(Zv`2maEiiXK8iIKwDhCmBaYtEw5wYJ5Qu^Sp? zsCBKFUH0xAec78cAV|g3u@Fk5=gi8C0ow_Bwe!K&d zN)gCEsS}X^AixgqPR3ikZ~PqMgYiKAVSLT*OAc@8T)|wfKhU2RbT03eKVti;#~9;v z^;P<8ci)1oqG9%v#;y)oi6aje+a}_xzWu&e>yz^2Ti6WQSAIJ}>AD1SI#1ng-|unT z8EmsA#5~(j?^&Ev)j+J~d>w7Ht%|K=Q2%dY>z)R~&e%hIWwp}CgVxMLbz0D0{u+1_ zZDf9U0=~Q5pS^)n@|Dl~y7i}?^Mu3|e9RRMXn8dVWz}4WJvm^uSBSy@@|(o2roqX# zT`BD=gPiRlG1yT@g>|(-{!IX3Geje_2_hW3Du>+?>W7`qC-B&$%mf7?G9vb;1w2|& z>#8ceWZe`WuhF-`b8bHCvPq)Hw#N6dLjzEb|z*4+O6U zHR8l4(5Wks$}HiDWSv$`U*Kzg*nvrkZQP&v@+aqVu?l1gpnJ7Q z11?wc+@3k}7Cdvaeerm*W6_-`sRkOdQs&Qi*#a^Kdo?T-_%}Fdt4F^`9#gi{6&cep zVN$;6RcVIzxcbsvJ}UOneIk_Dc!HQafs;n1DLmZ4rDL`i(?l|zj=FxAhCjt}M1drzNsqRV&P`7A&S&Ca!v9=jdhdwBJpTi7CVckyFG ztWTN~wYOCa-Jn3PaFTut+9GoUDtSke z^;GxkEL~SFz4W2mQS~8*Qa-PD$8}5nrDTeR&sZ!u6h1RZkjk#(mHEOq0@<*-3rB-j zS%6kYd(EKl0IHv^=9jBm_!U?UToe;_iYNUIeO@$^DptyJq%rD!j7c7JNgoR#es*`0 zd@&rpo4S>JaZowHj~!oc#(K=`<2lcG_St#<&Uvr-PdZYoW%DVx-!9WfFGn63M#eRs zi`2HI{F87LEQRq#Er3<>mY*o^bT10fJ4T%wT6B^vjdDm1-=n%7Oo@00bJor85ibi% z=ubVWWV_Ij?bG_Vms_qW#WAT@j#K-~J_3N3Mi-dCalF{^`1S?@xh#MWQQlg4h<(6E zp?)V#kq(21s)LOutdWPp8814JCdvJ3cE(s_{J8b;Li3Q7%6NM1$Zz*PtCKvrMCP2~ zj~aYRv!LVO;$dUZ5mQH&r1y5AWD}vSoFjPk&ZJpctxrlk<&9KKYtmI7zV=nuIiz+* zVXiP>PjlvC%vM|CI4%P#fT*aNre)}+-ocQIts&8SP46ggkCn{QD6I!S%zDMw)6q6I zHzta>uKcvv3fQ{p4eN&9W%WM|*hInCCkY33>mhk{tghzIMA5qg(E;mTA76+z?m?Y2 zuFa(-)T5?zu6NFsz(Mh|=$SFQxaCR}vYj`J7C?}Pars!iSuURhcr0FZS7}7Udg=gw-=ofMK`#s?15$l4gQuvf+ zHX|CT^Qxk|;(iXsrV*6r()WsMrAqY6zE_{k4G5Nx2V_S7aWFo6W!GMWgZL7o?irzn z=84iGS>_2_m_l_@J3nddc^O0&52Shz${3HV*|Yj$RzxwQ1Mc}THdMfuYTvbq6lj=a zsJE%7@$~}DM=59W;9~048q!_;uR4+C=2HDU1jZ9=qUBG5;LPTe>ST*t7KyKGw5JZQ z$W_j$BFQE>4u}!)%mj#FEyr;S96r{O-SyF^s)R~e65S^qDUHN2oh@N=j8BLc8K0rz z-stpu);@6#Yl41&(oDoq(*Wt&eSQYMzp{5G)fvR08iKMYVhi|q{HPanu6rswQ;dL~6dABJ)VZ^^p)GzflBNvH&y zKuF5mWMJ$oF(vf;tU3qOZ!iQXIqe_!}kSspj1C7HU2` z?4tUMog;GYo>_jzYSiV*!PHP%isLN&0q=+IN>(I$Xm!In$3d=TPqNq8$i>g%?<=XI zgmYspTSL6E)x~J3%aW^SVi#lj+3Et(32X=ZDugF23L{PElhFrawV5QV$u)COBY5N` z%?w>_IPhRSX(c#{N3dy6zot9yP&}s>g_}oZAO+&6jMldGN1>X8eAS0yeNN%5jV~&N zgC}Q+X7r-HdQF<;Mij#>37&YP$FzT}GX(@9-bbacYFG@KY7kreYNPBL8&{D+gnAWf zjt7Nbm+=6LX$M&)H223U@2|c!sntw{LBY=SgmZAA&NTwCO4O)TFhoqm8zUHCjbsRX z_}6>tO-BuW9?$=Yr|z_&l=QnO(ku_y%lQ%s-N{?*Q=P7l*CaBpW)BMa%Anfu4y#`p zH3PYE>)))s67JMZN2{w;M_mg=_|Yc~aSLl>V`C#HR6J+vuaCO5+G0(R1=PRVk#2GY zu@oC_7^3;LMbSS#9ecaU@ullJe(Qe|$CkQr`AVzm+!5{hD{*u@b4iGh!`|vWkGD!kb!Uw=u6dNnavyzfKd2>1 zMD8E9SR6tY^hm}X{FwZI_T!)K6rp}|3B4(Fa6s|@88E&1>0U0q5sM(t=R$3;K*Z*B zF(FtsAzC1keWb`nA$=l@QLW-uFfm<}qcSxrn`8LCx(M(lP$HGMcQzFLo8jf1BeJ8O z&0Ky>qx;Ywi(Pllq8MU*ePu)b^d@-h2WBX`sgh+JOH51Jj-$gYZH#TAygJbaR%~u? zM={d-GwRb9{q~-}oe6$nzM*KtIQeF@m8Z1*laMxQ zHh0(fEI{I?+E4+t%(>jY=!9KuJx{bPi*V6iS-9AMt1`TY+fsB+V=W4H6PI@$Z0k*U z>t&IDF%e<-PX#*8gapoHoxkBkN(9rtKU|Q{w?JAT7m4g!YW`YEp2%UNU)i@a^h6IX>zF*E$*&~~iStti_m z*DzZr^>K2lu0+iW zLsfSv3)UXL&T)&Y#22n|^%INVxV+cn4Fv&#R4A&=EnXp?iBUvK%uYs`GeAyKT= zWEn%r=Hu@cM(Lqe93NTdlYgvZq!JL#b5H-=&}larSdq^#X02Mr;0)78KY_>IkBv7Q z@+Af4YQjIYVvVyKbvH?HnE(oaFQ5K76M_bk( zDUv-%s-%;>MOkeIL)7-V7>6Fd>fk%tqa7_0?wBfeFQkV=G1<={)?m@WuEyx`|o1@*_vL!1Sw zKO^~S@4Q!h`Z~v&TyD-jnI$~%SPga}1f<{DkIy-N_3qJ8r1je6-t zy4oS{)ri?chGDBQM4uCTyu&Ucn+1nyBHAR z5|V~VzVQsU4j{P;?A_A8%I+6j8m860#`yHjc6)x9dGKicoGsh9CW$(j5IXu76v(do znb_GT57}a|7=#7ZmW(8$c6VK3K|hk=cz=Wr0x=0g8tx1!+S6>tYWOt96=O+p2T z7Q^M#XM3D$To&;}F$60rb*^Hxm)m&$KKErv7I-ZG#M~Tff=`$4R_aKPDEJe8z%Q*m zDb~;2oOfXLO|c?Cwk>ksIjS-1i*%77Kq`|^^NBqgll9K3jG#8J&b!q{okbNzy)o;0 zML7z3`!QiZ8TelQk+`qWLM2zgxjy1hpO3fMR*J+Hsbo*LM4Io-l`Y13jYK>JYi}8j z$B|l+5wPit0|Y0r74}Vw*vM$qG{G;EgVCkIm#L%_Hl<6tz2vk&jTH>8c{}vnoTr&7 z-siHY2Z{JA&j(9k%*pnHGC&NXij~Kr$s9i|w1|uK=+U!p+79&DSBKvkn5e#|Rn=$r*VR*#*zR<= zXa{H#ZWW_5l~@xdddxn)9`>s%4`5Yw_DRKoe_N_niWuap&A+nGe|=Ff+|lkSBa>Mx z2?tZi@V^6@IhHD`YS{0qe@9C`T~8Q*bFir%9s(i|b-i{8AY@qq?as?4vgS}O<%r0| z<_MWq-xF7LXFX$}TL}e5$7cbXx9<~o4(ET9@`BI zt561mE6x1LEA1-jUbIjSDM!^~s;?3C&-_vhgvFn#me9POs1E&;%Y?79{IU3vPg3GN}?}u>7Wb2mE_R@YrKr1K7m<^ zPPSCLb-cjo(vu5aNNlH_4Qwc;HhsOxImwWfE$okZO8-zB@Jye)+$$`tKk{nDxQjgo zB6Z<93}`*QAF9`G=!ae`Q-4s$y`C&Cx_(C+=ED^Sps2BWr{gHjTgwXsFr?^Hv$fRP zI{Qz0=Tn|KT{9Jvm zMYb-XV1xXIvlK@2LLhgrTgzu3n|Hmeks%JY zufWYy4MXAXx{n*rW=!N9q*o+ciTBFas(9x}ayA&6qsd2WThZb@{%gOa>rcN#J%0Ob zN}1lM`aGkU%2aCVsmS~V7aqlHmc1p=^1yG_nU?ojbNEMl**$rkE$S`iIXvN|1+Il` z*^bx8Ssby#5~NqGOFMSH=d0v6wdLT4O+wTJ?4{+fc7;^?Fd4Z?g3_b8Na|;I}czE(FbRdyT1}_n^5mtcF z11rE`tO=A{$~oU{GRnMvU)uP?5`9^CH$VoK!U|K$`mDWU^I< zLBpvP@TRWib&FnF5Ug)BC_6?=$EdP$QT>a(ZzhWXo|q|u&rcX=3IB!lB@7%8q#q|} zH2!Hehs6y0Hu0rEW!y(aR4@B8#|B4qTuTJA58KzBG`s7Wn}NOTI>#3jo`GI&;SSx& zWdFDe^im=d`1LCut&(nplIUjnr?{v89M0vmJfZyj?}9bk(QwR<{c7?z%^5l|2a9~} z)HM=-7554m@-|7+D<)H)f=^&!|5)x;H#;>gW~;%|;eCyH#*k3t)_m*gLi4HW=C45{ zpC{+cBadw<4FoD8NEH&2^Rt`fRs5-t>vQVZyaaa8K)g%5wJ`b3^^SjwGl1P*5Ub1gtGU@s#8UM zPL1}3r=gtH2wNe45U9%w=*=C|w%onmmMl>;mZQ|2#S`CG1ecL?xQF-BCatrb%}Z7W zAaNAUHO6_JRMa;~I>wWOyqGP5=73%Vb ztB(%;-Vc8%XH!y7tx!jOI9+MXDsU+CUU1%U%B+BOP|Kl(DaI!^7c9bG5X(73;9u2~EtC#L9m`j%%BQ?jinGh-xm!g!<#Tp$_`K`G zH#fo=3C)yk$f6(Nizx^YxQOaVNdrH{;YXjGRHd( z3QuxEOkNRc>{rE1q0g7uh4^uI((#Zx5zOm1bLwd^HeE-aLj9Y>8IL=PB}3FHQ6tb` zs0OhV^x_u`-gDPM-8AJ5@P7p(kb>qzzOD5{h}$&BvC_G&u;Ja1|NS;PuXA(IubEIc zH9$YnXGrT|ag$<(T!_0yQHdGvD)giLwf3$cN)@SK4&dc(-L-L5>+$Qc1nN?vwmcF2 zpgvK1g1Wm|AXmcuoDxSow2j#|kiYPNaP1473v4x93ObZvR6TV3RY$pLSe|>vLKpVR zJ#}i?5R^^}kZk&-9;Xqg;}@!^g4;XixQ4cett0Cc@SV4$2u$E-(yE zanbG+xkCmVZoW)H7zYm+_6BR%csjq2wke}mo@g}50jPTrtkKGdiqG{maR;+_OcB}i z&;L35^Au0UYWOca)%lknI*^Cwrv&~|EA=uJwGUSLMv|&Mj|PD{ETW3O(~hYuAOh*9 z`#<3ad{E1@OI%dQ6m-b!QC`rPW>C%C@~w)iYOj~hlKt9Qk`){9_-8!G!+>wcO%juQ zGRg7F6;94qE8bis`v^Csx#3!pdWe=6m@(n=S-=b83DanbVkHgu0}amT>{ zn)2pJ(d%U@i$yeMPG3dBZ?o4|@nXa0QGcOUoT_9IN#xj3vKLr<64|`lxVRJeg^bk^ zau;L5CBwp#nt!EN&lK58t4Q*yXU%g=zg@klD&`@?d_;`RiGB$6thSVTVjyQA2!d3@<5MOk5g!YHI=JC)H6g zTQ|)QsnN=Ws8#pEk-=a)J@z#-TFa#oPyM@By|!=cQ0W3Q@WHN$f!S|lR)4J-?^6(s zGaMl-!9Ot?J+RlT?F!D7Bn9_Wyl3||e8@G%dvNay6V zOF=4(@(~&A!SsZ!CYx7ri((Tn*CG)3BW$`GyR<9KL@7r33R(zkvTl>|rh4xGCrCeY>WVZ87WBg{0Z^ zP}otY5bv$CHl7UQ*JZ#c7q;zxAQ*a{u^4^WYC#Z5AAW1A-levMyg^_wfNaia^u{t1 zE{?$KdWd0j)6f?y(MeTun56KDd4hu8JM@ZW`kK|vYQp@^sp%crXxjQG9JV8FNF(87 zeWp8Zs!SPK`A2VczU*h8U5j7)S`X5WWfrtW6+B-kGuLt(og0+I$bh(_LajcASmbl zQdH~=6u0shx8fGv9Qj=M>gSeB^!iP^LeBfs=6g0T0xR0)R;$BVWfFV!K-cS_sZ8Tl`lpYa09f zOGp-kXa1xfjI(3kWprAMAa6A}*B3x6eEAvf28@I2Au(g(;J#TanGK zU1B3#zEc|}Pd^14%5AaldjH2)-74L2&FjO3N19phjp9pqAKPK58RKON{hrihn_^|n z&1YaQTfX65WCk@Ejhep?SoN+#hA8(sMT`B_RD5n6U&jc_7K~JJC1d*9t!nUjR60@E zc5^i!D}8qSO+_p}wl6~}*ziP$VRP<6If8FJ&oHj^?--Sj1;rsMqC5YEot0AA7~}ty zu3q%WKn>nIL-Pyn#k@j#C7R#JTu8zy!(toh6+Ok^K%ZF{IbD24>-QIQ(h%$m?wdW= zi_AL%j{MGq(kzJToaty;H|e-rzMdNNu@1>6^f4E)j=A{ds<^sw!JR%^4-M*##d=unCc2tO z7sQ(dsJ8xA!l!!D!*UTCQD6hIl;LXh2|GrEaem4;!RE971a_AM&(n0DXxXfgith(+ z4cwGO7;8O>g{uh|{x<5oZ0~rZKNKMT11xy8YAsNQ=Fki5af864I>BSC<**6!;St-f zY>pZMJ?D4${i8KH^b}{OmZH>%ThSt7_iB!50)=)fK)K*h?n^#Cem?iQ+BwcxMF!#q;a0w<|ci0pS4B2=Yw`i_p|dK!I3}jx8~| zFUIuc(gOC94KVFjc|#u|CN!ygd7T`$)5+3crH7U6TER5kI_SNaQ?zCh+oC2}7DO|3 zyV+=N4nHySOAOAn@m@klR94;6Jf+U{?CTL-lH-VsP1{ZvT*|e$JT>_}5kf2a8@x zhYKocxr(EXS9`ks|7l6_CV^2*RxTsEz1rq@Ve234EPw_^-SSjr56spsmseCm{gix^ zthJ(vAtQBmQHQcrv!#g=U4t?eWZ5g;o_6rI)8ECPWF%ZGNR>0ba6JsVD5Kfcu)Jw=ld^lQ!9*4pM@%#8{{_9 zkgom7RPw1OBG@Ck1LY5}|B%kQ71jHd02p~}Koif7Bf=pQ!h9F6ZG;@~)|k_~3JyQW zM8hx1DJJM?E46p0a8Vkx77AI#?!{|Ez5&iWK8^*MTQhLg{|bXq{@1Yo>>IWWSL&??1ek_OQOYx;RvYRI62u`ts#&P#W~|1#apq$!Y8Rr?Ao z?ZGVM)|ZP~A>!idYZ&{U`Dd4GebpV4CAtS>RxbT-1!I&$;ne6%Md`gmmY=|o`h?^r zm#UC4sF8wF@L-4saB8-h^{@@bU75EYG|%zRXLHTp25Cglhoq6M31v4|k@?CK zyW5~DTYu`biLIkn*~c8JL&}jzCi>W%&(!grH~;;?50tyOA7Y_bNJHUnpRs*D4PrG& zmWw~*sxQjz>l^s*4cktD{W|-dl`7O}GIDD#e#F9&Ew#u2<_fay6mM_ffj@4EPrgPl!?GdeF}9gM#PoQDT3O+?f9$zHP%f zG*4i!WBO29Frsdhr6N!VH~=Sngx)w^)%q1qkGr<3 z@R8aF2r`QiZ&e&BJ+K}|SPU6PFAszncD>NAVS=_48w`P zn!B|`N1N(93ISpQ2(Ia8kJ9nzhoCsoq#F9OOQ-KK9#7@-N91ALrQoGT(-g59rN*7I zp1d0Q?@Cen-tQKY-ypv6T%*!|{|ioPn+`unpzQCx5f_}{Ov-+vx+UgJQz_^Gf`p54 zL%N}VO|%S~&tmFd7$xGBta_MdZ8z^m(9a1_u1g<3Pqeb>b3dd7j$<#^uy3v3yJyl1 z{p_AsZl0GbKL<8~8X_-GO~L}g5G`TL+sTU;r>Jri{VayNdPN-7>_;n|5Ig3GjQ0B%`|%v5Ik$Ul+%5Q4_>3aBMG1}0i$^H*TfW6+;j6Mzs{(T z?d-3y36I0b!h^u6+#)I>8jLLGrB+_+eK{t(ifU+LzxS4eO|tJ@5h;cwlv#*-$X0^> z(n2fb61%n43of%gtLpT5(U`MuQkD=BnIl;l5FCuH`!dig(!2T`*KpM>`l8lz`t8cu z)FxprA4!gl@i-h3SZ*vvRWqG z{?Q-x07BrypotcQxO_v0V!yeLZ38#Ndq#5w)v>RMNv#4+=hXRV4LefCOOheKDdk*J ziFTXn4aKXeZ9v{>kQ8j!G8R}KbKPdx7y9N3!JsqMrwChZI6|lnNrGa zMI{MYuNkmq!K!*-*^77sPv(5pOXLt9({ldXGML|I>t2kd98(*3#P>Vh*gw3YZo6fB zKI*MN$Y$ar{48mvTMm~$u?!x_R0=_cIS-3ePn(*Fruw}|9d9| zRp9u?L)*T#t>pigw}KU0jUwUyR`&ca3xkuaBZc}PQRkK(U>CB66@Tkz9<3m0q>DxEXM4^Elc{Ti~g)>!;@+IlGy;j6Rmwa0ugCQI9~qmB_XG zK#*?kn_)Ed@os*nLgc{gMa^C;#c7$$fx10cC%(=qA`4ENrA~3Uxyz0w!Y2E8B4Oek z$4+xBZkVqEsz4jA<%6hrnoefVd)xa-j8hfYxa{^?03&AdQSO!Ha2``fh8Q}S*`882{|%wNcFuNhF@7s#Sz}HhPxK$>R+n$c@t@jr$2%C#{K5q+GNL7 ziMTyye|L_MlQ(bAE}8u=&p}@%-h6xiHqw0RwghqU#6uo}qBlCVrz!Q1Z@fdEgt-ax zIa;_%(9VmTgy|G-8Q^0 zl_~X)9_*%U^T(Ed$KO~}DN(XEpy&5hDq;@>n_UuZ$m@y~pY45+j)r8MT31t^%X7NM zIG{4c4INTWlQ@`E-AB<2C&VzhgpOq>bi~%y#@SyTMQKKnRk|Y0DrVfaXkbUO{di_t zTdDZG$JxjD9YEH@Zs6BfDhvd4TNL#zOAGtLkbpWi#irh<+6Bfspf9A*1afV3TW%8+ zNl|?0=+_psluNTDh+!FYEZ8q_nh?SD*U$%ms%>#qdm{yEcect&dz&l+Hr{M$QvBvQ z66wQhyZMwoLG@9#y5Cx;|5+?8Yl6LFPoe5l(za>uhgf{U^V#fZ+hK0ApWm-bbEZL% zUfcZkkDQ=mdj7?{=6ZKlFsZZtxhTzeztpF|teQT;sFA5;y(tYNPeK!_od0bN z^-LKcM!(CE|Lj}g12q1~k-BT4vZ+@P75}7u9aBR+$*A|lr0GIWjjqt3ey8#2xvet3 zZz#J7T50ca$D9TLC6(D9!we+2^s_34evLtOD-1 zt;GZa!%8=9*LC<!_jO+em((vd2m8Sqzq+3d^&eojyN}ocyuV}| zq&h1D-3JAi3RlCXPYL0@K+*Dv_W^RJ!GiSHduYu~@CzDbBERC@*;(@(&MAj&3=iPFfEnfKZqkVuq7|3wC4kXL zwGob5cB6XwgJUXS5b>XsW5ttEmga_?i{6)%$l*W-?SKai4!Va3k(|HqC z>otk|3K?B0QksiXxc|nN9kDvvE4lb7d_c?OQKd63+(Mjy6q4muyCtuV)TVi;&TZs( zXL_Ad9ILVSh_?jHT`d=!v$?6| zu5Dak@vE%=%*h>LjD6G>9TYcQFJmDhUAGopMCjsHiuT`d+)C$STqOF`gT=tlLVUBhTd9FG+?&Way zP*AQc+1MmwJLX-==Oz9++llwWx#q%1;vy3n+hSdGx{N@pwfV7qEfK=&GVw|>#X=X# z3^64zB1SyY*!$|+p})GR+zIG;iOM75xE5Jl(IF$UXuy zpdV6ap9`_!qQ{ z=4&EUALavPwy*y@%l+VUWpUp~3!@kIfO5cN(rxR6^O?Ny&3D~6CJ|I*Pvny`S$*e3 zWsj@zrFIgQh-bIBNVV*U?f3!uvd7M#;~#prtIEej8u~RjuN(sS8g*6wjL(VbY&HB6 z-q|&6%^|mujO}+scvY}Yi2bzz0edx{K`h4mQ3s*m)A=~!f}8Ue$VtB#*O2Y3PBoVW z&K$GK=fhj7-eWCUn+X!Xrv2cbo`X)d{oE}hCr=u{=y#0?CyNC)d4jxLxG)mSYz`Fe z9m_6mm)uIapMSvfO%bu%hYe|>x@OMn63GxH1@#m7b&4*MeP5YZCCFue+VW$KA6>GuEQQcg zO~pA9S72Rk74~sUmg!{g%0OmP!K}AW%Rhlz3Gt)A2J%*bxo_r-E|awkTo;ZH3)8WC zchZ|vJNmW9ZU8?-xSS^q>@-9%&k$ZBc=&er!W%6=8T(Np7@yKi4YU8oqC|BF)K zyeaLR|2fAv{9EI~?G{Cxc9Zcn`b^YY4)t$7L5hs*wy!o>ToQR>28tA?f^Xl7C%+#X z=|e2qiNqfFMAeG9P%hQ@i@JJPd9+t(jMA;2+Ef%fN!X-u9}if zg)YwYf+J3BuDp(f+7+8)rHxV*b0zNieg7a)dw(qnKa-E^4!BsSIz7KNsR4g2F!xc2 zSoD^8B||To|7C1oH(SZ#YQy6p9qOa`2%@FUkTO4= zN&k1xcPtJMXdeQi=-b1L9}4sBzTo)s27bWStvQ`)&YC0=&v27uU$8Z^F}2CHOgcn- zks+*_`{NUKJQF_@?mn!>6`~?%jVrx?Vf_7AppQfDkK8}*+c*Jtn7$FZ50P`nlktaG zMKXd(uc1HrJ@{(aIU&^_P!8bln;wNkg>vn@RAi9Gj3#Ft8{J=&$I=Nh%iFR-Im_w3 z&EC4txVjIO)Nz)(em=r%>1hi8d{R%k_9?nkO8JF(vi-Yz%xeBvCS$g1YFf_1UwjhK z&-Yz+6@+2bvA5#I9fy{MzI2ipTaB5zuZI3CtYM9`9s?2YZ!OC3>k}RKRz384{ zc{jW?6LM3*6RF#uC#oKX$Syy(4=#Jvy0y#HM|8U=ki-woRaY(N>L>EZdk|QhN8XLb zossI0=<5coM=k4)^_vPM=#Mg84T5hpzJJszo!)KC*Yh89juVMd!JjQ3pHt17{d>b` z_#1M$TcI=e##M7gDKJO0?~j6$7u1=%M%ABM&|NRu7BN`2$mCKvT_Q~hoCbUIYz3d+ zX=(CsfErTrwOrl!Oe_fq*?@H8=dH=$EOsIA(;IvD4|Rm(J*(?NzmbN|qN9oZBevDP zt>wY&D95dEFPhvioq313Q`F~z$ZcL!$~!GFbj#90_m^>MjvP%M8}8FW-A7SVdd#O? z4T>tA-E`4PFNEHosDx5+LUQF0g)h|#u||jIfK)ght4hG(=xIk4!?29Eqb!$(K1Anf zjxVZ`9Q!vcl6Ljd`&p|@8MsZWdTc}Vo2k~NtrE5H-Vc`leP-s4HFeLuR)^aZ*cJH1 z@E3`j=F`8A`R@IHti5GW9Z}ORnm~X+u!P_i+})j^!QI&qbmQ(GG`PFFyTis^H*Onu zch{Tb)_LFW-m3HG)R`ZvdY*Z@XU(it)zh=2N5(Oow=`&U&xb%w1Ct3((UmJHEq}iK z3o9nw={kC=uj$Z@HF~GXX$X`K_1nbRn(c2CW-xkPs~*b?YBpQL^D%i6l5|Apm^6yD zT}WSq#)Hhpunj|Q7vqohmSTaGjfS9tFklt%)J@x4fA+cA^8WAoAJ}uymmJLh&zK=3 zFvpp}9qYC#^BZE%GP?Oz-k2uh{=0cqMFS@s&ZQV9tPcaSIMxyPy;jk;LB|89rh73l zqKY}vkeb}=xd1e;qy5X6yWe@dmkAi!Yc3f$Z<}k-WbIzf+4L(@FySU43!k0?Sqo69 zgr6&bTmlnYX{rr1C3$qeUKO?$U%pHc@a5>5_;L=k-1CTfBk!lJk~sXT`)o&;_4=_{ zI})<#Rgtv}ru^fn2lNwJOJ=vB8IgX)DM&z`-u0T5gswCngxt&ow5|PiA$;I#>Aphw z?Dey_=MgY>8#<@Ll#_dT@EgZLva(2muJ_bD?2XVN-jcBK2R?%-U_?W8(UHuuL;{ZN z9Ls2KR+u`nsEC(4`(2w$*aSbXzqn%;YD;&fivyfDvFGUTRU&!=%nyzQ zhb#0KjY0QVRD=>n4A5C1u_SRLx$l+pDB&0`X)WP{{)IzN;Yf6(KaO3d7p_%>gr~z~ z=Xuw5pjeQ>Yz9oZ7K=+Q0cBx;+s5rF&*wID0gh5ub6ee1_WTCJ-J9qsXah-JDMj}5 z#`*|iQcL(pX`@@JyOxw)en=THdk1<3>(muf zOUIqgtj=5nk5~ERMWk+~OGBxqWg}0}@*u>G<{EtHMZHvE>k#(k+VoAIr>-+ zgrv|o?@S@y>7sOs?|IBl*{QYMr_mr_A||{4wl)2)~=F&RQ%K6UG(=}yHiTzoCm(= z!F}-O-SJuXlCs?0t6lyvha0F0k5i=qk`G=kb5PKiU4GnNBd?5~07u*WPf|9Sp80XO zcZ*|VTH#MKB;d{?38LY;AD7<*Hbv4PLc@<19i#T0&vvQk!IBklbA2ISz{4vhvp-26 zuYIr6^KPVaN|T~5Qnpc7`NHOuy0O_G=J-f;)UZY5Y{(Ygu|)Xi9~^Hw*DdC(iO9mR zo0?|}2^eQ78Yw7i1KE_R$#F}pFL+XJblf6s^y3&bwH?rN^-m|{>QO^eD^g}Su4BkT zvs0$Ts~clyV{l8pnGq2#<`gB#wV~NpXbhmMO!?v`hXVR)yG7Ed_AP&U4f4}P3&2v4 zI``giTeY-&aqH-Mu7yrUJv+a!(!tyqXo_5Zigj)$)!FI5@FcU>7~zSwdhOSpdx$u% zS9ydddKzV0OAz27Dzs;DlEV7Ufl9!)$NJTDI>2~~m{u<=O{xw|lK=e?r!5t5OerV- zAiZWWogi=3UTBZys7BdptRFcVk0OFlnT+_8M`C4XH^>68=oGGOD;#gt2LmLah8%p- z=tqxV4M{y+R!BBFMVbBWravCK$EdQba8O>h3cRI< zDv)JNi~_5(AHQxW&L77nEc2SNmpmnWh(EO*y^1#-G8XJ(l-EM>`dzlcH>5;cpi*1} z8^Dsze76pY)k^(}9`7b;!Lb#$Ksbpo6{oL@-|;59FL(WO)D@Q4Ic!4N#w7Af<~Smk zgm>uO<5sd$jYA(%tkT7)AKsSj(x4BGMVmdyIT_rU_i~AE{i7YT-#V#=HgSs$;tFnv=gkgpQ@hOp zC=BT>A}6g$rUKoIK0@040eqOcW<~ZYzQeb3yZV{N`SUQ`B9!z-J%5}PpA5jAIew2)3M+X$(zq|%uR5W^+>&lNyi$C zYLl02OuAG2-R)v}0`aMiik?2pxG_huZlxBXkMwC4t`~gO<+KbAXS&vs)t)`gd=G6@ z5?a2e<`(wdmuptT3gZvxFyif`MIq7G^Ql%m)-C85;U!qvgY$9Xe_jThN6N-~iv9R2 z4U{tX3X_9`=ei*9YG31HQHj5ZpQ#=Mv-#z>d{$XFJ)A9BGJ6Qdg z0wMRkzwCzYfhPP8jYyv!LkT~D%#y#wjlgC=(Z$4izG-V%$i&$&APb2@=?>ZnUf}_p zMxJiR8jYlMJ%(Fqv}nE5HU2p$U{JT;S-pLDe-gfdfBh|x3KRgp+=aU9a?Rx>v|vBC zhN!HnWXL9Ye|_Qn*lFH7-UbwZ^@UmfnM{;$59{U6VNn^B$*-LqN0cEq;_9#1e%sD7 zbjSwsC9nGig(Y=-d^yG2iNyGjlN+)0gJB*cwXW3-Zsih1bPRmStdj%%;D(qIKm)l3 zyLtsK=p{VBdI|c6bNH(jk~oWwNc>BvMzFFw?Fc_`p}-ymvPlv)K5U$6==W)T3r*uw z05?F$zjz!8-r_1bhD3sarq0r-hz!mfEP@tK$kFg=>um1B!2G47BOGBBpQv?%0a}Zl zE20?>TTS*0_JV^(Lj9iKqVKJOPUPzKeOM#JZIk7Fdb~UDitsVbD8@aQzeQ1F)yu)F zzS;?QPBtU-Xen}*dLaUswaOxDQ$Cqy&_6Ek9kMvc)BhqKu~e#&YKUIlq%fW|oFP?0 zx$2wx4tRrA0v)g7bHVTW%YOL@+3Vfq7iMb2Dh9fkRgSJ#G}5=gvNfZ%JL)L9K}(gk zB{r{tPGAF};7w6(-T*{jQ=5GG$ zQ3F+ditf$aq~AyPJGHLT$B{=@ ziV{NSoU7W<&iVko)|H1~|K~}Qo177`nZveI)>ef=XRJWE%+T^l}O@Q>eKNk@@kyY4jay4s-~+Y1L7UoqZrRAqbB+OIK0(AHmZ)y;z0$3 zr4houXPUd@~WfN1}+hONN?NwD70xd9oeA5sO{aaF0KknYuI^;1#Te(Cb9!cyFVJM70p&t53~1_bXMQ%j+SBqM*%EdOdNn2~|&kQ3x}Wa{RpJgS(B)TT25(-oZ? z#3yX_u!P3b;Es>n*G%Q#AB<%$D0 z)irR^h0a2`4^dVJKPk(+AEGvvGaBD0Vr->V)nFkBuF;YQ0G)EBRe58Yp>L9vwLBYx zexq4C!g%L=y-f4CF&}+IdD(M~yLQYlJT&XxL?H^j9eao#H@ljXmHVQ*3N;_ivWL}@c90zSo5$S7n5Lnv8kX&OEo;cR zdYqIN``Y@glv>(*@I`1C7K7Bz<9+M#s?#7;-0gAgZ?cE5@ME8Tb*n2w6gFeXyonmv zM)yu7CZ5KA)8LN-%^|SGrnxDW(ps~*sn^%xMxhDOcq(JK7z|uBBQ`#0ET0=Fkz6lJ za6i4ws!<&HO(JznWcOTWM{GBvLDSY3ML@FbDs*?HlWW%Tb2s@n&(!{Nfs$*y9;D*IvnS44y+j%zfdTp)>XMa=u1hVh4-vMOQ_skD zq&|LpMxJ=|=jOPU$h=_vpqTti=cv10)B#+lY>aAr{++fOMQ0g_h9CEN22GFC1SosP zp7zL>ER5#lLfM9JHxe_9cmQY*@hNXe z>-)*72`tt6F%rdT?afd-C(k(p&NM2Yx~=Ap0en*19njeM3}EkGy+>t|UO&=`W}-50 zV+-;9vf31Zt4k4+^7D#1V?cLQcFWzrQSF3R(935#Gq>^A1B z2*Gzx^=&%hh9ptL71$Jbe1|Ug((SNk?I{ylmbWQ6VMz0XaQHU((Ghj%fmCbqB*A&) z3nv2DrjzmGECj-(yPJuso8~}RM+#~cOoAk5hs9C~GTtDds%2q~w|5}3`wd}gL%}gz zsd;^=w(9u3`T@x8;XY)ofmhqGj}aSilB1R}>dC7k#~h(#kfK88=QY+q`-+0Nyy&1wLBk<=EV^T%E<`^4lnx-xwwpX zbO+tO%))kXU+RD;y>%^VR5l#7!h;qR%kRkV5s#MHT|K4^>LF*W9w1p*@WI~=nPG~B zf;KR+S9IzfgatUXNrkoJt02YEGl>4?2;7_!*u9& z&9R!X`S79H`x{rfE3B-~hGk^~Hf znGjmK7oCI*@MXG}&P3PYXlA2C=3M-c@heO{?b?yQX0GZeN0#bo7?x)Zo?fIDR@kj7 zXAkf!KZO(Z15RA4x0q?2z=p_PWpSI|QnVY=;{A|OI=?~#O@86OAC3+fX9+1Gdc*&kN6}$Y z_`vZHVzB!uLW4@JUL)_Q;RLiJOCJ_vK8IAh?PXJza?m8+^14|s9$0>KwmGIIs5Ee6 zUantsoBG@&T51UUs2=z;|Lj3LmwOx;=8?--M9PR36luphu*>)t_k&Bq^%a(R#uOnj)+atnqN6hpVl1&mgihleR6dDNw z*ABCKFEW*&v`ek#8~Gjt$B6vUQj{*_2{@OUuSWJPpTX`=ZJrvOW^IzIfMz;SAVxdP zkL4OP{5q-+dcc_WB%1y-G?r-aEYB4nd=)KGzkY|d?f5-=(J_=*DZ(oTvRd!aJW*A0 zpTI-hu5qov9d}a+Gq)MPta@**CwHoDkOy77p)^XChf}n7vzWm1@vdHgif~BlOHlnL zLFKm7H1hQwjj3Y6gyKr}jGA=5hLV_dR3+piWi}C*W%G=I&L;M`nXw^k2UnUU2h3W& z6h$b1zIz6qo7VgG@zvE=Y2))P`K{&F_#9fWc~_k&3B^SVV`mLb^&CVR8~(al%F>1Y_B7`e_*PUq9ptwJFb#(wRYjj#6#D6~7+1ov}7X^3t<_`k?L3zqnfH zoV562+(yYJg_x^1i~gNI`2?&AsVlKI4%UFblW9afS>6lEVP`9rmXm;y|L$6K>`%)r zDnli&L+XdngyU}2i9Sbsr`4>@n!`wqlN6S{*+%<8!u3GfOS9uhZ`v=LV!Ate zOY+nE`la?Hw7N<1Em=~yGWK0*u5XcCw870RQ?2}1y9)7kaW&PnjvqtzG@NmPUSL5x3v1aj;^dse9xr2W%{{+gHl3c7hA!13~dqCghcPty|8m^m+& z%5S;6>RNwwCt^E{F%tGOciaJaEQRSbqEdp5QBByTRE*F@&8~fffA10VHxtFrM(Ezu z`KE}dtr$LSxF!ULFcSxV4DRma-wNWCTMO3+bcmo|d^brMA8Dw=x=3o+%RA2ot0}*s zv|UZ6X9Dy#krgpO5T7yJ?K>X#HYjUQzT?$ZLq$rkYN7)@h}~z_rEfnzi_RfXd!%|5 z&}m(ofrb{Cu`)o8db^%`fK%}^pJrqKjJfuC2YO#X?^xwb-PlwmsF3#Y_oVqbAQqGo za5R^_LR%hF)>TDM!;jJw%5ZjoY52M`7IU3hBl)7yWM8rqaqN_U-O6=TXYn-WBC&2jqR8oI-A+&ZvN6t z+sQ|>B#X6)MpB@XfEw3ytFQnI#*F~pXb_EArW&X$+_GgF00#LoRkkz0)OKJXdh=dw z$nuqj=;=cl@tuciw7b{me`$%{9XXKCW&LN9WZ9M6Z-^oaU)x(^G`dM;EJVXTzWQkX z4tKX}R^|WlJ;u09#LkMJS$Omll`JEbOdzX!LoqKc0_^7VrZf`o8ydJxlw3BwL4Tk0U3?4RkLuxkNmhh# zqZ>)gW2?^?$tV<|?w-$E6dE4CHI(2)w3PI_x=@*FGLmpP6(#`jX zzf}1@7wYNXKK!ZEds0k18~XoMsnQj0bs4OWK8(EWL#v=uShf>|sSh8_vroRe9q`=P zx*tY~^!iwc!V|GP42s2uHD`{lcQgYkq_2Ym&$rO#ofb70r7|)ZP7@id=Y%1IeY|DBBI`uEK}& z5pL5b`kx4qmNf@)ZB`@p=y+lpMfze)R#)H83594|_;T~79Xq`R0 zoa>s~N*I1>ahIC|tj=w6dAJ94nP=an0EO4!H?x7iUzRl?%A5;_-y-iHCkCxcD$Slu zIUiSlvgeN^hm|xxvrZMJHcDk!jSCP-U-PzDJTtjbS9fy}=&jA{zs2(RW*+GNiDa55 z8^_h2!w;=aRSH(de^hR2S!X#Gp5P46&pAVjpE2z;dEjj*jd|~9U6$%YrHQRbzbX&H z#Fb8n9t~L$PB_8v7_}Br3{ZD__1w&mzZ6ll+Dl;bAIF^(WLOX%b7;$1UIOIC#)qD* za4%fVo;&h1#I6p3L>+LQXCG) z5Gnks#Wc98HSt*?{{ez|#Naz2xnAZl%gilA7UfEyoKz&{k+lGK#?W4%6-N?s8Hh23 z1>wH)FgRB7=5*jB@HS=iVYm%5=$6pcMoA_V^E|w&4*6=F@*Y>Aw@ZsVql(GMsvUL7 z>viT6hhecPmi4c0Eb>kpDcd7og+;3S_3t0?pnjj@4xD|blH~4*>4F|EOpi}ckFQLu z{hVNE1BI+l3=-$kKZOiqN1AUBCId88ZyfDZnG3_Aye-fwB1}ySOj+j9IkM^D8%=ez zpsf2NIFPIdoU%6aPOeq`8q-%DK+U-;&jkx#Tp$NB16rLC%4v1!t7hj7)2R`S6N?8j z)ntEUtq=}~qyB1O7-4Brb22$nV8gm46EGE+?`GiDX~8aUJGHyz@H7`;c4d6*LbE=$ z*F}nu91_c}Tk4RmCnB!kt#vP)z}sWf^-B)~#oBF2cvwc&CQ>-zOYR2O7Q9AVHR;aS znaiGG(8Qr6dm)?^IuEaNKnA3nD4G~4I#2qnbrQIskKUi_Y}-7>;<0TV{t{Yy&{~^% z)S3wsEr8XZlwxv1e#1BHAke04A*_!S%qG5#G)-i`;Kw>=G2s&(ECs@&Wru-`>bnYR zGj9~;c4LcoH7Kf&um&GR*=$DZphb~>wQ`OFukeR|qEp0T_fUCL2HZ8~I(SaUV;PI`&QrX^I-N`?EdS{NKA0Zfb z70!7WTzI%?i+RV#*=hL+%nuv8E8&8H9ZCz-T_Idaq>Aj)M>Tx3GnPc0OMvkD>7*TE%{u+^O_zza)n;lv?aXkQWDJTa_*q+PXs{lW3xDHc zdq=Y%jo9x7-=8OVr=;68u5a^2+@LHM`Y+55nTg~jNZXa4`g%+YJK`oY!*wMzz#!`+ zh~^hd8oJPsQHr-9=|^Ko8^F|LHmr!{SGxO0yjPG2&8e7(gc^2e&PNy@rim`7oUBI} z-#;S2`}(#a4FiOk`^dGSkR(i2;LD?PpRjM9@0>tm_%Sl5fYV)b98} zAmE+TD=!{(g)_z;K&x%lwMOf#?5Os^nZ3t+c7cLqbizV8wQ>wM?7_Oi9i0FJ8-FK@ zVL2+lvd=1vKp)XF-QZEC3sR&)92{WVj?ltq0Bp&Us&;8%aCYyR%dvK1*${M&;=o;r0Roauh3ZJhSyK)drk+5NoOE zoSO2D%)%M&;60!s%50!)AAO0Ww|OF{Sm$__zOWA$cm8y$v1U{%5}xDD-$zGznAtPz z6+xf5b-M z4i2#H{;**9$rn~0QhG#Y?+DW|kTz;u;z(((q79(?RVrmMDQc#J>g-Y9->f%2Ykyf* z!B4EVcfqMGex2HCFF`xP35L?0SIYd4!#BK#1wvn*s=s5asuae^C&Ym%y@^I=iDsoSbHR$p;V?+v}6Sj zGE+Dy!Zoi`5VhH~>Au)s@#Dt`sVt*&ckRPIBz1+}6z7CP&>!*c%yxN)yi`0cAF1GX zTQE2)y@yO;U;1Fbky?pX^Teb`&55-vew|+S>NM%Q`~D*&2RETU)hmn9DyNr@u<;vQ z;|ibiK8nKrGE?WB!*~3{$*2|w@kUm`7xeZUTQysp;_Xd5Q#~E;fWjU;?n>7Jh546l zC6;*pf_Hx{gr`=(tu>30o9J&FIH7ZtCPfw-_`@)4PUAJ0msa3>kRT$BcW-}Z)oRvi zzh0oR*xFv#2-OsSn-Gpm$ZW-Kli!BkSzgyDu`H`R&!UXa6dH>;$!OJZlHPB_Gfq6F z8uxO2jy~bwX)3#d0t&?7)M=?keV>2#(2tFq>F`MTx%wlsLS|Vh(P{N$4*B7hYjbY% zqpglrnk!GretwvpV0qZ*r*&vI82+@Sez~{=fiXJOSFq6X`iu1s>x*&cV9jv6UJHJh zZ3XE3cSeyq<4NZ6c#`?=ze|awu%jaFBiij#K12F)gCaS!j~iVGq6saEk> zaKMo}oy)2XPZE7_FpW&#KjI>I-XcY~SUby59*vokITv3tpOo$qdE5t?w!y)W}n~mpWP9c5c5Oi z^}*ZWAXEcZja3ll$pl>;+rh@0Zg0`g(U{?$JZOxlf&;PL$T%%22tln)FLSx&WKzBm zp(4zVGpmo~C({)`aw|dS@S1|IaXnY;O8(JgBV*x8e}qdE2|*Es7QJnoU?uw!q?-3W zRN+N1p}22;Timk07He|eq}8lS3Lq6mnWulD)Zz|C=f~cF}*U@GS}RsbAdf&-N|c--~k5&u(S}yW6?8Ec59Lu#v7- ztHHw?OR)u`S31$XAXf5wT~1JxCvxmSTc}8(tm#vG3J#WrLRo?`|@JS4JBdOuf^C?u1xlNxxGw9;uf%cd0P9KGBXFFOy z2Qi>CxnLpkaJYv$T>I~CggG4GKKjN@x~h&{w@y;I`Z%GejVm7YF3N?E+YYPlaNQnL zWbf7+kF_8ICGh6@o_0jv>BD^K13Qw`g2}l~W5XVk?Jpg>t6oV&tMSvzLmYC8(@SSZ z--!7|yGgvii7c4`pN&5?Nsn;JjAO)HE3eUq>?)mKx@>cpvH~H89@#Etc zcNC4Wxuj4hAMb|oOIv4L5g1#fq&V*2q`B5xZtNDHR_cO(i{OaobrT7n-~sQ@D>>>P zxE9QbDcP&v7R1?hvHD#0y1x3gwXN7}`?a@SLb6nbPmXE%?C=krg}WVee}B07(uyJ{ zc7C@)sY&sLHJU9+O{b~?un$T!~k^v*rDCd++*?(8EdUPtX0kOKTv z#a9ug8#g!3;`n6&$8{Axo9o|*xtBQO*H9ilx=qsCh73AY$sLRvNnu{1y%hQcEFs;CPwkllQDjhf`v?; z0!Enx#y!r%u9MAsCL`$t@(@nuh>GHdxr6xfaVP`2wXklfelZ9y9R}a~-BbmSaD5ky zz5YYjyH5igx$pdy~0Kq>1{-4U=U!eb=jrV_n(0|&$n~4;fCH|Qh|4SH8`irLgMbrP?75y()>z^3% z7v=iPHU6h7^-uh(p!JYx|MYJG(=cJVj_d#2IRm#bdw;B;lzvHIy(Eb##5X2A4CoXl z0!fia`B5`4L@vXKoz?jPK8Cgc;4lk5Y+0M7(Xf+|tUC~g)|w+KTVRf)%y4&gpbJ37 zj%(5WD5%ZkUgFX0lclucywFMIEypdp|D+Rg)cbPsIanmjm$ID#ojHD|2+r z%J>#r<@_r#%dNghJ3cKOl6NU{RQ`iNRtlPO&ntdO-D(9^;V$ZmKT{p zbjB(@1Vg|64Opv-o8RL1u(})Ajinl`CY80S%TDD#7-z>!9bH@a_wXIO2n}7Gff=0dtmhBzlR24OP`hA2a3MNY zdl2rme9A-%%})emD;VvbcX#~{uNF`g-l)c_9ah`3;)mO)*V` zeU!ZX)ZG1ebxw`p5%z;^iU_;|m&f?aORdq$kP4qmgWF55nkyWank;^|{g(Q|Gi-`} z&p;pHtR4O9I7J!{BvxO&$bqM9(LaElYKxoN*7Lp3*eY+L&f>!LKA(xzni}Owwy)nmH*C53S8PHO5WAO?auD) z#m0kQK&Cgj;h}slb{{WN61cPu4`E(sTQQZ4?=!bFNkR7s#`3ql+vrq2!=foW%H`EC zDdVkMfOf=zQ686RfV-y6l`WmtxuCr`gI_maZ1VM08E51N!@qo|0X;j8&UGzIa$NG_^2SEb@tGwdf1L!C<7IBK5ME{WGxB{WnL_m8sQCAk;lX z3MHLj$vR637<*v&!Kr37UFRz)gcXX{2cIISV9bj9rIu%L(QwI903e_y=lRnn%Kto* zGkIad6iR&`ZpuB9BKVt7M*BO^eN2=+DkBU^;}`lYl+V4W@BF?Fc9VYlkU~+opfvh~ zXuW~3y5-6Nb`22s?qc)s61(`twzvqB*1 z^gS7e_u8_K=Ym%LI&iaZz2~Fsx?=?w$J*R%{fsGGi%C545-Ds1WK^|e1&bixWfuOm z-Di3^gkoWw=oKT1?XXY4f8`9vkxf|%&}!^z*37TN(CJ~Uy@7Y7Jtn6nRbnY>nLHp} z^k6*{m4D0`%1?|ZHXvX^WJ(_g`x)$k;zGUMoa82?!^m($vAM|_A{Ud5S{!`h^E0-C z!Vs{=p1E2wj;36~ko(IEoGd>azza~>dlDPJg=c>#baZTAIJ?toEu)g_rk6N2ou%F$ zr_Xo;(fY}FiT@5-vbMaMF)X!U@yckxZftP1t5Io4=9Pm;YeIOr7Re!Dn|mgylhEyZ zCYH4o7O|EwKdjl+tGWB_c}(H!aUldl#@wS0!P-eO7W^f-|8 z>bxSBNGSJs$J?r(S5Mqlc;VBNobkl0g8EhBvrkT@-+U?gubO}DJptzNhuukw zW%Mwols1v!VpFlS#dq}h^y#HV?6`$JI~!B2mprY2>qA>&{l9vNr+q97TtZ2;bzSA? zP1lvILA5}po74<=7<&A&38y&?7+Q%V^NODQAoQgOm?ZcpsZkRQlJpjlnwW&#@ju2WtIDvJooj8%B-`xNJTg6PqAay&yLQ&d*9~ zc#bWp3)Q5d2Y}cr39M z1w0vWSral1fOLr~{3&J&Yw;b+q+WR>?``v0esvk4j<6AL`(aY0E9tn?#+qG7R>JF1 z>{D3R&hrs6p%Cwp$zGz=4qHuK(J{bo{o@GX&eQSPsk9S5WFDJ7PM7!QyeViv_SHxd zvr&kq)v~y*E1jJue#=bgAv$Wjo2DY>{`q4VYdMtxtNK>=T>; zdsTS*;qFgS5Ww_R)q%-;Y^{VZY)dgBx4n4w8At2nCmzLB7Oc8K{A*u6C&|#lC-XgJ z4!DuU(=;SRdbDtreug$KtxA)sYx5Ca@v)bbh2{vP`s>P9nSHaDr4^3suS1PCpE|lS zZ32L@q1J-d>uS%Q0l;g{rsC_SJC!rlL||oCfjPpb)k=NC&R>OeCEH$Sbhl6GxZ_44 zv3FNbHm}A`(MT~CP(Jp`ZOAM`Yqoos8qb05jmK5*+oDyiG1`!tck(rktnVhYj;z_+ z`f?6hSLfE|rvIIhc^z4&SO{8|cc8oZ1!*GPK5>_JA?r;_(g)AuttYX*i|$zT&7bo= zPzKPYD7L-X&`%*0eR6B&ItP3iIoa7rpa* zBsA_*Gfxz+85u4Oksf*eyTS+B_%~)Y-+wmgu9#*06KziJbO#e=qY2yZ7fFnKu&T%> zhxHCWX~>2{fDX_LBu!@z>aN^!w$P`w=sy} zgPa&l{t*LZjEp-AyIFCzPuht3nzWm@Foem=?W`8&>)gxXs(iZ>%U`tumeU$yQ-iQd;<-}zf~2O(XrN@L|%zXMq8xf*IP!_w_YZO9w~9~i#MGP=Q?^+th2 zJm732`5T@V_$As0FpTubmEG9L9{M3n{`aP1hX82%@ zM`8Aq$Q<$Rn)d=5a2`SMVH*gMwc6mrW7Eo1$9hMSB5p;M6$m@9^N(bNU|gqfoH99hnR!p6BMh2>ydT#HZrmy>PAdvI zST0YDxygf`;+9`q(gERj!wzYvES-P?l(Q}8k1O}V&8;=9UlVv$Zr0iO_3msMi@nf} zbAwk(gHJvR@GWN&KXn9OV1dg_loK2|uIvxIN*YN%kT6dG>+HNdKPh$0zR8mDoi*`X zN32PRHonV`7--@>^H^(;CaK|do;6VOX&LZ)jA(6)j~KgQ&T)fw&VJgjEEB#VF<`xDHG7dzX{|mwr)j0 z#B5{7PL6O#4Diq{7by{}ag!)^TJNx7pcA6Fr_}m(uV;^1}N{i^A&%oN*OXL6kAhu`M@>HF z&q}+QH-d6^+&PU`H?Am+qMwfF%5(*x>6t3l@6Q$+L+fF6SUnxRzwx8R0E(NkN;Oj+ zD62Z7uCJowt%QiBymRrjP4`H8tog!KT)JI+2+xt)yAcHj&e0&xzMrLkws5aH;@!4~ zw%$O`%kuaFB9-IrRtbJ7?#1>UM;#LEx>l0yc^-HLYHxlR@2hj|u-?;ua9ntAEpkb| zPFHKMaG3yZrgR!?r4L+TiO=iLD1FV?kaaY&U*+{ zc%iSi3eK{~2kOgV>lPy$>K3VK%w4y+texWgXj~1xu4$Vm&g|ma#2rTJ^WXYEH@<+@ zLX{K_?I-~?EgRHXh@?#$dF%ti*>xAK8`OE>gGdzhTm+ZqSAQo8K-F%Msq`QV1y1VPc z`+nc&d4I?8{WHh4_TKZ)UU9B$2}>R0s;%X^;opZ!|_p9@*B6Cr)qgpmDY%A9aEmvn8j+C0O+9H?UObN!#M zP*Bl@hoGVb{8Jv`Nn zk!KpvK<|^UZG4)pXspwGIhVO0IrUR`$2HAlfl?6WDOzOk1xvCNxwzJ(anE2QA?=Mt zKh&&4P{E>#d51%K6^SS>mU4E$e4~6V%c~QGHOrL%WA}fJXh)HKYLeJOecNWgO%J>B ziXsz9E@bgUn@h9OS&;I0CgZ0_u}-HICAZp`HFy(Sj~&qR5w_;(QC+VDUUGp?<(U6j zliD2#_gGi%ZzLP<-48b|K-^S|QtjvtM_un$x{pi`L1{TF0Ap}z2I|zI zf*{e9IK!Ngq@udhZf_ZuMgzvW78eIC=e>A;VWXMU0J5CR6&Q9Q>p?9FlBA8?Vym)n z5jo#GJWxj3L{#Y-oS3{HF*heJmeO`80-GDKT?nzXs|vU0sF)F2xSs5}78IK{Hf*M~ z@n9=ng^}tzvGxhAcz@t#lXb>#Fjc0VUNc6^{`1Vk!bRq+73^N{Eg) zjJ0K2{iL6@AL9r@VDLA^%!opjHY*^GnFNxy*q;d#P!I=7hKbEk)oN>I(OYCOGj<9> z`_)5vE29_l9sK)=2psd9ASI$=o7n9`a9+-ERmphcj#l!4Yf;aU&$;+Je}dhhE{qaa z?#y8_97FDUY7FQ8Xa{uR%jj6cbg#CLCADrsi?+3PuDzm|!cv_6SBL%$j1q1O=?FXe zX9}4r{jnGI>I?}!K`cv>+&~8Sni_*Of^#|hgax}Mg|X9a`TQS`<3VYs=>K1jE77;n z29gG5){tpH{WY)#*uzhfF?Pwn$jj~VnFvtz`nF&_;iZwAeZIDH$*Q3z5Te`s)oo_7 zQB_;r(QYe+sq+`PDC-o;5{;FT{un;y4%-WKxVuDPInBl1&_G$n5SH*^x1D?pvF4r! zN(H=biR;gV+2Yc%U8z0ww3@MO04%R#Ir}BTVVU;WE{H4vtIuY1IBq14Z2bmUf9HO7 zGv$8rsmX5A<@brk`-`Xx+=BWYW(x0D*596*zyn;~ea4(;{SquIaIlpA#ICf|RLeoh z$Y%{JSM@7W-FX)Mr%C!p;q`6Y=!#DNh<6L^>t%K)=k={QmeZ{0`=u?_gps|AX$$g0 z-h!1w4D|xQeRku1}(5(XWz=4;hej5U<+=Pj|8yQug>%Kks{pU`Ljj15)#R_W zzD_#XdP=u7!Vj6JKk#*;$R%0(@S9pt3zq~6jZmX7qJvJxgaNx&R#KqNXvwv^dkP;8 z8{zfrsI$h8Zi=xdO%7khctO@>4R34hiN28Y$vmNzvK7gA8K!dxLO}$#usp4y;<^Rv z;$3N=0HW=c;hjte;!SJq@~gV|z#06or+}E3kJkkdOIo3w>2CO8^3p1AXQ%AsyLX;( zLq!7A>N-n%N=L+Nhgs0(>-Ud03Bj1UD*CCGzYN9Iv2qZhlfVEA$56bZaK_pXzY9vI zJ{QUqZ{mQ+&oYp)E25CT=6l_mT7g$ z-oZcqhz}tv5iMp#bTF(w18DDx{8Lix)$woruhT3PS25RMh>gt2Yu>#m;*TJrxRs{c z%j9~-z{5g}R=Q%Y?4sE8!JXQ7-bf%JEc@6|8aKWW!SRtXZnurYU=4m_yemRyj~ zT*6+wp-erRt8KesFVnPU%n#bAYv_8Oz~*ZD_D1L%BwTvZE;)$YU(0za>$l6D>4R@l z6vtRUVHltOkK=GDwxm#wJ^@PY9kfSt5@(E%3fvG);7M%9b@a`m+4pXJ3Ji!oyYecj z-y?PNP;ya}aCN)c#U z7uk%EtPK$^&ywT^;8R54_?PbIv?oPRft-ut@Q=G<{H*Lr_5`5Egtl#9!mKH)5Dj74 zR0L{g>D(jPO1!pgBfpq;Yksi4zu7q6_klL+vi2-hiS9ojMEZ#=Bp8L?47ApmlL@!# zLQS@hCVUpUc1JG`09`<$zl*HDZBT5k*j7x-9Ac?4&#`w1nYU3Z7gU!Q{QxgITeOy$ z3XRBMv{L2~tC|J0$ltnLp2e>coBqmhy5dOkj%En8Ql_Q!)E*u3Jw*x zk5(|D9s$-+(4L@2QmgP--==k_RbK=>4p_JL^5J#$G{ zR*vG-BQlTZ)gxNVs`E%!+!pK7soug<@+FlQ4rC{$4JfT!BBT+|;PDzfGKf*IPcO8u zqo^`p8JQ4?DYvdm3(QiFcvIu3XUMsTgttDZ@GK-K^PFSmk+K*Jb%qhBa|TAwxlXjeOn~N~6F`|A#lAI;PTreq@ zT*<1MELN{rGgLK3>Hpznm(M3j)XN7o<6yhP8=+wE+b3^ku!)BQN36YFPI%8k@k|wZ%5_A|cDDo<`7o*A_zh2?-SKw8~!ws z!!U3Sd|FHY(ef#=ie%#lma(l1mbZOuFBVTLgNiF{H#ohr1L(~V_mu@Xy2lxRFoJH) z0E#)?m$N#_vI-Q>h!hjc`a&z$jdcdz`-wGCcRa)7hKZ?WP3!T*4#b;7K>7GEBd!@N z9+;nM{4_i>#1=8Ukvw3OCu7?nDLmF7BRIwlJDz5rdpW}{S?_$?rje-z0>Blf6*_a< z-wXr}%X+g(zoz6J?os0@pDvG@zqV>;NHGk?FT-43%9oF;6im=W*L!NqRlcm}=5)QGWON7Q{(mY>PTCu7hp zCb1o@SmTD3t26MboQrZz|F&SW{D;}IN)WXD^Ir#Hnz188%UqFFybJzF5TT5Jtij#L@Fq1k zo>?r0f-b1;2{JPXjUxu%^4RIFIE_D!NE^m7R&Mhp#mAE6gG3YHHv^LDU2QosafWO- z`!?sEO~jY3A&r&2v;~DnCI8D1saIswa3+`6z>d`@LD(uwa{ZDI>IRiyZ0askW_g(; z2c1WR(?B(I`>zwt9u#Z)Ls38k*M~8utUaUTN1(a(qM5S&%>j`M`Z%esNa3OBS>4|~ zel3&7Nt|(tew2&^JtNJc4c}!h3u?-NjgoD1u4<$P6lU#GrJ?4%X1?MfYcy5^hh zJvHF|rPHtU!~QkTb@N~JAP9wh=BXu-21X9P>>MafMqtqZq%0(m*#~OTuzSi2zz0C) zV~vZD8MFdYt#kJdEW@?c<&vVEpC=S1hE}NXx8k4Gp4Wuc9~!Z`oX4hHoT%H)XE*pj z&Wupulw~UisukCc#uXhbj+S?4Ou9sf;m~Q#@Zz$h!l?xi}WNJ zGI;-swRx^^R;R-uP#^Tf48b4X$KL#z)+}XndNJKt`Pc!)z+VlVlJpM}fo<5m`2IV5 z&oW@w_Q@5pl_w&aqp%_-ivzlgcb~f$FDOga8Q((Pl>cg?u=qYiXVb_yLQ zu`S{VD^+J4fI2>Hf=kX`^+W+hGvn{S>zzdZLU&~@U=PH2`FVihR%RHHjz0%fBeU`- zJxJ@iYOIko>?cV^;FRvSo_X-h97OF~NE0gzZCuPxY`+gdovRFgqH1g)vd=$I^uaCO zSx<1c6(~N-(gn0Le||>z{XU@`IJ$`3H9zY6x$ty!(P3KtS~q3h_VE|RqZD>plQn^_CG5pFpaK$A!)#8Lzr^|aY4-^? z0y6$`>?Ys3)j}_t7hILpfM>gMLY3X|O2HsFMxQO8?&u9qf<#)g9%A7|DzP?0te<$Gb^92zMAG=Jyhn6jE}85asua@6C2e~FBYMc_xMfbl{# za?t?2BQIlMnaZ@lwh^%U60Q8d&xXK2j(P;}FL)GmwG5;sz4B>2o$O5NVR~}y-TV$C zEtROWddN^cXy4@W7@<&ep~<$T@k~`P;r6F_oAw-r?L6bv%z$469KvZV0cN~*J6}}! zZm_9F9!7Q<9{>&_HZZEyO1W%Y-FSi4a^D*KniitOTfvZ9S|= zsEs?WrU?CJ-zsI%!^U6#JyE-t_q4&oKgh;@H-<~~e|n`7V1XH%dw~RRGt`63TZ11< zshQe@Wa7B#e^?0=F|8`qY!J*dGt(ZHvPRLmPtCt$+HCW+F)R!5GUdXSD%N~{ zSjlg*uz(QMlTs#lm2&JT_MXMe-o4JVrw>Aq2H{&(baPc0I(Yc?xemWWc@tS{UZ{&% z=)_Uv&fq6@|0gk|S^f7wS%%sy)^^^&x5|(FaWXI?p(>IXUa25Xs};D@c-PFzESi-n zzS(G3!5Y^9QzutM<;N6WQEiBw|B@ZS!Su_N`caH)4467c{u$Aer`p#Z1Jxs9MH;7# zSIG^}JvVLX)5-gIeWjV|BLQ0cw<$xKTaU@>-loO|EKG--^=E)os~edw&%N`0zd-d1 zo=x#fIh+ou{@ZcF6MroVv!utwm1wGm|E<{??T7MHse`3IoNs9co3pxT`} z{*ve6u49K9Ew$1O1Q6CY_MItV9l9JF?~gS4|GhLB4VeA`Ig)+7fi%m9jC3_dEQ--K zBg-8}^(&rT5u{5x784vX&HkBe@K8hNTUBlRYLnVYqR|AYTOOS*YU9G@ty`{6J-Y!j z#IT}|($wG;U;p`(j~7|##`^e{gYk-mXE#$pzXu>0xxD{;>;_f+S@L&<|A)oH3(N$- zimzYmIFYjPPd~;Amw)+)U=xezN-lW~r&Msc<@G;&1XXoer!3knisQjM_Q^0vu|M%x%;@Ca7z|np@EJgvD6fW=q!t^l;@qe-`M=68`d;4BXYaLZFnaW!3ElZ zYvPcg$q&+kdD zR(`rR?RFnObm$M6I~jlCg9+$7>X58C4HHU<=eRp&&d@9;&@&RWpBc#|$e+l`YCi$( z{TyuWz2`nZ0({Ziu3kPi5#Qr_3fIDtcN8q2#g-P|3cx3g!U|-H@3E$?v(H0(?H4wDOcj>+X;@q_T@Zce_fBrYu^oJGnxvmsGdrUN0 zK<#nH?lL;r!sHy?cZeP5#l<_f#DVmlJ18%W#asO2%iBvwfY3bciqHu8aBHCbA;zuH zH-+zAMeIMC^W9zfhC3(BXBA3Aobus}sfN^a-XV4JA@Iox!F>jU1G{zESpuqQYJ$FS z>Wj|#`Af&k#<+o_u0YhCTP7k~CRO~gOlHmnIb8~c%-S8(%N{(`B3%oQC$A9Twk?0d3`gw6?PQ@X1im`LRjH|Xb4ndx( z9tx8W5H*2+QKgp#;+Uu-164bC{9%p~DXZ)38ZX=`*i65`i$ z2|BM{OoSRJg%NG8l*=47760mc)Gux$cGGz&(e6;t;^moim2tU7*#Y_uwxm~vH=XNZ zh7O0bAg@#ry)dO)6%wCv3H>&3qd#Wt%4;sdM!pi=?1GzN|A&o#(L`t&_-p;tcU-+f z9c96NmqHC&6kM9Wq!9+(u0SIWzNX3~gE-D3!2BO-8~}Y#eg9t&a`$=!p~JZVJa2!+ z;4^kJE2bxO<xI^M3eHomqtb=@xvepW>~rQMRm0N&TBD*{lTC8Tdc)z3yH~qTwK(B+>aiy`v9)?pZx?TC=rPQ#$vEq z6LRL#h8@Q_jk=$s379p*GmjPnX7Yb5cs~LYRpb=E6dbsscC~BHJKtRGUD(G4FXg)@7NTuac@Q&iGGD!0T+W(v@4{ zhwCMyRKF^Pl$uYrKC$T?jH6sOJe))B$=Wm4^|C2tQEQX4FQ}Qh!17zix0J?fD+PD@JXq&LkqCVOpUgu~n*xszVaN^B5E2k?Z+M2tBLEvgFaG zekLKXxF5?BbtLVQ{3`AA%3k1lcCLB|tTfs}M=OL&9s=P5=I(SLl&l?BiJ}5qwckx* zz_iP@&+MOai*F6lFti8N!zXGof>_+3Cag9rC#G0pc_oQkg7=Q96`^3$i<2*Gs0N?N zAV?4N4i<0p`v-ZCkBWTKrQAfd>HvvS@0OlL{>;!Z3DzO6aFsH6Wy4MM1W@d~O!Jq# zyPi^EqnSVqL_0Rrhrvty9uFFSj!1p$yx?si&__R4>8oF&MtIRH@HA`0sih5nC!`Z> zZ~qVffw6>e03Wa{uvUX#6`=pSySiZaRiiTX{v=YMb>vrc?iSe-Pa(8gJ)we40MI-8dNJ?FB0@yR9FrHQ4 zhGfdqi6~)&GxF{mnCY0Ngg%}Zx;k|gucv*Kx>DWn(^nzTgJSTrlFD#i8v2boueHH> zzpT-jo@de%v$K@-btMf3Am;?+Y=gGhT>%22FTe*RSqEN2V!saj-2r>lg6)~!e66zb z5Kjo~@8@q(oq{^~kpE{CaF-8TY((Jij*@2ZmNEYIcQoguX)#o*Hy^j;lAb@e3ia<8 zR?d-bNyc5N*8->VQXsnq3M%EdJ=D8HR-^`N6;fAUl`Eot(-nm-eWH4XhJ!HVf6DYH z3cTYJX2zQ^tLzn?7nMaWC%C?xV0%jF{6z6f-!U4hK*ud!8;U|&bQ4K3kug?l%P;2^ z7B^c=F04N(HY3s?39)rVX>?~w*;?&5j@=N2hwzH|COFSPcD5v)1&*;K1A&056@j@X zQh)7=!p)G03u_R{p)lPas_o7B;SrDYVi=)(hRpN6!U+&d6NApUKP$Z9qD~TuY?+I- z;{}!*Z=?iUnAi!bunH$yQ>G7)B@qm`~^z?%pU0l#j8 z<4D6fYV}Uf2Fah?(2a^u#zNKf`$fBOd&J^*l)*g0i+yXS=+4he5PNa?&OJJv9Ek|i zlF{VOc0v#}Dd0KKlaX!rNA^n5Qy~9>8XSDCQ(VJNVNU=WJIZcjDRpZ2QvDp^*uVn* z7obq*8jS^ACw3gu6q^{JgCIa*oe zd8;r)z^`ga{Iyj>e`B0_oC89hg>!-$6ZPkBu+a?QbaLy@Y&e@ z!CoV#BC6K&02zVr&cqe&BbDTEew5KZ$;8uk7&CPAu}WNT!&PA46}Im@C2<67^TcJl z5+iA-SkZSKEFnz(!6Wd(zyT^>zPnt1mI}gslap`Zr3K?4SQKrE+ZMC`_XKsY(+z( zHy1p1M5|2-JZz2&Z~jA1Qm1omdNOd7TqY|}Iyzb9N&Kv^etJR9ASssiN+&UW z*ZIBF_oLaJsH*{f*ublIEv;y87us#ue}>RDZPYETJ_ zU0ACQqXqnxUPLGQX}7SW7xuhGD&p$>Ok|_-@)zkS++G$AOlzEeyQD!cdg05>TryYH z*#&7^y+kKAoI6^eEfM))q_ht0A$#b;Yc6b)x`zf|=0y1fu9yE(@Re;T>ab&}L>kYW zz4wcPN(BcfPueQTXBm$b(81EoAr6cLFfXB*Qyy5XYSQ#&L!>Ps4nQ&0~ z6aRpFVBOXB(eG{Pd1e)kyAn7b{T`fNniQ%XKtuY4II9_8`j!%h7_;IhDlH|$T#Ow2oaMB`nXF^ho6Mu9J7K^W4a^LaRjkgI z{=4CtWYKTpxMjyhnclQ!Y9~Ocy@vKdatn9HMv(K=yTV zft>ewxO}YdF@AN4AX8F3x(->l8u?OgVKspSeS^QI07xMCj0AqbK2|gr-oA*F#oh@_Yi=cj4JZpD^xJZ zNR-c1>2RdV=;srh9BQdE-T$3nM~!dhc#i*{p$7ee9eJ|A%o;Y2*{H*@%42r7VchDP zaj;bNr}uPbc5k~FSYs5zTggszE8M1tru_Pzpwiiv+W6vL3E^*uEnzf?yYD=Q^~v~;B*g9 zvnhg-y%l@$b*}@$@&j8u;#HQ2zg`emh>>+WO7rt|tQ2jW^~vS8d_e{soPHcw%V@Oh zZF(Ay5$i-4uxI7wQM#A*2f1(yZ?*>yZ90mF!Tb=;Sfd)n^f3Q zPtJ+3bZ0S8a26FUl|q|jaNu3)^tyY1#9ty-8Y3a+9IsuYm1mvg(h@!3Cp>7L?Uc{# zK?P3vMtrMyP+9fJ?eKV<v6K=AJ}$mu1C*g9c|1p z4HDJa%t1Xh{_MBiqljHtd?+l;-2swOJ0rkE0Jw8^7@I=urpAYmX^uyexdhRXC&T26 z5_(8 zxHY(0mB57M-~KMzR(bi(TrhR*V=6$~{{O$`ZO3-bGKNlzce*C$8Luuqfia+a%26QF zMOmMl=nPaY^yo1WYYGV;@G7%AL}B!uvE} zAcm>#>8@mBuG@n;CnL0v#PS_1QLUEYzOQA0K*o-^80zN1IJcX*P*oCyePos1owKxQvQODw?wjgst?9CW+s7P@2>{qXEHA|^axLrxA+D{krXD`of z#qeBU$XLUJ@r>?^0>;JYv|CzhURdty4%u-?;r{b8@s0P-q<&}0r{O)J1F7Fy$$+}b zj1~pG-@dHj!8bEhAxs0;&2k0hU+x|fe~Y?BTa;JratKugwTJ6YuvT1O5>Eo4t3y_v zDdbZ|U#=E0di!v2e1G(7gS&^YKA3lY0fvg^!7)rb)q}{u8Y!#U^l_oEPYI$<@Yfa$ z(vLTj;27qe>H#o#Az!b&@}o_(7Q*vEcs~f}Y8hTiIGi+-gpCxc(U@>xzJ-NLP@L)K z(rrrhIrHkr>`UT%@i$-DdaDkEOQicn0ARXjc2CmErsZro!UXlZj8CD3GF`?ASH%5V z4FP1AgB6FsCDv94@6k@L16OZW!4@o9jO(ip`8Ac)(-+bb;DdwL<>t(i-FK=|cmMP? z$#(HkVg2WvF8%*KyHxS+H6%AbP|VaoeGayw-%`}t!;8sD-b_Rm4I)596|n4n)yJ&Tyu zZw!okOXuvye%%oDJYh93k-a#zX=bb0nMTd_KoYMHb9WW}e7z2~=|D%T0Vd`F_9B58 zO*G3N=cZBZb6sN(CygVu>~RR}1rD>3k5<(VGj9B-*09$C3k8ta7v~}6TPR&skE)j< zio=V4Xj#KjgytqR;~{q5wb=7Z18PJpx8}6E7bSm=jVX_ zX30JFs(^{!F(1Y~-qf`;RYdKq__VQe3K+9e!;jE*!c=G<-9t z^-W~WG|}M89If1yXF_aL%54}G{nBib?{Km zmiak_$!-ukX*63?&dyy1Rw0&MxkaQ3YZ_hO{Z3<7r|`OJi}KJ>%&LN={C9+I56{3r zM{;)M$28u4PE7Sf!^`CL!(tJI>B7*ol4gt-9iz=?`UoD=k8E@nm9i;=s~rZ?kk012&2jVl@&bOCKd z;>rd3_Z6Q)Qw~{sp>e-k4UeySAONb6tmdH#_-MbB0>>-se#56<^VSoKn~h$I7^2~h zCf`)7oZnQ|6a<&c|Fums@Z0^@#3zCJ`!Dl@ULY5Oqizs)SXUhqrfk_EH|^$Zgr9?i z4g*6081@VmL{m_-4DLtcpWR~nKGyEw%Du*^m1~x{eIx9Hf%k-VMoS83cfZ^~T@=zvO z9Tf53-i!h(ARbyK?5`{FJCVNSJeCr$vwzmh!!k|zE;3eZUTi+eIhjB9a(H#>%;jwS zIoTXkyX}?nr+SmZZ-l=uG|H7IsnVXb07M<(C}^x8_GQv2)#1BitZT!i8jMv#`(^4S z8mlepK2AO6=6B>vs{|yL#m@Uxt!0w^AluXrq*>vx9}DuQ7?4`GfgFB-g=ahWO1w)U zfrvT>COnBA7&(~VF)$5$4=^bu_=jrivRX}9S2I>nMZ|Sub77~Gby>1eSjgB3pU-04 zXpiJ8N_M=;^7f1g!o}O1bt3*2SYblemzkT3e(^KOnBi13eVz&brnR-L$uc?@$H3-> zXW=uEY^oC!JxWle#+nlJ%5Y{Ou5IBw<_^=mX~}CQ#ZHEEWh7!1IceHWT{8boJnlY5 zZzZ}N)b8+>@Q^H_EitnZu|X>&U;SL7hMVQUkLRh${zRg{>q*p;69b|R&pod|!KHqv zn+T$iRh*p9#Dm*R=g;X%$=EF{SkvkZnSp``Zew{~^Q7Vzm`U|20TmE$Zv~&ZHQ@%D zF)lhRWgoL(1G<&22+N*=RIjSLu%ob|a(%3SeV;s>7^bi zm!zpOPNzFFbz;?Hv$OCw4C4+@>Kg2;$GhISx=?L1iNry(ILsCJIN_+GA{!j;sb-vwWO}DttS_vsLIlUX422yR$sju7z!6K5h2f7nwpT~e zW{2B60~nj7AhV$!3P6WkLOd<21Z(BUD7f{=9Lpk6^lE)5zw&&Ms<*e-%}isaTG;r( z7;Cxiforb;%Y<>8tL@{{K*2!uFp(u9{?;CJc)-;{53=F^Ra@JW{7(OdlE|7Wu5%|-6D?|+*wc>XqDIR4Xo5u`wO zltJyy9eXbMU2p7VI|^9;?KWl1f{M$Vx3l+k_r)o7hGH+#o?YS%?`u)}`FD5}Jnysb z%HbzE$)M^$+!#aNR4Clq3}B-e#6$v>tS-~y1LHxDxYC6!8@Tp-E3wP9jpE{N&g zlcDq$VLjMq`@?-J>4=V1x{TL=`clZT`2&N(lvl_G#im~nO?!;rHIfBP04fYvcMix4)Yd8^Qc@;DVP6DlA7g{U;C4sEUS%|y zN7M~TC@f!t4v5fL=dL0AC=Z740TbDu0*Qa2MyF_*#_=Q0H!!XWEeEcdP_UKVNn`9T zUyTel;!qE>3pkgt?!=!Sl2)pHed#y7@xa9mky==6KR{zC{ux!ZQ0I*+n`WsC!2S55 zY*(@h?s8}N5E{)^Yw*!Rxv0mzf6zl>irOCG`!_HYO;UGPQ}u~ywcu*W-0aTc3IJy< zB`ivJlFU0jFC$wLA0EnKhC-F^_MO}ifPIctRJ!W08}O+!)yg|1GgJ6-TT&!O|;pz#lfAf**t!M}kYtbF$)bB16Wp1V-H$0#qAl-caI4B`eV8uUg`j2)5ZHz?G^Lm^BOgB&d7k^(8WMFHidvNnN#gQ7N7u9?YR)3AyBiTP9%@uve)5S>6n}M z-OaL>AQfQcMqu>rQ}4>y%IY=nYZj7)!?U!-&;F1k(*jduRA#o>j8R;Yr}0WQb*Tv4d_Zo#10_1EgO&G{Ft!C1Dc>q4KtUuC(YO?Ws@ z9xb;BT_?-dcF;TNbwMhM56Bjl-n)Zzfu&r5IdVr=YE;IjDz){)OOYT z3||P?D@XsBDPY~Kx7wE|q(mxvg4z7ty}K#0Q3g_Br@;h_g!K-Tt()%@Y9M}3yu?OI z{?-^q*!~S08-QrCGJXX}#m53X0Ev^H3H)`z3O4{&A@6V^x0d-W-khFj;!=yAh=thr z&X32bvq@=ur0r4pDExDk4&ZGF4xy#9%37sZq24b3c`lNfp|`)A9Tv(En;JEs#F{_Q zUFlHvs7rtJOAIUZ#lD-J$a-t;nHTwyYH=4QJieI@%HJ;pT*yMd>8h~iuib?)5|Oov zJ%_)JfS~|*)-t;yq?fZ#VHv~BY8wYgww75Ekuwv5J>rPtsd>2UOF zlIc~EE6<-53-EU(=Iosk(%R_>g0O$S`G86woR*&Yf7thgIe#C%rrOi-py9k&SAGg( zfz(QXZ(K4dDs`}kgQa`0K;!SN55kq6b%L6T`lV&ql3mlqW#8`wUcHO?eqQt5m-$Id zxh{JKMtlDRC*kiwEnt!uX-hBJD2Lcd=+DHtqhet^AFN*+%7Nnf7t0E zXl8eFT8$r4K|NmqNA_UB4Q(;VjEYn%&5}m8E*A@2t6Ikt)N|pl)$^(1Bkz~abxC<% zK=Q!I7e-!Bp1(}`uUI)-Xz_cpw{UZaV@!zr&s8p#@5rR=8S+SMr`<&CEXlcEXIs|x zrT(aEjGeqhr%UnJH||>pJTn17s9pWL@Gdu_2tnD|;KJP9w!w@5n9tmEZdION&c$FX zq22hTyoqodaT?Z@>k&7y8rpsB>_XcFb}iS6D#r%fTsHs8m%7X*j$W0$P<)Xy-qff< zXS_F!r=rfuQOdRcW!NH1lwI(2{K>f-it{Enm$^#xoBcfc{aBu-S<5{Zp99@9`Sy#D z@RIrTj2`eH5PUGGNhE>wG~GkY`X!~v5kCv?w`;rx8;-{z*~niWL(HvuL5+XG`4AQf zh+gE=y=b8xFs4W9nZm+7=@1zSvf}q=AQtNU@`^ zvA$liQ@DRsp_ke~Sy?PMjx7F3Y1w>^7>b5%rdW5bgGxO{2A z%2hnv?d00jn%obc-?;bg)f(5s>CCd#NO@}d^Bt2yMV^96nf73)YH$Soe601Wyiz_z3KW@R=0iZ`W*)b-ThGIpP$ zVqz)bRV9DMZWbrgaa{Kn&d`jFWLB=W&ifp7-RHL;??If_S%Hn8{+fW;e1Xe*dxWG@ z*48r8jD#|^`4bxG^rc6gmE(8OsdzkGi46LbGe4MKMMhUY4C3sx1)7(SGqI*VlArKX zy7qIG=O=&j14|C>195Nml?4TBQXte;H+owlwSN6g2n?krZ7}vMo9e9k2~frUJ%aBhu@HcrSAz|Tb;ny?CsnZzp??C%t04h8 zj&He!WA~M^5xa<_RO^&TDT?gVMY#fM->&qMJ%5|_mQreE<^6NITrm4j#e#v0rGqEj zekQXoxo$O`&<-pmW-}*fqb5_1;tQ}*OMi-`^LcKgF=>U}|G1g|cpb4_S2d;+pI{}F z>_x;zH%s-|I$FkwcZMvuWa{CeNd~&hQNQ6ROyf@!kf{|p_{L<2Qj4O?z7D5G+-7MT z-RUa)K8sMpsY^}@M4DY;on6lydQR2vHonHzIWjnT%}o~bgU5u;6JNs8gl^B6J3= zfHZ&m)A!-pj`B&pff8k_$!|&>K-mo2CnJljz_uWgz5O7ZI(Rz!S62Sr@;`%Ir_?e; zCW&8&Ot|>NEXIgDmW=!BOrjCVVan{3JIlt*yp%-x;k>v098ka4a+`njmnO*CHC^S3 zv<>#pYvrvx7a=di(28oCXgJfB|jO!Nj!^#K+e3*)fkcoVGbHrI33(x? z$4>aZ2B{atAm)6S;3P_|GRQ^iOu|@X(%K?wKjxyz)w(6qIANDzLN1 zug4&JVk!+g%b2M&SI??Sx|W(f-#V{7uk?%i@SSfdAm9}=M=S8s7ShbcvHBuOI&54Y zWhv$rrtROn5q+?X{2Rek(2^et+kIEtXjdJk_!nKiXASRI{sPadoqrF3aU2*Hj9h

)d5S`E^u<1|~7*M^zn%t2&vuYD!dp%$}Hf39_VBNW1 znPjWL11pNb>st_WoRD5jxlBLMhD*WtoR) zvsz)1xQ8Z&Y=UFez+`r5sFj?J6;GyNb4$0?vv#+HMUDtar`;HweR#?f3HnIMskKSB!U#T^@pmH`y@ zoXr>uy|eP--E*W~V@I?nx`sQhebN|@>+@9rGf9HS?}>_eRaRe@puO{gk*I@}di3Kn zAXE&;K-J;lvg^bO^6sz)2^MG==(uBu(QseC{lA(Lxl+ z78%hz9(%B=-UHuaohn8N=`X&zwk~U7OOW z`Ix$hXo13tgjCte|3}(eN5%E)Z=-kpPjiLUE|#Lov_ zWr0J&iypQ)Tl`QI;v%iS-ELa~Gc@)Vfy@2NZ&6*%0h7CQyznFpihE{+-0(#?a{ATl zq-Rhj6R>uD`x954-pQKIN!jtx7m)2bv|2hQT(wNZv*NV+j8$-~{cd8fwtwB#!CLdI zRJmL*q*)_AXH2t3T0ZSReJ(6=3$@{N#gRAd$E1$n$ua2wm;ae@346| zLNJ)-bY#LG?G)!z4a+9W5lS56I)@jW!>N@*$uf8Kil!Dl?}s3p>ma(+dyz<&gnSq0zuBfyG;*KYBfrI)*Qq2~bpU`*lJg~hACTSL29@Ss1 ze1!4>;sD%!|gW7ZYxPaQD5hO4?fNjc08YFQXZ%U1R?ZR5Ltx>T+E zA~~HP(-i=x8A0;=;r%9wH^gB(O+D#X-&rX3k0T`-6079H43-P$ z-%%g&EllKM?(it=Y$LKSVrKtJz(Ba`&v(fC+!JY$>U}kCQ5B*`%LtQ1a=ZF$Gr-q1 z+5B_PGSx4h>+Pzi0~=mnuPC#d0T&moPJ%+Q^`)ad56yyp_LbW_|7vkyPeXyLf<2@8 z@>FVA3V>rLdmA|NPZDP|fGghqOu47QYIU8N1q_j0Q?T=anJDfYhKlWgm0lyN1u>SxKw&8if&-Je7HWA|ics0i;Ah03 z)S2!2f_P3aYJ;e$LN{4{EjQz!`9GpBp=W2ir~hRrUge<(jW_+^KN7n&Q+G|07htao z5;r?cwDc8r@+m_zNErMneo&BkQ1{gMSjKZ4iR;)CPHJo z&(G6$nJpi%hpZr0q(ftfFJ4MDQY(C9rrAgG8a83wDSEQomqz5uQNM>9ba!y<;h~4A zm0!jj8ZEg+)s61tJCLpKLeY`jK6i*s5!bgra;tuEg&~sKZO2bXsfY}jWd|(2NWPr0 z+HH^_q<}rEKiZN@+(}`6cgZsY)%86ipJxjoq7n0Gt`pgx?YYA!SL@?sga?yJ{E-&N z5g=kVK1L|LmF=r4svF#~!YkB|s=Riv_{@Ptv&h}^RMXMR`&LZJL=K)kE0EHa@m{k> zd14Rr2kM8j%%r2MrW4<({X_px_@G$t3?yZ0FFW3l?>7d6fa=6qKPu?+M+tB7ytDp_ z<5VN0z*FKhT_`1q_j&^@qs+?jO|Pfe1j*)-Lc;NmJ)Fd&3<)O2%nr`(vU>TwzdMTf zYN}=93B57y0T()n^H^b_%LCj+O=iqhbxqeg8N!Qqs;@@axhZt2W|?(0?<%h|qPqIO zV!%0dYmA{+fYN8<^aTTbOsHGhV_{t8Ft1hVS^?yoG2HQxXvO`u@Rxd$0tL;Anb9s| zhWVqAcmzN`%)%6P2!H~)|0rF-3+~8v&F8sMCar}}!~256*c5z^!1cJl`t0$)OVm>v z&nU0E-OX(rTe>l5%GAn#tq`N?HB=)<&#GQ3FAwPZa8Lt{L&JE*ILy4jXf)2!?^ai_ z6nQE|_M0(($hHU2ymfPH;b`DUtxDqzRg!7-QlCOw!w-f$7}-zF(g>~z;-&ncTtw22 zHDrAegfUJ=zK(18!T|uQXVvc|#(~SWjZaEsp#iM;gIy6kabN7K>FC}A)`lCZY^rJP zrT?GNMM?nJn4`B^KCz^i-GknQgR_!oEN+3+1X@~rzlw6Xp zkUNJIKaD3yG88+VWXvZpYQD)Fz+Z< zZILTIn0;oGjAqAs3?XAN{Ij(N_xF)4{f}If>9ya|kYUne6ZO!7^1`;L174-_k;5)c zGi}~5+d0h7oDVJGto zg4Q-gXKij<0HXjoK*qm~6yr9QJv@#SONP%{f_24muN!e(NG=Ad{dv&t-EZNM5A!)Q zl?6z3P2Ctls^!*vdZCWQsS5Q1O=0cSIP=CCBv4yR_6nxuz)mZp6wVqNq!X^iX)UNN zc*Mf6eiJvqFk&lS0p$xj1Mi+<(`cA2@hCv^ysrc=zt3?_BlO1$3->K3Ag{KDgDG&H z-q>a!1Ca&YwP&PKEw{eGoC=^43eKsPuw?^L0StOZ#?=z)ZCx-MY@J-nv+8NgmDWYs z&!sRExF)dx_Zxxgd3`9k>SOO@ER9lnlgW1w2TFFY{-p;aK6t8E3OWZ`9(-lW^{lxc zi%y?$ID6@4!At9-n3r_ZS!iQ&97rSR8k1ud|p1eSvz$;+=A}3_f@sfzG-3b ze}okkxTd*468W`P6mKNhn5C+zG4t4O4k5$HZTmUpWjNPqlH7&7eTp~K{ev(a zeM(CUDSh|t*JcJv~S0mZX4q^CEC(e}FewzUk+s4uY z(@`7DbQ$6wp?1WhT;F8-5>_609wWFaGDoRbS?#wkfGBoor!n%*iho=ARvndslp=Wj$cZC1{2 zTOsx9V&4+rVOHK&`og}!#ly4lU3_J#?fw?EPSKLZV@KB)g(4qvigg-W!(O~Ht7X~t z0aSq-S|q(91-tgiup9ZgD@lc(>iMu<7+4nDR8={r zAQ-&WnRPx!*tH5b-EgOVzqiwsiN>>y6|wJvk=>`Ut1o$YvQg}xQ=z)j*Z|MptljEk z%xft^d=wk)MDG>NZ0wY;M>pi*kds@ltF}YF*!Xv8{`)pLEZgRsZ@JAILA`(&OuVk8 z!T$3H*D?+tWdld1 z`QTBXM!u_miB7H+?mxsHn)<6xQGIt*2cJK+uNn-a*_Go(xb4p47s$Qar41lmYT#zzHt_I-X7g$G(ZQh_oWDVuZTrjC>JD+) z*9HF9S)DlD@T$r*8PTd+O<3{BC3OeCCCh_l@PRT*>#b7WdaKKx%W${C$pe-7nQbg< zn)^iUU0?R&M0x`H@VB0%k7I9A`?arRRI{t2llc#J4NBmI6yjS&)I4ym@$7?eW|Kp5 z>Klz15oVT8V+B`Fre9yBt(i6Gl{Vg|?eusO9{alt=!CAeHeRzmg^{_cRYj~)cC|^S zEYlme-#d#7#lOrqwd>EY8Ja2q;v6;a0Sb@&A_7fJBgcY^N~EE4%^}bd`7v=&Q5BCZ zrqUS4cd*hv_W)2ynGz7C#7R{>fn{VsBCtIuisGT9rD%{eg3IB2@Oza1*QdHQSz1DV zG_JQ5hXJJp&cc;C`dj71EK!1KRV=OooFel{CIX>juM>%HUy)zZkdSu4l~sC%xvShZ z_L4)8Y>j?jq|b(?>7iAb$U5bjIg*xOoYNA<9e5qI2Ey4O4)*dn{;3)4r8@nGMdzm> zZIsi^fcdu-hYBs@>y0{rGa3XS?u3Z<5UJTgjb!R7^+Y#)T`H4ju2wq84F?i$AoAf=Z}F0laJWt}mSOxk zlf6@C^|~8BWXfELmXPRub+p2x-k%1FwuVe`8WFU|?aZ<9ZM+uO|3#?n(T>bALu&U$ z%g4PlJ-CwQu<#IZ4M^ODajdA08FQ!%J5Jsvw7H7G0?z&{i=6buRYKTZ@x22`BF6BS zn5^R6mGZCHOJt4hiWLYSt)K|TRRcx7`t_;jL%Kan@ApSDjSR?pj%iH(^Vw{Hv8emR zZFyO-4v|Jg*lFP7o@q4&Y%PIxL@rRXmmVv?|z^EC2aOrR_vcg6|%ed?RgMLeBE#qAtilpc=4Q8BqDL~-rk{=6e%Uog;Fk2}$B#RI2q zUV(IREZjfQ-L#rHD-d_Iilt!Rtnt3ySvC>t$GejK0tMgM>NE)owQd|Pt$S5?H1!*N zAa>^37VSO9Y|ej!JK!x@j2py%i&DG7`Y^KrYF^R&XHg$Q-`1c%`Jyv}eepLY{%@U` z?<>3gdoF%2Ix~nWt^6kr+QVKenk&m2H;V^!eC`9M$7{!4PL5T;E*;Z6qo>@K#h|t# z?U;tkrUius#6$;nKV{)R7!e=&Cq?6oc%oR$#$8poqU78He?T)!BX(mJX&W>SFiI=P zwJ9V){`m(LGrszXnw8kAKJ#HILu(CKL(#wOl2YK+6*f%Son zuo`~q`lFH9NsQymux#2GK4H*Ed|!Yn_ZMHY>FQd%$l2WAbN-RRlH)XV(FQ%fRN7 znB#r|9r;;z`?-_0RQ`wN7H}MsGX$`?njm`Yy)h8hY4valjlg4-* zXiN9xpFerAn$8Y<4)8mLnMlA%(MWN&S>o!XG*#yj)>J#R6TN3N}?t?1FHv;L+~T=B(s+I+L$P!0w@Y9kkG4X?%vV(Nd`4+UFQr>$>ir$IG8 zf$Bz`Lcv2$cJ_t!^E```ASw`HLvqR4LEyURj8h0skulQiCq#SS)hzsDzxt4>b9 z=4xFo*PCVn6j=E2ASPFzr7HWN(sRG(;R;WMiS-uV{#IK&ih2Wl1Sp1NlNY%E%&yl- z#rQcDCTY7;pOFPqpYWWwe#OVFa*c1whfuB_(I!rgi59v!74{CmeU;q_lx``oiBtF| ziJ=>1CRf`dT8=4wvj`Vo^K7yx$`v(_i2mRLaKVPB3lVV$FJ9~?(3?nzw4INmlNIgj zFSFbyj6AAuJx)hSEaqsp8MN-9Eo+`*JWXi+X~&3mL3QX|AVRiz34aT|Pbcn^w%)uTEZQGE?vm^0vov-`v!pDrzhd}F1 z&3Z-}zEFW4!Zas6XlB@ZM)vBn67f^w<&S10oGjk}FOr7t5u4P;x2VZq)l9T;(sTyB zS&&EGeV#PlQ&xSOg8$)ZG;8Odiz|b4jNn$cDev= zStG{l0=BFroAe}DTBtY{53iDUyiGX?tosBr@~XM-IKk5WN4ybyf85fesApZ@J&^?> zP`%J#VB25|g3K0{1$dOsFl!M|pjO*0h}(@3Cw4ZF!7(!r7nQaUZDk9ymhD*1PLX9} z?(qo34wC2Zzak++>mfph$$PAd8&|FTphkd-$o37ent0G@Sj0hjcCRx1RzgUAHG0v- zoZ)Z_A2iBfGAnT#J^Ncp71Op~Csad+9hUVeJIiIhQ|(lqBDO4hxZO9#Ar!nJL<ngxh?rV7*QYDL^hV z$c8d8PMEuQd*kJD7hfg;q(u zG53u~d%0+Zq`<5`K{WtNH^UUJa^vKzD zXBY_ahf{7l=JYYUYBeJZj~Yd)MI?tfCs@2#$72tqhYkaK5D)5L53{} zg)WP*&tO@t{w^;R5|9JYWm=O$^#CR*_T!tYPq(ng1x1lvq5DDPM@fZ{g^qB!2T zLrr@|$+#yW9Ua}1o765y1U2I#67rfF_k{JG_NE9jU_JqR;|$IFHExc#k|=n($te0? zac_iIAPF^c0#`N3rGuO+2SG>4nbx&7VMbO&3RTVZ_k=Qc1_E`~WnZ?Dp$AbRFyYTO zco+=hSl**Qtw-ZMiNn zHPx#mbhBN5l6{nqMS5-|RJ*(l?bnMJ za}^q?vd1D*>#VIa7G!6S&&Yi$P`RjVcaQer@_kFFQ`PZ)j{5qa5Y+8%d))2_@AA(j zX^+VyQ6>1sxo|%OT~~MK19`{Ci@^}8uaC(1X|OS*4=^JZu7^)duD%~ zitdRw9{w3N2nr9D7fz;vR&8Dqq#`d0y2d@84x*Xtc<#e86(nkSH==hL2IWYtL7f#tdX5N_m z2TnP*yzF=#8_C>b{M}V%7taM*WAQQ&!Wo)^FZGsw*2?E9rAwUDsIb#Fek2 zOTgZ0`-U5Vhqz}~xq_lSSzvCZgWv4@<@#%`xxyvV>j?SO8ql-QqqW1LGS)e^!)5Oh zH@|5nBObEX;_W`S=!DU3p)@fzO%KLt^p=0qmlw>`woVmazsK%PFM168`so7|C-c@dYY3AMCEqdFjUI z`vOgt2l7?-8Ag~jqpGInckCB8oVcW&%mdcQNjFZWUb~i7ywLxboqjB?F9qC?2%OJ; zblKTyvgz?=U}r*HMABBALUL+K@@;VI@T#-U-_9$T4h3I0+2v#>PC^weYS*a>wN2ju zX!qZY0Be=0LGn{}46C9*hWv)Ynf-2HsCwBOXhGo?J79W2(ylr#mZd}DK0f@;qa;53 zYZqRpo&?xKXLfF@R_l)JvNo1w9SK$0^m=CS09AfqZiv{H(A${OKwqFvW*|wBv^qXq zKx$Rm{OZ`ys_Jj!O&(_we3_3i-g?xJko`80)PLXW83<=Xm=J#Fs^c5`Y?j8qXag9n zDhm%3*wW=0LWQ9J@RWI2ZVTf7+xd4Y(0BLn<%oogBE}%vp&(&*q)JEt!F$TU*Fo~N zMra9j8b|VlM=x$wg>f)6h%DkCJSfh>4O3Ue4{v&@xT2yTkYUo}QuMCw^V)y2b;6Ws zN0%{PM&7ho@XpNXS?AbFPO=Yj^>JnTozV~yhL35otXUfK=4~bEzpp8^>c(ENd-2_; zsBg#{gamK-fCnMiAXRz#a`94YRMBDEl^TMG9~T)bq$IeT$7gHl>^f$fd$W`JUfyZB zYs4%>%pHNwrv&T;IqsApwpLqKrhc#}=+F1#+a&38!*`XBwSOmb$P5yLcM+=p4ZNhs zuyvL>ua~1A`@Xoe&i~s*d!?}xYiznwX8dAr35B?Fjx+!A)Wg8PY5mVp^~pb;;! zvsf`{5I6_YqUs{scpb|ahpEgS@N09X4ExAaIbf)wZY^3cPl$^Mv{c?vki${s>LC zoo%5$oHKFR*{!XCi8OWJz5Fo%w`yo2ZnH5*L$i;;Tkb*dGtC=RE=~6g;cp=fDTKdz z&UjuW9%bTO*ZnvoWxhajuxC0^B6F1= z>Y~&u6Ec;tZb_T{Ikp9R-X+~Se#=r1j|xAC7)~&^UF^C5p-q1jwX2(YXDt@rW7F@L z>?D~uPUF;FUAXx^hOtW>fmhKks2oP@8JuZL_ed&#*L;)Y3->*BecR*t{c~d5VXuqk zML$nYWAA!K^7OO5Li@3hp1*Uon0iE-P1>#qO|l=<|8krEK6WUm^q&=uVl(q+Y&G=v za1kDgphz%`kULxAYtUm%CH7mQlsc@uG_s#@0W_C$Ix{QN3Mzg9zma&IzUgZ;v5|<6 zn{VDIN74%}a&p5oe?Znfz~-K4@cR7AV=*`H1fODtJ%aTBZX@$RZnT7L29U(jt{R5o z;bmTF8eU;sQ)n0nc}R$6bouNH3yU;*x_}^*h%lGe^(qlB(X%9NkX5Z6{CeicPqTWb zFQA7F9=naM%5~!n%QUF$Q2etMbELW!G6J0Bo58*a$barjGNS$HxoyPq0cc1y2r~OI zJthY9oRPbaRGjitJX{upQq5ppMGKNzG%Na$->8Wi6-~O!R_REsd|VG`aTH?r!O0ms z`T}EBB(9%uNf{2@3==e>gC|JkP5D`EwuyL8@dIsqOUdiI53pJX7O)oE+7swyDx7X) z8S^ian#7~rNMr`@=Sh6!y%vnTg0GSXngJ6Rt#;l*uepj$OCEq{d4%* zhfteFoA9R@c$DSh!MW+^`nu;RYTQMFu`h>g-nBGlV9C&p#gcyF48X$2oP|WX%FxPE zyJ_~BuBr)3z`b}Oh~J|RGz2)h#AHA%E77PABL0lvRz~FRPbeV8}lsvz63Jg3nh( z#2x-K`|KUn?GPojog>v?$l01pYQI*^fb%*qelV!uRd`g?3V7_t*tQbfaDGU$*Yxpyvfd*q}Sb z$afGATCwjM0tq>t3>kyZICM z*kPf8y^ZO&8n>LonM?}iiU<~joJiYVp@_+C*~f#2CcZnLXt=5X9kaI;D*(%WW8B0W zSINEe#?NqhC5P{|ePL;B=xGv>rJiSvS4%4ycaE6!CUc#gGAIDp8&R0kO|-|xYKwuYe86DQ!g7zrS>9sC)PnDSE!4plRf!LQpE@h3ct4~Ji%<)+t3L3 znQ7kG4zNOJx7YP-&Q`roMq^r87 zj<5*^8}J6w+NRug*TXA4LEt%ig3%mx`rCcQeYN!RChPa~wH*%YoQuNJ!V2dU_1CE> z@@FYw#tgpRzq0BZ>vzI{>`EPaQ2d2Ra`Q~hImOGamUQ1wQ- zibG@xIoIX4xOD*!(ad=7nqtvsMo^| z`=1YcGS6nJ4NM!x9t5rpr2z8;_gk+9V%va=9`L9FXb|*lRjWbOY2;$`~W{VmMCRykA;Rywv`*`E>JW=jEQBzowEMX7?m4leFfo z^uyH5H5eX5nRlg1G?P|~9nHd^~pEeswo4_Y)vWV)m0*0I3+tI%oOmFo&Y zykVaMqo_E|2uderZ@$RVu&t%Yz{|6(QGkmS={RGg>aQ!rM+4$4i{wk^gjq2cx~RC> zzEl-TIO=1L1Xv(}J(F!>fl5V~U{fkhjk&|2zgZJ3Lyc)d3l)>GuKxN()w*ZhK>p`b zfoL7vSz!itmj6h*7Q1CH<(8r_%XL`z?o(Zn3XVr)Z#t* z^7Rus0?{{IzZHcFp@;BCPqe0JZQutdS~79b zcvQziCEVtMK4Q6tE_Vl0C6=oGT#-TRGg#N05>})OKGkr@jNtflkLaa7C)vtoQ#ILF!|#l4(2lWffgCHl>R4`EJzQR2Mo?Hb`QY^8kJ3vOkw?aGPl zGninGSWDtLzMpiuKboGrxewxQ@TzYkr#`_tzrC>aa&)GjI0cLoK}{Bzeb`P{Ue)+* zG!h$M9(n}I%vnLLc#8Q=Ja%|`O>6>N_Emp3sUkV&v+e5b`5=-%0KZddKkVYl4egpO znF{FuntB>sc$XL7`;p7Dca_gJ35vw_N(U1%Du<{wa5jI6Jwo-pZo!w8`sUEEGq>g+CoL`A|DD!H$qZn^7~z96ZvPMi#}H9>>7DhlX>; zVyn$8=}JTs`6WCT`K3Aa>GkFFIDT1x@ztkwUIl>Nai3cOVb5{j&VDb8W;+A4oifp$ z{$!1?uDmoAqFy{PR080M0h>+XW+s0c+z=p;#M|Jr` zaY+@4MB?SZ5w7}>LPAOq1ulqn#pQnyPOR@Jn~IQG-xqCLG6t?w%;lhFhUI?Gjo?+n z^|W2i_*PfOQXJ(-9^N#?k;m_a0LrpRRUOT=P=nQQ)G9gHtAJ%rJx53nrQ?OzH&fy& zj2h{Cy*(hclpV#^L2}AAg|cZs{iTA*Cx|-m{|BD^cAE_Jy}kO!&0d)#k2zHM9!KBV za5G~aOO>>jC&6r@y8y;&NnlA}Hr)vkJs>XnS4BLiQ#j?&_Nv?D@PSGIC6NEuH|M67=I|)_h)}yQ=pWy!Lsz2?hSz zgOv<0=X66c;*z?M+$XlcRt#W12^(nsn?bLOY13nw)eUiieaU37Ho0A{WxH4_wJ9{Y>%)>=k`&U8^r^Q4d`|jFBV-^#yo|OuZSA}H%NCX~nZ8sThRc|?Dp%YP%{M_wkMY;mZ&I(X+ybE zS{TwhT81Dxnku%#Xu|7Od~272zGCK^FM%Zu`D1YSe;T5jg>Bw9^HCa&1tX;-FYj^0ws0%u@m28f5sFiVV_9RJ*o`U!IznE>p zWm6@%Fkjo9a{I&p-%BXTy&m-q1^c8@J(4}Pq-hC-AK`%m4fIdL4a<*OhP~MCkI;GF z;uTTo7>JJ3VV6p8F~z*{I3rKoY}EYxUa9ntvH?{qeXLnQ$;=#=l&;4kWUwl{m#U!~( zUX=3uLGY9H!agP4%$_7$8Y z>eY0SSlY(H9F!XKmbs}=2KRYT%7NE>71&Jw02~ThAtiro@iQ{7{@g z+xbmRax-FEQs6p^1zDsH)=`BrGO!`6AX-pqiJ}t#2xk%iEhJ{$Q%jf)+_xx29=2zRJ!?qD6q~gYGhiPdoR$>EwVucDH!!ph@!YFuSJaVJnyO~ z(IH2yze$YIB}MySL}&GlE~^vN^}^G0&wH|oE-e*Ab?i)j%$!AEB0fAYQ^Sj_10|=b zk}t@K#r%Mam(4O9qS?4%Nk0VlLJfk_RsEt)cKL$Z_Dn-kzU;p&dmNK(Ni)VYTs&iu`SGyacY?PYJ(vcl6v@3sK83XSA((?HpM1K39ph`S$b9IAPa5 zCJW9OF9X*{;ne!rtPj6<1C^lfGUF0O(r7Kim~ z!CNO4RMRv~<_HmZA}y-5h&l7pw(I+Sp<|6}$&OI`00Sj-wt%bEnZHX`uNjh<{)qn@ zEo%rgS-t*(N2=qtFJ#H21Qx2XMH`?*crED{U=SudaQ;RuL_^8^so$1%DR>w3z% zqaQxp7K_)3l}!+lnYVh_i&Ph@ki+M;Sn=rqS8I}ZX(EY=t2Ha5))AaLm#~HTCO$e# zpkXd>iV6jlg*8j;lCM)PgYi?|+vFVw_2i2!tR{ku6im1FC*!`F-$FvaBSu9p->jspj`P1QxQ2rAF}t~*GLhvDs(I}7ci;$$xX%4PDRX4insok>W_|n6eW`^> z6=TbXNsRmPHeKa#BPvSl@{INU}Hl|vtJAdAzOnZ#i5B=3;DWntC7AYQff@= zrv}SOO92NG{hfH>t5%$c&U?WQ?>w>~KFgd1NKTK)%$=r}U-Ii=-9%+0qSb?~E#iPF z;6>urROK>idi8ax83Nr>OS;bW82nBXUn|;nDGUFK*y zS_e6-o~3z^F7wK8J$bZB9f5W@`4{ude{NFfTdF)rG(T?p3e2Ks$^F?Te_^mK+v@q0 zLOo7pa>np*AuHml6tD8X{Hy(WZv9;ISFe6}_N)9))tmmQdN#AizW6o$AXjlss6bwpCVE<%EknT#I#T&0ixdk`4~vCA84tpE&oeaOrG$BwQ$ss&M}w1oGYf0v@vt%02mim%Os?G#Qw6y2t2L8+1BdqXdpm z6kh~#ykXX$`1I-5yDNAWQvmzB;ECF?O6mmzVAFyLbpfKp+YZLr9 zZf1Rn4?MqB^yb}g?%@~DgWkRT`mKAbt~e3;>6|o+X3e#cwtj@?IJX+>EG23Lc5rFxE+)=sGCJcLMj$-9@SgoT2W&x~R&L{zMqV7eZEoe|??~ZrO4luFCSha+Q)o7O zOs-CFVN{ZEYE(ta+93>)r%a0|>t#<`e%eky=1ntpwT0Fjx(5N5TG8pgF%!SJvv0lt zV^_(|(q4_SBWt8=U%=u@tgD4KmgJR4(`Qt-r;9%5LtmI_Mpt8^0Xsh#0`ox|X{CK( zk_BhxkavP>5^mFW;pMJDo|2E%>55Jg|5gX*Et9d&5r+Z#Q-9KWb)BdX;T*QAJc&DArhtvpqE4uG^1)f34z1R#Njs@fvNsPf+ev?&d<$RPY9z zsXS7Q>*=v%(H7|SlvXHeG+J0}uJ<<^3UaCoaVrw)tv5&-%FY7VKeaG>dNCW=mBs ziOhLSpop<%r^sv{)4je?o2wdQ6R5p$3aGmKNf>F^Z75Kg0j=BzOKmeD{^_d*;% zG!Q)CA>U+;3N_Ii+9%C`o2YRn<;-yCiV5Ex%pVa%Kz_Nfu!C{;@7z@v{Pq?9^T7GL zbncf@sWT08Z=9SwT{YQHd+DwBn&+>!Y+p%|I@x<-2N_kob`{oYoUVJ%O=!%m;ELOy zB?upA2W(ZH^$uxKEnLpEUNb)i1n(d_=O{Gxo$;o+Ms2)f4|KpyH=BU#<0ncRf3trV zGL}SA;R&`gavYUvIazDZ33vQPufK=@%jQvKp^E$b;D)|1`x&G^u&hF)$;PTho%ANO z7q`@-RJ!IcWuoUgcmOhskF#3lnFw`q)|iWjJSzSIqnwYHqfoqm6a}k{uxSwf%X7U6 z2>S&lU7O2xtKEu{VoJ1tRU93w5TS3G9m&bEG>!e|*DQ)c#VJmuI3Zu$buzBg*P0C% z?}*&>Eg`_exynf(Vu-V-TKOz5_!c~$;et{jNA(j0x#-uccMQLnIhe=J3j88z5Lks! zDjwX3Eq&MU)6{rN_%74-uBa2TwZG#2w(&F3s&9vqh3on>I9OnO&tZU9kbBefrdzWIAGTie3`!!}=L0&WPC zH#CHC{s~LpWIOrxyI`(TZ7_s@y9}E}3|~PFn}IfyDBJdIg&JWC;UaSEpnVd^{P2v7 z{6>U&>V6GDEs`Nr<^szi{qOVj>(v-f*oj_JiLBw-2ve2{HovdDuE!W)NY)@X-wg`~ zyaKTs;MZ~sV^jmtkKL$Ficn%X_F zHrV*oHGxfi)?n7lE*xW3lmcP~YCLYOHtQsf&hkW#qt5HV=Fg02L8TGD?g1HEzM2iTzd_{kd45?$UPjIq>|;I zP}j$7#f3wibTmfM&0T#PiNVEp_+BKDzwLYc)SJHEIqI}1M=zbPlIVHJZU`RZY-><}3FJZwtnY5*mp6hj_?m6*hd#ptllcTfb zrRwUh)8?b)D3kJA>$ zPihRKi!lKQ>%awrS!5HcqGak1Po245893Wlveey%{NY9zRp-^%H)*S>gT|0qnPB*e zvp^3T@RlcmQ1NoXE`!ijZ!b`eR{bbR;HTqH(xhpHmW3JVDJ;9Vnlot4>bGsGsflC& z&6aT+l)c8T=T}NZBHlu`D#$c-bwpyosOU-kuz4a8-I}BF#9ZTRGsmWjy}IGD)ITxe z!Lx04k&f%P&3nMCgHXb%%lP!SWxp5-+UdqZC0FT|Zuzq`ne3E@Al2)YqiztaA^$aw#e#S4R){mvV4uLHeTw+lN}2%*vC>J_72 zz;2iFuEIJ(6fFW%#Wfk83~5fIXtbIl967OGGu-n_KE%d*z6fPf8_vm=k}U(ZhjxFZ zf#LTU{FodRy%b=k=+Na%Y!IrQgBDUGRovFMu|1^G9NHR)-K{tt5|w=rLhH7?hF!AT zRN-IL;{VpXsXSYzcCyoz?=#e|0L?&A*00fwjj1eE@RZBYe4*o-#0_~~!BSCsLBG-f zSHm)|&%}kKi-~VxcoOZnAT^YvY?}C5o8S-La+LtUqat z7~dnZnO)OfrUWC8V}{0Uim%nSop>61XdNXzNV0cYMv-3Kd7&aiXT>4B$a&Q;qD+wL z^v`FnK$qG8u^tOmImtonfX|10)S-gG)$;FB-l?p?4+ni5I3d2PFIH$vw z{-9au{~?zWo*v{zEkjpEm0YV5K7&N#C9c&;#aCe6Ug1hTL0>RxaxHCv_mtcdt1O|6^*VFml z^ZVX&)?MqayVm_<(^Y%#+Erb{)PA1s>YfPH!EE8vg8!ez6(^~)NVg_Kx7JA?PmQt zO+A%`^vK*$kvNKyBnx$FtXG(TfW%4TjEULW&s|;pLyH&Q(_*)WZq29TO~3So=eyV7 zW*JxB?i64nYv20G_z>_V0{8FQ7--4Nsqa~~4Ka^+j6=S+h%2wK)Pp$w?S6Q4WE+<=`%F6WugZIO;H_vTtcUK<-I$gQC zvfurAmYxgxLPFAg;RGyE(=*sLf{m1Vt~UuAO-guX{lho_vV*w0NU| zNm`$#mNE)qDQ|pVKrhf(FjItx2{ixxR(eCfG4!!g*`sKd$uDODnu@V;Xr4d~KW^#y z(S6L|VAxrbsIApj(!JVqF@JYoX@0YF=bV%jipzaNN7VjqVRe*T#`f?@o~@5Zf3~cr z*=^{G?b2*vsk~9;?e}R}J}2{RTw5T>H$)nYwT@#fAsd``>iPr+hy!S&~7AI);W&#iN6?{0lo5t3PO zI@ozbQOgX`H6H)X@!;d#&2YzJ;>^tDDO~AWuDP!onh|=aI@q!|?uqQR-Z|>?amTf; z@C)fzAFne$=<;|!&GJ951nYto8b~uHku+i7Kor(pbEZy0Q%BL>$zjj9^M1DRCAMn_ zWM3?GbUk1aeRGX&rk(ASo^YeNaGf3`zEvbOYy(COo6`Y9v5$R735y~M8NiFh5!*f* zRA~mDDEr9HU-PdcC<+HbwlJ8pw5`M4otpfAW~YCX+L}#Kfcrmlh#;!1khhD{uKS6& z(If%SHPp?24Qt!IaQoThxnK?uTlc8G`Zt;veuJ$ZBN~*ZfiPUbrQN@F?9NBI;|Oc zt05QVlvAaY_PCOuw8KfIXMxC{Lg?Vw-`uTYy23flZyz z)tn-pu~QY~-B`z-bBwLdzuELWg?A`#$@aZVex2cX>Zh+5kQ7H|rVGq;!qRy7(tWHY zO=fbv;r)x%c1OAKJ#MCH!`B0Y^G{CRGiY>xG%Au^+Zs;-&BjZb%7=SiP3!-_1pSnm z-nkZ1(K~aygsKqb(?@3r7E*J#CXeS;ZOzLO!+p?=1mBaKtXuNcxkrFW zeKX1U*pGf&_-iL*ey`F>fQx6Yc*urQn)n0{&)ORY!f*db+nCspeqM)%hGM0?&2_}X z%T}C!K3Ni)TUqZ$IWXl%Uq5fm)HC^Zbt3i1KH~DA(T4Of^qhg)*~B{y!)-AVdHP0? zXE%29^X!Wv@s-K3O`1n$WOa-K-gO(z{V-IYK7B!|%X3CA)dp1Fm#X%SgR}3|Z4?}Q ziPh%JZ31tLVd&NHtSOosx|MC%EStIu+wMs%@^p`zn`{NHrqIGQhn?x?Jo3h034dOi zWu-A+$I}b!R-_%Pv8$ea7}O=I2;(rPcGs+Q%cRc7DI*jb`mh+!n6 z{?IJB*C=p`OT=tc<{9D6vf9N&=hIB>saF2Hni4s&wPEey+M6>GTW{JV=n3g0g@HLG zdswYOufLQKU$`D_wd_i9pMdU)gfCYp15JJcuIfcOWCn3<6V?uaJSw(t7D>d%!>*#f zd^8jD{|#nmb9JLzR6BRpWB-~$09E;Yr^%%<^Pa3kUljh?-A2+zKwY$=N~a6H6gk$p zWV>s4)a6ZsnvUe+bGk5885O2+CF(_tp0do*)OD^zeVdHuZI_(oUn$cRzOIk!3Vpz*7E+Q4}L3H*~Fgu)Cnk8B4lpIDPqo1-5FG%(aO!?J!efamE{P z;7VUCrmvxGwTALB1H`?W2Sc@RYiR z(|CR?BXE~r#uWc$)Qpii^TJu$@Hiys?v0Ct+|*gm{R2fWAHUQC#U5Smj@wKH%@yDH zH9yxhKO8#?M@trsRP_TG6hPm4hyngv)PAkP-n;7-)yetgmJr_VKybZJNu;8A!MUxz zv^@w+;zq{Gy_ATnlF_HeXw1PcOy1PdgPVQb$1lqx?*6_<2bmU>CqnV>`+#?x3Bg%M zPpg}EL{-n9ij}BnsQh_?DAEdwlleepbec`+H{V=dA^9ga#0uU%7mDH9f`)l}~j4}V}@TScW0V0bUeJj@8QH-HVh~7!~TAHr3xvSjQ&@a3| z7TREIN7vVX_{0jb^9@He=i$vJvQz%IIq^wK3{|Adu}h2RA!3Ql!=5Ud@5743oGJ=} zPkH0aNH+;*&alKutdOeW@S0FF8ZsER&UntuJ|6b|_MSRi&UOj4>$RN_pZu=MX_xk5 zTCTH>()POGp|hCuv)vodPO2v104))5HdcC@pI~#Xf}szOd~a|4*r!E4MZC#65u*wz zLXmVtdg?K7e7*!{X}7A8C7QZ^kQK)VANbbfTG)Wi7uA_8^*VX<&6(o1QxRHy zr1R0~VTd~R4#gUAtmUua82Vv{7f|;=%1U!ik|N%;M<+3k$u-rdT-znlX)0qi#il6! z&?k>BIyq(;?20ohE_+FR_E>u8pBMk$B3h+j zCd1U*bLY5oPm4KANkxvbog*DwAx=fgp|FqCIH{y=b%5ec!K!YdjXEk4)oK z3PgoYqtC35o06%L3LFPUe&}!~-#(GdBjx*aN-q^$ED~BlPCz5AXo9Wn!>LIS9}@pCO|KEnVfHKh>s@2^Q(uqKA}4 zkutcc5;+|+h7khKaBm~J-!+m@o2gic-CA;5V5w}IsS(k~FG~wmzOSsH)WCZ#)O{?6 zSx$aP^J^j1C*tOSsPINTEZ&`?E3>aZ&3qxOQmXb?&9&qUT?_64gsPdhbah(1;k!Hj za0k}KrJ&p=Lqz#qh)5S7Aud?!!bCAslO=CWIc80j8==t(z9hjf^WiGsoJaXQs+s5u zySkpaxoe^1|FMu7QuEtz`OWPoFYT^IX43CRGUklU{uBI*1U4>lk@J&V2RCha3oh`R z-5zMup-(qW@LX!h)C=NFH>?fL9fiFlqs1u5G^ODKS(qW`vMM6(K6&? z5|?-L7^)vm>O%tQh*h@5%?VZOR5zb2dlo!d%(!VXy+Ky?N4i{mg}7YqhxcYr1q+Ex89&B+Ot2W|>rswNI({}qqeCm7p|BIj zj|1PSbwjEMvA`BVNT(@WH{)6_8?!J%Ma6gbAlDC!gUqur*FFZ^Nd@7B^sL`yhmQ~G z%EfCx>06mvFAfTEH(Clu@N}E?#xa~d_eQLdb|#yJt4j@}nANKp*m^;`BhKdHRPb4MBfZT8&dO~?JpPkbDYyDi-?*b! zN=_1otzjD;95b0VR6N@D*6h@W%-Nfg{svBl(?u#)78n&Q(^fIy2ANWjWCFBN;PdgxTB#BQ?_-&^03)W06uEv|9Y12Zqtpe3G}oING2tyPzA z+-!dMcrG_l8TQls-p+a9P?!HH_)%`b9!y80(pcgKS=8~q3Evv$?B&zsGrqeU#dFPZ zJ7>4b?tV;P{*#w3amb)Wv6+aGHEa`avn0!<*s7&P&3c$g;g2aE7C#UlLr^LDaG8eI zhkWc(9bgT4e9{aOMe7}AV4@T(`*DI1U>%WO^=5NDblczhtZ z>HhR63HP4!4!U>cmSIi2R$8uQ#fqX;R5Zs-;*3K*n3vgpYnyR+(dp`01Y(Sjf1l-g znjcM6Df{nc!Pm~%FS2Oeg|b?I=k-%(g?U(6%~qL(O?Ibxk8&vFNz02`LSkG~73xSLH^dDHmV`gzvDMbr6&SGhOWbf?vA{#UYn>bdrhaCFAaH2)C zqFsOadjE(ODUz=)PHCUgv6%zy*X&8jrbj7-6t|I~?D+8LUXm(>$(H37P7dcT^CWy& z7f*a8Z#Hppld6UrjO+t^Wh~ZW+JIHxZh|cyg&l7thTc%~gCRMjEwqdN)j+ulai&RA zp+kFad^zQSMxcCAs8MgI-`Nue8{8L(**`5pG^R4NRdvBSwaMMxdQ9ErGR1~G1?+OZ zaTvI20xC;MhV}6W8jega6SI}Kvq5|${VqZGxCQCeC1g^Kg?omlg)S)CW&sPb8yb%5 zJfAPk3EjHczH|%IevR#`Pz|MAD-rTc>v~R%;IeX8JD#>MAI>&#bpJdc1qm410_GjOn-z z|0ld&jy`kLXMYpM&gK{C<*$>h1}fc}1bp_<^pw*OLG8!i~ib4471IO|CPp+wO}oY^9bw>g3ev%%f(=hsw~j)ZRb zp*f}QG@7pgn(imFo4N}B>a&1pXS}kE#>*Xzb8=-bS9bgO#ANaE0F`PXY8A!B^*1tx zFv_E4c<$0L4ei=w3DLO=L^V>?SLz02HgiODF5@!cQrVX6>CI4mU}I{mS4L4zyEE^^ z1UpoldNXljxIB>Gw>@~LRzlYLv>U76OKTK9^CBkVcm84SzJJ0w0q;)Z7X$KuU&ZRu z5{yRj9PIi<=>ZzP9s;VLN6L$jse`)oInl0jWk-M2)ff_tmPaPOfV1TSU$T$zX!;NF z8nb4iq(*V^|Cgx^l1~3&O9Rift8(cO9XG?Ux7(4ClKOY~z?Oyt#z=V%YA98_v(~7% zW*1+4-{qLIAuk?Q%#ucOXBHxQHN#L6_uyLPyAZtMw-#2v6q~f3Ny6GAgQE~!*Z_;D z|7SSx9VV78YSS>7k!QH6>$v)ROXL|#uGx&@zqmv1xv68wVLhvLWRR;QWm>x1uR ztZyZEj!;$;!xFIVBUo3B(|NdRJMRAMgFkdV!O-bfXJRNAPBk!NowVRn=*q%@PgFC* zG-l<>B`(|)hXbUp`5(!&Xj`AA(Z!dUiwX?OtKDdr&%(2CdMhGwOQ4K>$Rk{&^hYw~ ze->g;77wlM0-{{QTQk_;{Lt1CqEc8yZdbm7b`>*Wm>!~Asaz)~SX6)pW9M2y@$Wx9 z5w4ah6L~mF(xhT$2ZUSRSg3`>FY39PwR7!C+_|GP*Slsjm+ zhsI(Wu0H{9oz{Kl+X!Q&JaM{vGP?V8FP=_o?_|1Te^UfEBszg4jeJ<5SA4~7=78@6 z%76$3!h9DGM!M~0#G7k*hkbg@Yg|QC=T?WTdmw7fb?{Bx&^(dOpjKe8X{SNrK&plz zey!A>F+!k!r8_Qc->RWI&;pw#o@ro;LKTEz-u(qQgQR2M>Z!- z^)>7MyYfO|yH7MLkfnGtvtcD}%pFg2Z}X!Tv} zwplhJLOAXd(j0U~Q*{cMug%X<=fkI4YUSX8n6vWT)HqS%?5KeqQ<+GzW3CcR zM?6Bxp3S(u6Jf=edta<) zz^HsC{72r1>uoagT2cIl&f<&vP1Rx*=2H2A#pxpE0(OQ*J*(#s;P1Ar;H(p;8X0VY z^#-z2nkkbP9H(1W^W9)FG>$y8KJ z0{c_+Ki=ejj8bDrcQ(&GksW(uuwKZYPkJ2R4x>p0bfKQ>I0$Hh8t6YMpE5 zpQc*RnM%-A+*g=3Fj7h1sKhEXT(pKj4Au~>c;=LwS~i)r&XBJ$`3ny^^k<)Gbm$P1{Z{+V<`>1HTE;o)1q5dw z3E`C8+bKWl?Y|!CtXIy?auiU9b=q)m-FKo@3py=iV76Zly?&n*fR^u_cCKALUtAc4 zPI`@R*gxxd-K2Eq-XyEu7eu@SxreU&dst(H)NICp(p?NF2KB+WN-S!nFk-~Z-d0EKI@(p(8_ z?4;ZyN56p zen%y7dXmHZV}pav7U$%CPexpp3x={(o@2_T-sgume>e0$tJuF@gZ{gz_2u7ph7h&Q z80C}H*eoeeh)#-0NR1z?eV@+y-W%Fs%2J@o!e=#habNvW#>DdTnrva!Mzi5s>o0G& zCGnot_*HI`A2{E&=;Q0Iu;o!U)rY(w>oC&vwvDoc%H67SGiHKrV7N6=vzFI}x z1z7t(0DKXdzTd^d?$$>{6wez8e_3W26~ z0u?<2(z@nhRM?&7I9El#von=a@3Y>9#;G2?otdQc^3PVHBo>Vq)eE3f zRPl3Pd>(AgSbK&V2KHiJi_5Pzzqw@-an1W)!=~OZTO$~A?sd)lRBbRd10dAdkhJ1t z*bEo(TrGjx{G?^dn*+pa@P2NM?8{3l|F8!sgT6A4M>F<04h_WslddI@k$=jY@s8%Q z*m1j#`+e!K7}LwIAKJq*5HV*6MVYLZTeaCqpKfiwUr_Se_7fMUjZzX$YuX&0uveBy zIu6s-a0VUlba7P*r=HL2R2UpJr5>&-=$kE;_p<6f845i7BT;*~g>2s_430$bIX_z#Vuuho16 z8WRBu5}ftCll!HSYQdCZiVf zp*Du1VaHsm=o_=-Mk4m#brk*=pjQu?frMO7b4l6mF`BnI(h`%5zy3<$Ui?96$@z^VI%7g# z#rBshYWH*Qpi_|(v|EveMkTj#22^L!k%KGB)QbZWh({yM5LxHyt0#A~Qo*C9TW``H z$vD25yj;<7UZbD4>5o4s1}BG57HTzz@3%SW-V1x>*E=_E_pQr~IFr{{lEnH<@=*(ABbaGQ))WEouhJ5#id;)B4se=Ubtb>po@)56p!ye zjS+oyPZr?rPOMG0NptrCP- znI^+|6`xmU(5_W za%NeMNGdyDRsINp58DQx!pCB>bT_{THxb0z&w zKR*0f;{Qjgjb^AzWRHeGC^1i5bXS9j9;E)`Wz}v6he7dKGKnhEiX!^2JTwUZ?(#L$ zh0wawR)J(P32w7cXQp`@L~HPE$j2J%U$UfS702-;lPI0pN+Sz~fsvzb_}VCSD?D87 zFoH$N4t;l(Rw4ePWI*3lpCuvl#C!g2UnWT`{ zWI3(IBix1sF5ovkhL`WUzA@$TKM*fuUqXwLY|#g8DiW{7%krPDCT604NiwJptqDGS zmE!*Eb+01#rzVQ@h^H450ZxZGqp}LBWOR+#^3$Q67VNKy*)_pJPOpy(zJ@nhd^LXo zz0f_mT5doo%Ha$Ukau>wFg;ZZslP*U%hAy2{1jm_xyazUQDETGO(Z?ZB>t&qqmgB? z18gL56!nN{fJk38Q{Pw^mR`6^u&e1we7>a}=;W!LLyS9_&i-td=BFl|OK8n6_Y(89 zIgQyQhbl5~+TA0c17}HQ|L+}fe9yJ;w}P20(**ZihhjG!5vr>6(ovZ^`v%jO9BMJH zeDtnpQj|7ccQ9`*S-w95_#1ki7AJAkRClOn;Tcrhp&$f+X;7gMiJ;v z%StzlRk-X2a6dl#n|n+X$qW1bXK~CZ)#P z*7o$7#iF0we2tT%k@KG<7SfDA<(3pTV%ue^X_2;xuASAdeN>-X;?fyqis)|m-on{l z@;+o&q(7sDb0zhm&1$k`d*ksU0csJdtw^f1p}eRi>t0~t*a+kaT_D3;0L#AzkP&o& zd=U=h3vKY)1&}j5#?kAWcYp*0q>^F4>;Ra7{IRbBB%mxH%S@ry69WmT0WgXDle$W> zLG~%T{&Q(S3wA)24FoF!R6rl7KzadU_5&6Spg}oc$@wQO{Y{pc|KuWP7|0$3INty& z5YWEbx`zo!PhG7pw|}YTQ*Aar@wI<9B=Jp~y+duMwIrk`X-CKW^s2o@HQYh+H5W=b zwlHBx?()6nC;X_t=5v=i^4pMgezCgI6?*KQCn5ZQ=k6L{X0?HnQ3p;Y1Tbp?GYg!y2Qcxez&s5Bvyl&&u>mtM zBl{A-6chk63uNehz|0Gn>H)P7kfnjoVjfWC0jeNiqR0M8=jH!9hXYk~psQLy1&kmb zaI^+OPXkpMzzT#r2dsZF1^`fYfzOO^k#F~+qvW{xbf=;D??oS^3V*ayn*ZYo-UANn zPs^3wH-@UJ&>y2xx!+LjdziH&wR-JdyQZY<*=nlvB5_$NiU@V;kmkt$$=@pTG9iMy z(0uRQwPX{&VoM`PziweSF_sH`tM@+3rmJYGcsh)$v=x(g6h>8^Uo(j+D5xNt4WT8L z4OW`8;GCd9)J(1x>DkQQMCDDdh(7OC(w2rD?nIOi4b~_Dg*~6I zs#%Qd?@tZbg@MF>F6!t8*X{;yK`wp{t@m*w$@>{c3o+e<)ktKbzaka&p@q(5$+8v7 zSP^MoS&T6gE5|t&t)3ExUBYbzn8Ji zWFon7bZVXwGP7K_HPnE=`h)qAm1y3QPcC5+iDg*EZ>fu|`j?vCiQ8!CwE?p31LY5D zlTsvbmlS)~;De`qW$RL&tyx|jPoli_8@xFj=0PkllLJY;nJjBo`O-$cS$tjj##p{4 z`|>#6+**&Us8v#f7U#Lzc(B<9mFRDWshABq;a(Kl=8YJMFoguHld-IMB2t!Ki3g9L z(iE|)bvFp1yH=SLUpA{G<>(8{lH)hiDYUxXleZccR5t|jT(;G?ZZ-`>tk;j9t46U( zaK+S~YaQEQ5;x>AG?0t$c)tEh@CBr?{dM^rk!*+i9TtkYDiNK4Z&wtOZ+0+z$#(w~ zSDgXdu-VUTqH}9=j^^eCiyaEfm({zECfv@;nA7Zth~qW_IgrGlP<_NT?`3_WbK()rAEJK!snU6WEV*;;WHa@`HWq_(-e*EBn= zCy7qMLrd1_=`6iJX-d_$AMWsj9qPnd+ew|)G|(@|3;m2H^a)bVElaNM!++N6MD+1K zyuw(5uq;~>I{T*{d-Ek}o!=DHaXT3uviuUM%njIYhwHWXyA!G(Z9-aqpWZ&igb5uG zAFXS7v0UCT=`RmWW`>*-*Rl)rp%JJ?wqUr&HZf-M_k?K)W3XQmCT_ZYLuehPN5~+s zs!X)nnWn~wx3Tf#BO^MQGV5UBc50@h#CfgVatkHbMpgta>k@|_ZnGcmNEQgFN;unX zmX6mJZ=Djb&BF!X1P^31p0xVp*TqO2al5S1FU7igyZSW2L)EC6(sT>|e6joL7I0C1 zYY@WrSs&eA{VU<5UDdY4!SEHsHL_Z3&D=fWmvGDG{jB)*xgN8CFVXo$*5?E5fXURf zANxBvEjL8bIIVW#ZLY^Yo55vqPve7waK)*J2Hb1yk&XDdu~t5Np&M|z;>(A+xwptyX@Y5`|lmE zCjjWU!>o*Y!m9PrbE&Axuvm_?2I;#jMF9$Rp8wIK;Zu?7&(FlOg@!a`*&rz_F4juq z6|sUp!92-%`#}}kJmJK-o4VwjR{3P5p*^N@2TaXcK_|Ixj`Pt{xsVbQNqC46JhrIf zN;ls7aEjyZBVqic)4gr^MOtBscr4qmle#;S8HfON`MD^%j@IIAPY_ zA8T#oFWGv9_%C}+&$!=(EcaWm5r(Wu>dY!>W~z*ZS`On%KJqlPKo>%Vm{3=0F#kxW zyVVe^a_iyFTl)Eh1w5K7P1|BS`p!+I){Y!)BM%_d>STM0J18H z5QMd=50=Wc?Oc!vQpd&&(ApFr&Y!?N`;pd>h^O;pwOD|>2ZS7umkmPJ&jEn~atQ<< z+D5KV9Ywe2%LN(KNJ+cyF+HpbEIPq&ck>w(xrKp(-t7|?-!cUztQL#?0csDSCR{(Facamb0#-{%8r zihpo`tuGR$&ktxJ5u6ek6z~UyJgjT%=z-;9M4NFAsaL3Zl=h!%^`U@bh0QK zZHHSOkMO1!-1;AwkO0600OCynh=U3!{zW@e``XsajsHPAS*r6zt_6tpzevX!0CWhz zZ65%M&H&y(0PalxPox9c`u~J_YWkL1%~1B57MzJ2HC@aYTW+@jFbN$o!oz} zuBZW_?f(Ia`%(b(I%%%7PM=e2ad}9$F8d2>)Zy=yw@1$LSc+7>N9bi#G)KqFB_Wv<<|Rb`6Nz z`GbXp1Ia+Q(W(YJR|(qiRid9$Ve#AVXd3J^E;vwe8)p~j{b18YpZgYrqOEJR2H&K$ z;v$cNwO4ejl}nCqSBob1UhqM1(&q^M=HjDM6nm`b>L=0anW(_ckq9Mw7_Pmxl=Y;r zbJ#(ry4h@lQOQ=tyE19(ht=ES!PU?L(XDW z{b!>0S_S)$u+M!6;hgf-u7v^rCn*6NLXoZXV=4D(sx7+*y>*}ayz`=LqB+Ht3rG5+ zsqo#)nIKOr)Hd8lQ&MsXRv?;N_J{P2F=Z8M4cEVt8m<+#s9lUo937gH8hDr;V;U>u z8qBm)3Q{iA`NwG;D=jr?=Kp}U$M>p_%>1m=6u{Ny2(}`pe$y1^ceBN&gbVC)vpMWi z%#ma4EkS?SckDmu&bfipBP;PZ-NSCZf}K4p^vEwkAN}+oRogwu6;&AC5o`~vm%&Y~ zsCKIjkZZ3YrXV?uYyDrdrXhN3{!%0=cbr+`(;Qi>vQ!(&67f`fAJvd&>fF_p$3jU( z^i-}h?<_tDs+fLYswb2Yd#uV)(A3zq+RMgM6P#Wc=V|JEqSyZWK7PoyIeOuEUDz6y z#ou2P4lVFq1Wo85QO0&=igM9rVp*yo7if?$4BeS(F8;tPHqHQkDsuME|5#fwt zs}q)g$uG|F(~H?-xuo29X&3O8AmG<^*iki$0UG<@CSSW0q00 zNK%A$CL2C>a^0h3=Nx~y7bibf!YSI8QEPe_S~uU#DrJBU8wGX{O*Y%i-_&2ZQD#O6 zb84c{3nolv7`!2sydDfXQy5QbmU%{mm#NiBwF>}vJv-%}t2Z8sGxl9Xm}SIh>g12p zk?P0V%I-TsXU))h=9|Fstb6Nssw5Jb=48HWI_2Tq)7^90iJ3uFp=qD2qltkmu>vp5>Eyn3iZ9&o;S1ifi$qI<- zM7p4p44j?nn-5X>(F-(qNq-@3X-jUT#JzRfeB1Q}bnn7u0cE8pNr(T84kmrK>fjnh zUN|5u3isI%xVx6xV_tO5RaOZnGffkxJk=t0<4j~0OxD(_>TcZXTJR1`PSKEC7;Ue~ zx6eH*aGhgaY0Ef!w`QRBr zx(~N<{SS5hl62()%Oue{JCmR*G;;54D@9w&?;6X269ftP`QBU+qKWG0^sNbwMQ=B! zT~%MN%{(Z$e*nJ;?XPgfI52E>WjA*zyF|!c(6XZ6|NRkVB#(qBO^N@q#kA^!8Y_|I zO2J#z*B&pj+Quj~*z+~H$h2Q_$IqcgvP8x$eE2Bgxjo0@v_vb3csYZ8KzCuWNS>=u z!8oI42@mUf-cRWyK@8n&7mq)=a&U-0Ax)6}RV||3~RCX!zpqXA5LyD#SOh zHJRJGh?X_tcVdT*8rx{o#T?_LD?csXspF2O&E%XYDno)VQQ2xJddfZZN7&ounW4fZ z47)9{?%$>y24Wy+f-bbTcevUk)NhT%R_j>63NXR9`VZGnZ|#$jVP8dDnxd01KKc%G zDfr6P$EzI(dH0Vjd6lPyOI9bJpJ72ZyR;f`vI-khW*9S>oF=1YPrks4wR62Uf-c-^ zn`YszdBs=n5~Rcvk*APL`Tl4ZF9_hR_uH`?Af-jRz_W7=LPHU$)Au(K(NdB)2TF&F z*)fDVFO`%EO$#V;X{_241WqyI9qCqW&Pp#DH7O1W-dm(2|Nf~+x=sxCpcP*bDJ(qi z4mKP>FQvEv9UkN7m=ve=x$M1+l5D-@61(u_WZz5SXbjeGS=*KJq_(4?6I8n|)WXP3 z9s$qZ@rq(|@zjpR9FSVQdiM z`QD|7TrA?ZUGViEHa;xTQZq}p!M9@#GxRn`i@#G9_n1(V(@hP;IApzxE!My5WuTEd zw`tAiKTrO8>5}bqPUtuJO5z6|-;Xe_k0ng|D%Vnuq76@7^iL}GPf#7n;j&uISxqEt z-B?@Gg+26z$d1IFdB<}c`zXcA^HYYkG@(EBJ9dkI!#im%ET^ZjP^O3u$5fh@J)tik zvguZeIXNpbQ^+VqV<>FBs1@GQX(x7jmYKR8liA?9hLg4LttPGoU|UGMmB6AmL-yXh zq{T=ldx~o?1(lM%;z7uYa~FXg28WrE0?FIUV56w`KA-q0YzBeqOH63#R~!?5?wA#B zlCGWC@x#X-(@#twhZ8l*ZA97RM-ud7n-Ne|qZYaT^1OG*&o)fFo z%bH>z?c%R#;kuC$Y<8G{<=L=D-PqFSqyC^C=n@z~T|qd+#^Zl{$qc$}QKH`1{@QNP zF`k#kulg2e-mExY$!fK3&T*jP={#76Jt&O+6w#d}Jz1=|{`GPUP460?yrsjOE8H~R zS$Xsg|0pelA(!|42$u|EK|%hfKf>#~c16w#o@?!K&4MLW0Fvm+6s>JaXv(dK{ZD!% z>(x4f8mjv$d!-sUeCxd(Hj*_em=~*&6ZX*Os3jh78-UnfHl47#&GPnQCAv2FgRRN|1L)#Q16STP+u3km_K!gpFb-gVg zy=}iALjG?N!SJ^j@t>kwUETfP=N6tC20vr_^zU{Xj~U5#!C4=4Xu>@M7|FoD@(5oG&s! z_8`ED48-u5kJQct+4ui%N}vr?_5Wcf^8olS1=N4#Bs zME_oz{YzE=Zs1(_FWtBR#@7f0>xP=l$IlU7raEccTg{H$wk7f)VaD^QvJZq-)fYf`_#TzD;j0 zeZBbtef0!<^TTYl>Dp=VCVnIA^IcpqETGe_jd3)NFRh_(o?LnYu3k@;9FGc zDZ*x7gDbg2ri}Nq)T(=d;x&8q_1}FmFPoZv?Pvb`XeMW)6-da{emiq3Gveb~*0(l+F3-W_d&ikF=UF zja`nOKJKyqDKm7K217|=(+ZMXj1sgz_Erh>Ze3eNI_5Rj~afT^xSnAHsoVGF`pflJrtSDG^FV7_zm zB-!hSUij$Z3-y<5`LW{omzA%W@h5o{Jbw7bsz<&UZXr~r zth7=u75QX6LyMtUbX`;Tf}j@%sxRfK@FK{(yjob=$&E99YgNMlGi=+jWI-s?oWg!1 zuoNkR^F=gCT~_myO_CDveCV>v#BNqXEgN#ntfVa`3_2yDtCti{Y+>nckyp`@6=+@W z9v8mjQ)M_frASlv}?Nai$1n@Q)wt$!IHVmGP=t%uMc&qE2x{c^8sO- zZqX^on6gH!Uw}!=ggJ+iDD z`$FACk)nO_OLEmyVEM(b zmVkoO_(TSh{bjRHWp#T@1@5b! zmZ1B+XD>GmYbbd=C5-hr2sULI`6X4%FVw}`*_a!ttjRkc%uSrC&3xmrrLh_n&x<7AH2!qyNyykn=;~ZJ;A`q$ygzlM4GWg~fMCZ-khUwTsHwzr z`5}+K(sKggw63dhmm8oNWC$12!`y9GsJe39uy|vHyq4s*`6XBI_@=SA1&1muxP%X+ zIwf`PY^$nS=8qEu5B}_7X=M4mMzvJAm7|Q;;MDxSEjrYtKnzP)SIB3#!$|6gyzubt zL__SUFhBS-?IFokCfr6;QBC=f|tXWc^>UaG^aecqB%wI=^7vF+Hi!}F?p2v%-kU{D8zRW(oGBE@x;_cEfx2wLh@l`E9%qX}6Fy$MZ^8O>QuYz3iJX3JS zZVe5|8TjMnZIUEgGiijr-1{#HuO7Of#5j4ihhkp1jQwog1G5*K{<4WM8 zYp*?1j?1Yupf~qK+k5?{wL`I$?Qh7QAFjls0^u|ZDrknEkgzw6ygBB~V~wDH7_ogs zZDnt|HE}#fzc!AW?PnfAOD1sKDQRi*)`fK7nba09Bp2&t9ZlL2m1&v;@AEWwRhS!T zV)23qv8622IMI!Wwe0DgY;njEa`8&Ymk3;9@s4fWLxjoTK@s%~vcNz>KeQB8>owE+ zhw+qdVog`FDnyiYY z;eK6l%qgNzUBvp=1gf61ML~A?dT#fLY%xVT%5uO!P_~uk(5XYbboy+6SjD^>5qsyN zC5PdDjKZ%eK7LOX1`MZ0bxXSqfLAi$$4-e(N2Zr3*7WZW2kL!wMFrJarw2wY6hstagVCYWgZPf^FR${Cfvz6pL}N)!M$ zK*+ywo%%E7i$tI5S*xEAZ+$#?I@&!)waD1quFlN4%!9e_*l_`xAnJjS#U5cQi}zj( z;dw&pt*N|sJ$o2W&i7#0DIw^0o|ANSI9hW;D~pIPgHD7`Hh;JyI|>&>uf4;jw6zax zV*Y8bm290=W!5p!cyjqwJU%s%-=uu=WZ!WRXENR)jQz;OC7?|!29QJuAYUd$k2K1l zNtTS$44!K@+$>X{DhuylBGITa1cvdmhltf4w8Q~GNLeHw*g&J~h>fKi=mi0Z2f7-#jyFbJKBUK`)y(s;YvZdY8dvY-2&z*z0HqTx2F z`JJdpB>*3Ls@13K-L`*aDQs5RHoSMD!f_!xWkt_^cDZeZ%~(L_1SHd|+@nX?wAO(- zT~vjXf*+zRH@TUI*&6%fw$PHN1WujXR6pNiC%E}7=Y@11E(KUH_v$#o$HxLu9&8!B zrbOh|p*oCtA9tN1SChL+si4xNLl=w>gT!44t3#K_W(xfwzI$ssx{LtxhRKyQi2v1~={3hWa{ z>=_F{SJA<7`~r_wBxO`*6^w^rU=$jF3-#0Hmug02Mi{H#TYd=Xg&X)m$8# zg1f~qIV)2@)og}9UJD3+mZ32hpm~5uemK2E;$#)u)6EO6aXYzW&5?Nqd8dpQ^lQu* zZ6m9k7t2DOI3yh}&v`ssk*~`IXvt5tPwu{dt21Z4a()ab1|#w?HeVd^cyvbB(&jY z&U`77B-;U&__sGkV|1G8T(Ugh&P2})-1}42D;i~v&QfvwN6``zFr2S!w+;^iXL=k& z$lYX=o4m4vz@`#pp1&}A?uJ<9Ju#X+$*?}65Rx&} zGq5a;^YIoK#4(+iRW@Kyae=C*7;5=}tY#i!JYud9@;G(U%S8(Q@ilwrDuSST{wWa; zfe!bNBRiE!k@1VZeHHv5?8)+9GupNmnN!@)>0#rgTB}Fc0;4FUT{7s>Wc{qtwJ!3@ z%d)EMpypgoZx4j(*AE^hdt;@)+{Lyk;^47T=!79AwO8X4(?6Y}0KW9fhXg58We#rv z#AEWEx982|6Q^qIvDfdG5_=iYrGqI;$K(@8rrhTgCE5-_{6Ml6B+9b+CZ_?j;0#sP)fn%@AtAL%9;l}>gPo9yQw>M=98F$(~_BGSIZ<^ai@UW@U2`^-dZ zwdS+mI?x|(0hkU9;T+SQCpZtjXLyK16wO?BU{Kd`%k&QC%cay2#YYs{H&$!>zcso$J0q(HFFJI6lG zy6fiIWQ|Uw-l$C;w|#-;k1_EHB&SH}d(_;^lwG903Gw*pW$m4Fc3tXn8WrMdda*$zGSa+w7a2pvN39&5ZdFZD*Pj_A$-~eU2P~pU=QO$TH zrc5vg2y{dUF9~$eNvmn#cS|&Tblj`GZc#mD9_T;lIIY2Dk-0zr1(-OntSoME-}N=# zbZ@6Ddc5pR0Wov;x%XuxMe1qC1%Ho5Aw1k@_9}cNFX9ZJ2S80A_fB2fv(58x8c3q{ zGyK7jNJo5Rvk~RSs~Q1$s1W4-X@0GJqR5kxkMm&={bBKusCMw6qBnrllE(WB_s8Qo zKRSGg_}k$F-uBM&{2k_bMUf>ngY0n5uAf#>01@bVV{n6kr@Cixg+mL(jnQ(Uw-AH{ zDvMvkQE}oPuvXt@nrLu+{=IV7JD@TpUyhX(uD<-!YGp)4cjUk=N%tDp%hQQ9W|~;0 zkyt9QqPn$ruWIn?9-pInm>$C+{X=rG{AkHdZku)PH{XN3u&-~1q)nlhy5Cz^dB+-W zk(rRD?uA+Dt-Q(YNjaJIBSv=PZklMfryyaxTF|?u7k9&AWs{E}f09 zZ-nen!+Y<({je1yZy-PCH_FBY*M5A`9M?EPrD#QUE%zMF*lcD`d9zJJY&pV=y?YtN zL9RAs=B|>yGnD%3mh6wAz2**tH&M zO;{ss7h#8vj#7|aMuRAA0>9-`E2#VQ@dmZa@UZV{tK1Hn6WA zcAL{iv)|f6c^u;iU$_y`CQ!yy_2Zq);kuid%>JMe3GW~(SuH7g(VfI9OsL@9aP`;W z&!xeGI+BwQ41iQG;RG_{Q)F{SnW=30YBHeQ4>9Li0|DA*CC{8UyDGxg2r~wB>sF+m z5ZzW16$eOCoAU?5a$ysdp7e-TMLRrHzhlha?>@y2s3eXDy23(qI30Q?qHpj^d^oQ< zFs??jGjn7q7y>$0dfu`n<$bzo4Eu}}(6v$^#@4G?{b}w5!-DHmNbV}j4UZ4`db}sP4Z|fgqxA%DkRqb3sdJR!Gs7n@;3oq%2KZ~tp6{s51Zp6^ zj><5J^+-L|LMJ**N%)ab`qjj9=n9Vu-|NKFQbV?o0=83Qg@VxcBS!7|3Wq9G5y)HU ztjt6tg*^)hQ{Rl%27mAR@XrTv`k585*&0TThz@+O2vQ?>jy()pE0TS{D``JQ#NZ)B zuk3M=)~<(4#@DYyE<0^xx_J9n<@VLSJ>^VAV%DhSi&35cy9hhCDD($SY$nR{_JS$p zI@#RH1M+7(#U5JFWC%K9sLE+;@Sj>j`D$ujA06!kiow^E5TBG0KvnVx^fsPsxs~ZI zpAj$x?o(&#YEx8(t*K9hkIu~!wz)ZGI=G45zLb%Bx_6O1Tp?<3+L#=f9*_P4^PL!o zR)c{(`D!RP{LXhr&&LCBvwZ?!@;g*$y?BGD|p+rg5$Io;iEJ|hVcIWx=Zb6y!kN2#7FY{@-Df@4nt-3u3+hvoc_<~HcJ&kZe0D)B zuR}FeS!Z--Z=b^GzA;$bXn&0cU#5aH_@1Y1tuK2>^VH!awqNtKPO{x6Q)Q{4KvGD1 zT~2NI=M75Ut^p&cgFc?G-wGaTa9BS%ZxW?(&mdc*rLI%wm^Z-dsljIfHcK*51x}S~6|;a4%2b{> zMYSakH1rta+oNh)jmy8m8&`Y|NuUV1>#CBINWgmfxE$+KeWmv6qmJ^oW@Dr%H#wWP zrzz5VoSHu;&3(y(W>l2R=HBG$U=j&81l0xi@)xCLU zw)|+|9Kx>hg=(uk)$nWu%GTN!t{cp5k`d(0R-Wy_S$2k)Y@GBMIbySkcf%Yy>+88Y z``UYB*u;wKTX*Q`?&FrlSz^Q{T*TQ9aG&doY$NJ^9uns9Z+kb6U<+hn&&)Zjm^i*Q zuh7%8obA^w&$-rT6>yWbw&|ASB3`+FZv&lE`u>>X^JBGD4%%f@E36kHE^foFQ6v_7aX9er%ud!ScJ;nOGjh5yx^apL(Krn~D*Ito~fj z^3C<6+#Cfl6SS7DAtt&I#vv!E>Pb!^W!r40vgrOQSL@Qe@IB=Lu)ed^HH*M#;$}Jt-sQP9LmF z-3!Hn=dA>w_Z4GYx{dB39|S-UnCZO_!tIXbJ)K#=fPkvXO=o#MQouN}&29reXQV^D(87hfkPqgx$(L zk7E%YhfJ@Bk9SvH)vZ84+KOU|-I%z{o%1dhY=t#aZRKa(>$WB43UUiap?HoAN@_Ba zCYv=(IT6BBd-Gjx@}i>XrIZ_p_Qqz6HZ#`RQ@Wu#~W|Y4)8L@|&pVa&(vDC|x$u)uy_` zAH8AhJ@?^X&yO-8%^2SFHQrxvwY)KZ<1($P-XT3=cLMbmxYjG7Il!%x8>**m#8R-U z!^ybB+2DraSD2en#hJ`QXJ>*;wn1MT5sQq*ZJ+?eoN4~k2A^ft;qRgSZ7ohgk1n{| z?+z^IJ6hflPF9_9MTE{4Z1VeGc%I&zu2>2qwW_z5#ra3;AhDp_92N&8O}(vlcFhv_ zvyW~2XMipcm?Bp?KUyqVP+2P;iFrXu)U&8D_5GFz4VB_K_@;Yf#R%ZjoUeC^!_c5x zREKV;N`-oof|2oT4>m1zV`{XslLez0-lz|~L8ccFQj5nk1JZTvo9nTZ+)0ix=5CJa zsOL6`6O3#Y*l>AuBKy|9GvNuTF$LKzRQ37|Ex-wZ*V!w9Yf#7Hk0m5PkjT(JQKlP^q~ z<`N#IuI)M)pFt{h&M4yocsMq+Ad1Vv#-L--HOI21wSdwtS45}j_B~r(Xtz%sO`lpB zeUWxrrd0J>bQp%vSF#?uq^(sHcON2T5lixPy7*ER98292H9=Ew?W(20I5Z#7oA=OH zVSSg0G%^~y2)wY;ysqHK#?H$u>y3?!!EU#D+Y@W8Sow4QM!i2~Ok^^q_B4Icp|J$F zaWV?8;JAWnB%!Bnn~CT6UE0^%_pUN$SgLIT>e=O)GX}a~S+T1IL&c1b=h@m^`hCZW z`GehF;J6$$7T=>9a?|cNH{m#CGaeKWJI}kJ_lei%_!|XtkLly!W!bXY)kluxuM{4^ z*ESuD%tf0bR@-Qxrh7XBOUoihkNKkumBylJRg7XUN4t4b=gcod-c+Rfv1da!a%4bG(+LNaL)|3c0Q{zx^XG(9xr8n#xb! z1-oDOEtBHUC;UjkdPLZ6)%^7=ZxgZm<+_JLVa-qINwHd@x^^UEdM*ICcr zG-dz7xc))Y-1#A8{J~ECOFQNL-5WJls!xA)zE$-^n(-7Q?TfEf9?Ug!d(6T%M%A59 z?rPSyp%u7Qf)f=a%fvOfXm~^j(y<<-wOd%%7~Zt<%~LoUDeuN2Imy{ND(8=!g1q-wVKtRSaTMy_2^<2+wadEasT%`X-$UNr4NqVyy02}6bKWCP0| z#bh-gR|S6$>p?CdUy6%71G(#)@TooUs=fJgT|2TfQ~(ocP9V*r@Q-LuWwrba=T=gG z%DY`n7Mlp8sL_fjCff+3!A=p4l@luYj!ME6b^Y5U;Dw-&u*z?m83R8W9-njv14&F- zh7D>J=PVh9`uS77&$kMz8=~)YcoW`{P(TJZmhI4Y_!v2RV#fayZ__uzzxoxiOyM8C z9wm8tx6I7nt&R+K7s|XijFqRiA_TKh`M9wL7u9Ko_i~qi0X5>ac)Ktn*xa>Ra;oz!Fa@NA`7BYLF zd(R(>RrqVQPfK@?wy%B5_;PxpYt*1~cC>?rN3V`?JQu(UuDV%gEuYHd4KC`Alm}Ps z)$ucpnq^NzH2M1q9)^{sMt)@|N{9OOI%92g97G47ED zhzAyUaTvXH3!BO=iO!>f*kiq7c@k2H>CgLw3B7|q6Fpa8}hMuU4Mj~ zhJ8VK(jr2)Ez~$tzKpkX5#9mv##C2b^=b9?o|Y2AJOr<8PPtW__#|gm_9K;?8n+De zZ^)H8Pgo><@!!vxBSV%5dS%W{4Yk$`re7h{B+_)*T zQmH!e)zAwC-&3?3wd87hO`@f&+ImA3h}5I}rH3wI-K^`W2<*GhIo;q{VB>lInr+-a zvv*CepH6;;4y

kHC&}jV+Vn_sHP1(0h%|edhU&*rS`R9T&*J&XB|$7{e`O?e2V# zYQp52`siJaaIRFT-BiDDM0+QO{^Fncj(kgpF2QH&ivPd^iE=>8s;eRvpa> zc~=%cZ!!C%M7MRxsb7Qq+Z@lI)t&5maE`7;u914*`P1ABjMTER|363GYGl`5cxLbQ|}+h^`9>2UGa!hvRfBL>F@s z+3Jhu<$W6ITTYRPlu*DcUi+!!8BV!r>Fdf0&IH}NR?$9wl}fPk_I=wkpSyf^nFk8A zU}_aIYB16jf7Q?5F*-k~Nyy)=1A45Y6G(ZA1}wI0xpO8iE$wYKjT@4C4M$(@T6gki zv75Fph26JGFKPF?*`x~%Yk$ai_6%3uDxOK(;hip~#VbQK*n4!M9JUfzcH22uAN%jGz~JRqAWW30 zRZMdCm-}nVLODx85fS-r9W2mOjOC{lea`B5rJ`&Ro-3X^3(o|d@za#q*P=u$$Q3$iM^HXjI*R{of-VjCHDoBb^QtoHpo6u0!R?v>TX zvv{!TCK(SYfM<4H^tK_v)5tHhIG`|my^%m{w5JA%*Q2urQ95Ot50Fy0_O0!_vKDWLXj&T5o_5$7gx!2u-&^*8`H>98m5XU zdK~SZ%2C1BE(S$9SQVLheJ2R_n9+gv+FTBk6B`OPSJEPuRC~9^3)aW6)y=$ygfeF& zB!DcOGJ>Vq|BM{!>2g1E7K^Z3;^rX|KU})KX5{C}Vmuo63L#ZF6BUdRaCY`845m(H z8gB5*sLO1t5(oJmehpK~r=f@BbE-S@Bxu6L%@Fw9Hj-2HD`irL7n+p@8M5 zd87xP*0<7Q^w!4cv{ZH+4NQT!$>I1Cl3RV?-l+(%^QRAO>*m)UY~4rB zJtPdZRQmKWlCR**h)y`p9^4UT2&sSOoP2BBihVa0zm;m9SpU(gt22kjjn2UnZ}OVt zfvUi&EgYSj)(U#ZILg09wOZ@9fm;}=|l36J&2x7wY$}g%EnCe~( zW~%)cOtt;uod{F$k;ANbU!+u+Wd1S`IheT|B}|P4YgkswFFgGRW}rv!2`KtE6TEq! z16fQFixUN#bQK=y(_7SI$<5CJZ!L)Qsef_cLXP6loHy397L^NPy^{!y)UR8`u{uSy~V1xv;gKi zj#96^7qGzgH+d&v@9#7-v0Bo4e^RT|hAhuepd%>8$12kb_aC}J1}rYjv?hnp4myoe zZ@K$_(|7U-?f9lp>eF`u79wEXlK%n_Uf4a;Fwd^P`8t-HEmc-XR`f3qnA+Ue96!Ln zoMH7EGE3_J%}L`Du!IxF%g}KvblZ`il|dI{w0ooCpK8GO{cE{-YMh-d<$F3hGMcxi zr=oWT?t6{j-k(ZhROR(r8B3`1?O(b)H0^7fGm6c7ENU0$f@F-uE`Tb?1yhx92dy|b zFUj^f2yWUW*83U66!HYA`N_bl;By+}j;m->NZKebM~N{c#fqP63uoQw&q7??yFt0& z)Dc+271n^_Zsm6l8Cgj$5WyOjnf0``=B(V5R&p;=Bus+7^jW+}fiIFVOd@y*&;<*S z{L*NHHKvkNF}Ty~1%gxYY~5RT78FuwRK@a)j%yi5mgm(pHIEi_uI}J$=Z_t`?ux0v zM_~B$qkd(AjQ1Vnsao?na^r>YiFv&?mK&)yk<&C^cGtE?xrn2sa3JNR`tD!h`>6ov zA5xZ)1ibG{=tr(g-0`Nnpq$yD`P_m}L|Nbf*_g}Q#mL7hHfU3BPbQbScTdqVRm1!& zN9kr#WoGm~PetvMM#HJMQQf8y+1bVVTuw6DPp65wZ{4IC94Vfjbjy{IhT}E^%jYNQ z%b8V8?F}>N_JZ2J#GJStU7j2 zXxVq$H0;5BG{oVNCnL|K_&}4TuJvNG2VcePP{mK3R|ye{8IlI=dxJklHpPvN z^hpp;pdv%AzN1a=Uwgut++G4Oti?D{rIva=yR(f4;w!FY7{?FN(R6)4I@8UjsjxCO>bhzg7xF^Bktc0;^AN|<1|0;gdSkgXwNdivLHFp98Hm4p$?q-YzvT@hn{TZ!t zZ-2QQ`EGcn$I;;5JIC`*FL#bN^5k82s2T2}c!f2;noYcYt?>nS9!RDcQ1S^E>#q$p zsVTYyy|IWzv|ZdQ`nySXJ`ENfqX4ayJ5J!6%aKMXWr6fy0*76|)uO}m(l>uqEi z5O3BLOQBa1(~q`m_A`gfFbqVRu&1?uAE$OM@IdFe@H;{fnkV`&Y?FvtJ)}Xb%-L-o zItVH&pLt6zF^UAW3|J>C>AAKqm@^^=xTQ9V=9-DDXBao_GzhnTFAFxP+2O!YJ`ai$ zuU#2i5WKHW^Z7~%)F3&;dK4SrdPwk+;Ex$&@jwG?D(N4LvsUJ)sVt!Wh5=JL}YlM$D+f1p6vH@Im zcR7J>^J3xME1vjjRb%D3KaLL<`bj7JG>cn21J#{&;k)Ed=YzqX-No^9)7>^hzv}7} zN&Utzq9-Tm&&?8NaWQq?=0RDr20>NbElDSAG>Z`*jC9gD6Ot7!oSpP)(#?T)6vvJx z!Ip+-(R72)ZS7_OrYo3IEk;YP@*tgpCLZ)l2-C522NR-)t_+!d)pgWfy8M$Z{no=> z%C*-`k2}T5_27dAq3b{PPjfvvFgd;+eDtGafY|{#(r(W$;<<`g-6(ghcQk-vrhz&- zNR|J_2fTsbF>|MQk>bMmzV*6wZ2PmF)~dAEJWE4dQudDUGKx9$r>dAkR@srrZnlc6 z<_U{E(l>I0v!4fQg91PdcTL>;u_?vjhGMF#8m6lp(0ZC9K<2T_>@t^72(XZC0x)pN3X5d$-BJT6GOYwr} znsJ#q>0qI`tV=joIwD(=#=Ju(?YUJ#9pQQZTwRR29EZUU%cw?E(Efe6gE<7T5yGF8&8*Pl+P9S||`1?A&R+m9b@?mnD=5cW5{jqXMs|H|0cWVC3zwOGRe#g6hHQ`xtk9aL7uq2>LHbPJC!Rf?M zOJ>rQzv+)jjpG)_Ed#Mx z@$hbSZs3GHvjxB`UXA)!zNSvWdOyJ-5dH!PZQ*S^E@%BFpqUX`{~pb+&!F;N_y<7C-SiTBgN@sal&!K zw={ucq#{#yN?U_&V{<#JeNOV>#H}$$O}hBY>J~-LUYR@7YG84#<8RP~#is0W(G(Y;rK)#QZq#xspHqCwu_*#M$GGE1T;T4H z3x1-|nd?Xg4xHW4I;Y%9@}gX9z8327Hccm;+ZOx|HzF!xc83I=^DblA7(;Cb5OI7B ziPu!F)e6-Pe7z;Fbu|7cN>XjQO={HK?KuB}wU7JhvpRQwzSs=GcF4DV6D z^!$wm6Xbn~A|U0b3lv zmK)z--94~w*y;tE^>>omKFn+WAFP++-&n5~JjVZl_0stl>*f5v);KVc`=87;;NO{R zw)a`b52!Em9mT|HkA=HMR%0r)adD<2sFQ}ann%()i*Vs zvgI|+xhN|y>7N3>xrTOW(rz;1Sa-$Msx{HlT1UHJA}x8%J1*HUth-RKLHc)-i#eB@ z=&(@luV-R+wUF~;=}*tZfrBl>TaTa|8Wi{JTt$C^3xr1r_5O|<8h!?PM(Ric>_UG7 zxK`fu(RcAuc?4kS=S<}fJ#_OpES*b!3hlMm1g;QQ0Y4pMYi9<@(x|n))i*}2A8iu? zYx5Zk+-l}>=S))F?!Y=8$2Jh7eq-}XwtIZe>bqda8tjGeXVnjp9yDTjLZ}hOa(}56 zP0Ob}?n_Bj3FVwM9!7^@lH4A%JbqNSv)H<7z}*>_?5*w%xk39mpu-HU#-S`0+iD`0Y#o(Rzcc@y?y2R?XL8!AS2HFkARlJL zP{E1x4VDbo$dpPRmTL+uP(WjBM@;T^W*sM08z5c8`Kx=v4JcJba>Oq?^JV^OLhx6ZdBmVzxZX^?7}@{ zqoJjKq`FwO)FzT-qw2hlr%5mb_uDNhZG;i>;Au>WhCaO+c{rwL_hOLQ>-2E8t%Ve1 z!nswXrqWXvb1jllA)_DPe{OV7BKOi7_{!F0`%&hzFaJu0@E3Vuyhnw_zW8mVp&iV- z9p>qe%t#~gs%1;F4+?VVXgxu3o+FJVIPc=;%*#`B3axCPU&%&_e6P%IKtQlBLXRX` z3SHO=G^2X-w}r5FqhxpHT?BA-H@4L^8@Xdn`Gw;?@>gDB;}nt7>A=m=H;$ge*R|hF zohUx24Ixb}WPc~DM`gKNv=*O=8{1Sl3g#s8AH=PoUY~EcsK?KUnX%ro4yq$sf~F(t z^k=w*f{McKoftDU#FPnxIsBvGz8x=H$X$Y@CR3Y*NHWUA|oHA}0Eb)OEf+20PCq0Wh zDD){)63LDfiifXMc|KLqoJmCZahW(g_HK+%Gt4Odi%`%0CQE%W(*@=i@vIvUiMeR+=w-8Zmwcagv#X{2@)5c5`9 zLw=hngU#M+Gtm{{7*Ss6RmI1McVv6AodMqlkJ;qF{S3W6*KExuQS~NP?E=rAf18I~q;-=W<{( zrzW>xEL%e-KM?wJWImpZbNS$DG4*gl-x2ZZogY;zXUO%RT>vF07^_t%i`Mmu z(==4@Bbd_UXb0Luam(oRb}BPyzpwuK>H?5wlHVB<>t0>kwM$#!0N4yyZCvA@AMPw3 z2nXr|YG*6w3a2d4HdDjaQ>}cO+4yrprr1Ux7BdDsMM}1=$`8Hnp)&-6-sW~Djsko( zaS2s&&xY;f&-w=fYvh5M;@kB!0m;3@8hMw=gXiI*6+Smx;Z3F=hrh0y+zmjqELFnu z2T+jQmrq<0!e!6R*RvQ8=2E*TzhEg4UUnH*X%9nNBw_G?hipbJCSBJAY^ zP8qB~DVkiHcA?EsH&yGJ%850KI!=z-iF()T%5%fRed}QpE*RH<8s+#P2T3h$uuu5}$A+Cphxalop`msaYFS@?4@l=MHyhWGx8v;V$O=g1W! zpq&MIrmK&1Ogy`jCTRIvUa4;lj;XMr>4VzCv-cO-u(wjO&FlJhLKA&F+uGo!earyR z2jB1X7Cqt_XrL}vc3HpgIoPP#bbH=S@;RsFcU)Dn1+ls6HAzT&4T34uraF_m4Bx7( ztRK%+*QDmm%KkI))s+96!?3^iFI)Ei*CZ4hCi49Y@U8s^&#Uk^TUHx3F9pNYMgP!x z|Cv&cAF5id7C>wMLFE3(g^nL8{ll*R|8N+HVZl;in*(rfTxAp5xlh9ev>UK644dql zz`B)T-LQcjs&Q{j*BzHYLp0Z0s;ua(!taNL>YM+AY=GY4DG~jb{x873Cr1dsc5`Wj zHX-u>+nv0aTJiS}&@BQ3ar;T4Q@aHTzcOp|KxvPVmlW@F!?^}IEWO|O~Zms&JK zn&6nJn)HPCT48+Lw=RKyRt-pOqVJ@-K79nK2fecFG0*dUo?e?eu+VG~*X@g2rSx9- zb=+}npP;Iao4qNL$ikvLA$?HBl&{TX^rbo0AHTIxE!9Ikt9my(8tkx*0Jy57wyR0qmbjIltcnd{YLuDR^Hpg4G5JR1?(ZZe2`;^TtUhx+WwBbT<#DN_y=PD%Tjms&4BXk z$VSv*>kFCrZPFa}+<#xiveYtlnU5km*63ZH`SYqg(kxxY)IE7pD$g7QSWNn%d-aP3 zs~^$GjJEob?7qT%z8O{LpmT<`Yc>HV0xRaH^|u3i56m9ZFQTu#ytoN8Pn4j9ggl@_ z!*YlrU`UXG4QToK=kcg7S6Xm$2VT| zPJwk16oB|=KT@?3ggOaMFPf|BpL>mgc~f7l85JGk_KSOq;gITl&*P zj0q?2G4mN9tn<~Z>%_yw3l3e;QOz$jwxR;sGYI{$Coteq#wX?hx%1D9)QYnL~q2o6E|QM>A?r%IWHh9eQET{nREG((pi+$*CUkkgGZ@WR9Z*q-@3? zlz3}mXe^l+Ulmc7mzerJl@J5A=}UZuq6KD9i3|0JcMEI10Zh8SOqo&BhMvOIvt>T*M*(H7KFCWEjcw(@5)Y*yQRqkzQ#2utIbt? zI3dio7WQ!ruqV3k{pMR!eL;x>RY`+P!`SQlI>{fKJ&gk<@HRCV%0{X|r5S2-A<=T|a z)>E5I_xj}UP%9^>*#(u!?D;~pqdu3Kq|WPhY!|? zxD(Orx0OOUIINEpT{V-^A!K7tDQLUS7xyps*tCwoE{S3xA9moB)^q|JO@>j6Ad)(C zC)bhNdE3?q`hdXUAF{_jAGAMRA`l_maOJ$(=83r0+tbv#+@*pv4}B>~8AUiVeNFfT zbh_p6k0%v1&sdMbNc>8;#-Bxe_ip;s^QQbU<|zFRO<|qSEosb}E2!n}m}Y`**V}jB z{6YvtGD=ypkW=!G+QW_@F$Q=mDA@KCY)@^4cFL8RGel+=Gk*ynbUOmJF5?i~+|OSv zIwsi^7*l>39@T$sAV9@X3$6T(*qIzvpt37lhX&zLs3KNtX2HDUP^cHQ+j0nH>)KY( zbWAjhM>DsI--1e~cp=Q(;HW`>V@eftty;~0fp~}A5_Lglxu<3kSisw#H5G{YyBX$y zMno^y-@f$U6{)I0E88J*?80SU`44KY6)dZ)0yzcrgPI6EsE64{t(}avnnGjbj+X+c z=@a^nu(1$1*2(rp@~;i5Q{VlDmn6R3-1ArKYB`q(uPfMEBgsU9G@Ld1&_kxrw(&BN z0A}2D^?zz#E%Up*u^!kj!|N;-brT;~j{LS0)=+Mn>SkrEfX8rs?3cc-u#6KCBUR+i z>E=yl{fjLz3*OADptdbc_m8NPjew}2xp52{R&B_=HpArrSA|GqRKGw!5%_#q>?6=| zHw`s-y8?f|93Mm_T(UQcBpnjJZvMk7H1%h5KefG@z0?{ccx^;Ypw$dTkJ$wy4>g+C zCqteb?Ka`ccISc5v8-0wo`U;HqEZrrFG<6gcuc3ZiD2&ZcQa1u$Qd(c9Qtu-$FBlK zGgm4tF}h8=FA8xV&I{uc5X2R*F*C%AHj`~aj#X*-X@-AE%}NjW=@*84Xne6I!rbQt zHI&3Lk%q9X&YR|Kiju6!{OgMVK zq{^HOnPnP_Z~`BE6j40A>L$Eb;1T~Qcl0=}ZS6SkL;XaU`w#TynEkFwiLqt8J;I!O z$>&@LIB)sU-mYXPRmmU2zZO-6y$K0i&Kon{$`-}5Y>nw^*4@>KKP9b>Q&sh$_N{#8 z#5~XWmg8l&e$x}W0va*HCFy-Og#qtr)sY;js2`dHt%<913?+cIa30Ucx({Z!dE3;R z1fxeWCypO2YQe43I-QK0TnBeUzsw9+s4||o=`F!{lr3={Q0k70s)3oD*wM66Y;kR6#4nq6pVRE;_LRZvy)Pi|#*Y^f+9AOvq z*&MApCAj_mjbRsRJ0(m)`D$UEKdm0|)jN)4BeidAWl>0@xprwJABU;%L4O3}vsEv~ zU}}=WEX-Dh>9^zEMQ0z2Fn=K2qZ2XMR#@5&kJNWHyIo(aEap0IL-W=?6`sH2+pg%& zRpp3wX_4pm_!&4O_=RbOk0kfkTohB$sT00|D%$*znz?aOQ_k`Sp5`3OS{|`U3^6|^ z<2upFmjcI9V%Y#$K&HQo?@WGnxVF@=cC%C`uOIv}&MoEWKFMx+8L*AJVtRJB1bz{O z6mCYtM>e&E6mmVZA`p)NV?a6r)yR|CgH;hjxz~RhvueFH4LCQBMPcgxd# zx8sDQH^_*_WDq;UzupX6rw6|@PRw{)9;Y-W2%*VChwy0Iv)o*l5<~23T?-pGUW^{cOTc6+l zHnYEsBp8Sw_4--nVQ>XnA3rqcAuwY%AXvmDsbD}?9&w7a=I8=5DKk6qcgCt+HSj%) zd2;_r9JkW&i?#%h;;hQinyQzBCUu29?j_$Zfs?tt%*=bEUNsAG0g>Fi5PaUisLi-a z+%g74cZrLYC2uCf&W7EwPg~6%%f5Y}bn3bZT*lm%#MoGO6~M2w4iyWQp1KZ zbI_`&YN|voGSVOPt=iY7dPcUMJ}e#$DheJu-g8*{U{%kx#8gSvWVIz`Re+|OnK_p> zRjla-v*aNUGvPbky*IW2-C? z8mL6cx=cqiOY4Ih8aP~w4A`b-gI`JhOLpPtF|hEc2tXeFrn8F&1dg}C;Rtj0qr6OX$83oS_S1`<)dKn__TJCNG07yumwoJPrymYI8~@Visok1*d~C)?8ad-1 zZN^z`77beR&dJ$x0rvzkB+{CVniqQM(tQtxwVoZ;cT!dv|J(TomEpI(?uT>*M2u5k zwQ_C(7mtCdICz0@{fH61(`2OuF11$Ff!p#8Z+88^!VCY!Qt38`UCF=pe-1DF?P-Jq zs6fCEDT5a{$8Mq{CO2G^2$h?bc~Sq>#AxW|n$8#S0Rb;Ss{e#2Hvfbu%FcU}p{Tt2 zdvmUiFaBw;Q>bIHDU1A)>QsNwlq1-fGi>Qy6~6x?OhT)J*q`fuu;sTNu_&Y^1wtZC zPIXLj`fr&8p zV3lS_U$S}m1h!Kgt!h4558YY#dR5!91I)Ox^*fZ^=?E5L+A+XG7WLjCW$>{JoAfm6 zuA|CcbO2neLyK-22emedtTCR;*9C;&+6554b=fz#OpO_>b+)rIU5!WmRt;4l&5RNQ zsKmp3y!Wkxwe|klZk-_UOR&#XVsU*wLsRDL${CbVwuw;`-jRlLDOUegs`_;=K|pq+ zW3x;AQC3imPnak+PbP|$-ifG`>P#!2<;{qvN*fdttwJdfc9=neq56q2A6BXkU zpJMv@c|9T?pPpopGq?1&CEKJpWRq*byd*6Ll-uhmMvlPTILjSqz0UotHLVi)+>=i* zj{8}^rDn*^$^7%wiMG-ULjG^IjiBrB&oeDouS%q{rCTGhbe?MAHpD%bCz{e`MqSp4 z5?QEa%hoBSlyYmxTggdT*~MU{_pG{_+iRLfRI5C<;yL0mA987NB2DMiP!2D(9c9hn z_Wfd(&dE5Ok>Ow|oQn`^vrFx#lT@`$vK{29g)Q8Rp5A*K;2~a1lbwsVT}7T{g0|-L z!g^2jOv63Qjd`nV9=tx%VSUR|uxIka3l6_Ggj+?zf`bB^DRn%@+B;Rdj;(XoJ`-YO z2LfQoZpxe;sJ8=RfATw(8fzp~<`|N%&Dnn>4I^_2WAeCD_`r6U<7cRCh-mjV z?b%7?C6&qN7Q)3GqQRc@!Y@bgFUMnCy}}OCV0+h$24Yc;U&KU>g%1WP%oI-Bq~^m# zcXKKDe=}LzEb}Ah=kWNpD9q5y)Jy7Dy0B`bw$y^x*!VHLDn7?thU5mDEH^EsRC(Y% zuJ2F?ao4V-*STe=?Ip+{zB5Hs#On=Ac;CAcojw`p)UC)BQ(nrhATfg=9o?3bF$`d^K3kPhgna{J1P?=kMFB z-D+PLUwg9W_lR@cp*()9GVkDgdc|HwpK~ELz)0T^&T4 z?qg%8h-oVmF(jnAC`c0~J|E0HlR)w^aG3u|D5aFF7DZ*Gok#cPcH|Jab0uLtVZHCe z&!@Y=xFsv~sTkO1B6=%~$GSEa-KH^`?#(Kh6!#--bgnKAjjtenlWC`kuMWN3t}Y2e zU*xQb>aS!XJ-eAD!Wh=ZWv2+qa)!-kGIE|jZHseujQGTq=U

jzMi<{EK070cZjNw)A|8Z@0Py031rdk^=BY2`JYa0UQG;Kme8j z0q-7QeRLZzKmoA#YEz!K|8xgDf7ed(Z;RSv9t`2zPg@FuB5(&9tQ9p`|pj4P|bG&YhPyzNDaYUPnI)dvleVF|B&a<_CSzDWY<^+cAs%VFZkIgM&$;#BpWL&PBcB#}n@e>9WuYxY6NH-g~ zh%krJMr=32ePBVzR{a60MCAyXwcnFXr@;>wtV-{;Z2Km`%X7x~GS2SQztY}*b2LfK zKibIM>GzZ*k!s&B6 zMayb<_kEB2atC6oDS6g!mvyhI<0)FWW+Se)SLC9H6t4>BTSw(VYBC>nT(q&f%>C6my5m_OZUwBEQI7Nr( z%;urSGWKBV4Asdz#dtp`Z^rZo8HC+@zlr3~PJ-&=NV+6*M)l=0a zI_@F5v)X-%VaFrKrsvn%N9MYjyo@Zg#VceEXTC=^o&hwQ8Wl4}yoS5izVHDYe&&#o zJ6R|7Uj(N5zqGPP#r8G4V%zw{7@@uJ*1Gd-&R_kJDp3~QC84oBMCind`Ln2Jx0KAH+vjeBNk=|pxl-L`_BS6euZnX~m>LvcjW9&w+Dze=?WklGd^DynRCVVk z$dTqIbuXU-@sa0fA&X2sR7!u!sl4^%OJGjh&eEj!V?YW&F%(eY>lFMIuez&Gkd?}& z@l=(hTbv-tR^Vk_;CvKX9kfBS>czDG_-+wNOqt)L}PwqVH~j_2}B zgIs}MKRC)o`|=~BaBB)yHraNw_8b1IBze0J#)UI#W&#Yty~liW9tC6{f*E~Iz!nGK zJ|53(=r?cbVg`!YE9=$pMJ0t=PLEd{9x7)1f|)ba@~(r`mpUEb$l5jSVK1L@*W%2S zgN(Fo25<8L;4jkvC#vuU$<5C4(YUv$%QUp`T-mbAESV43Q(*te7JdLd?3zaWbC4}4 z+vJ4a9axo4KI8uYL9N4Hj4VH;&)hzq#H!D*m#uw4N)#M+;5t@|39m zsW*_BL?s*XO=8{PrLCgbJB?J4J)5O&8;NRp!?nS$TiIc3dNcjO6gC{q4#{*Cas82= z=`%KC>Gs;kI~N2P{=ZM8(F+FB*)*&_I%ZUm4WTln%mn8O~>`k@;f0HV?y#Fu32#>=Z?g*Nvzt`N{#heEt)XytQYzdgl3sPaqUmzIk zk|P|N20cd#_8$isBayzEo}Wl(TsKUfV-Otg-X2qnrp4A28xhtBD@Z5EU>Dy^6NsQ? z%=t+Uz8|$qSCHtpYI|*Xg#$4d%YyP}jr%Y62gmFCsny{n!i-GHzWJ&#QPwoNgqG}0 z6&+}Kvc5^SKghc%e5!Y#(eL{rK5ssGRZ)~A`m-Ck{Ij!-~7>Yg;#smXj1BaV@Uw8T|Zz{2A7Pv;b9*Ci4#wz95n6Ou@;7cFj% zUq17Qw{j;ktLEBm>3f~?{3TD5l#i6CoP)LAK4L7AQ*gBGL*DT51!3R(28h&HKxNr? zft8b}QFACO6|Yq+>ZulT;5kq6fo*e}quVCcYrov1CHMIz- z3RL&-%e-R+Uob;G^O=h=JeD^8aF>yFHCEyH^=zB5Spo)c z+R@60@eHjwrOuiIzg*$XCW}DYN>G@?C>m_;U1Bh2LWca-DP;J;#+e@!dwkGE6vqyRKJvG}FvH=X!Ec(*~>CUoaApwY$V)Rrnx3Z^eu z^N>Z#_`tzc*z2<=n!B&Naq#xJ(B`U`F)KI7HL;-_6eh3vFsCOZ_3n4tV*|VcTf;1o zLtkeNLFA0Jqs?U{`p>}&v6_4bbKW+7P;h4JH)2J-j_{K8%@saMaFoS=IDY(9?Vmnqx8v=jR+;|6#mdb5*mrI}`nWsSL0R--@G-2EfYMoL zTr*Pqeqb4qfnr1)@x#??`B^2J!^Zb<#3ndocQ&AV#*V(@;!i}mAIFiO)y1py`3pf{ zFWG0Xl}K7LSYErjC`K2aYUT+D1lfTC!7PsH%guukj&pvW=%cqsj_XpNW*HdJj>^{B zu}h`CDx(HNw=~4Z$X8uPbfuz=vBb~x>6Xh6{Hp6cTasFG%FoZd7GLZ}L%pG2wGeeJ zqmj@zGd#192<{$9#E$2=FCZKUIYtPakCMRCxXt3NJ(R0IC|vh%#zDWvql!x+pz5kD-SAlP(>!Ft}=4q_8!z*4BT!d0z4AH^9I~5 zn@P4%4#LKUm@W81|8zOYswRNe=Cy92*L0epiS z@OA>$+Q1thRcHdtTXpOZe|p7h7vYC}{U4{nCPm`bYbH5e5u$*{urH`$llxYnn_?5^ zYw$B4464s*e6}nu)4K}^i!mj2RG(|J5}&vTc6}968^*}Wvy6LxWFja0B9q>2xGM*2;$yx~oAR#ecM5isrpd}xCgq5+plz%mS2 zrrgBc-TH6Z&EFK5SRkE7ty=PJXI#kOfB63Hz3>ZH`jJ$ zI4}+Rj*J$jpZDGAb*(nXzb066GUt%Q>Cw@f)Kk^c2+ofK6L&~ zr+!Vd5?|a2sn2wubcVQ2na`g7ISP;O~GnJb3GQq4=K=ew+-yS`H?G@ccju?idlF3Ab+Ii>-SI+aZ*ba@0jgtfnWbX zb@elYkrH_y(^i{GYndPCn+wS&ZC3eY4o?Sr-i)*$HoFu-3>jPrKcHyep0BsPcyVN6 zj_8h8JOQA)W+2+!fXc5tFS}49P2-`hd7rYls~C++IF6kktL@EKd^_w@?sx zV3bTZvX$z_!W6r=Ju%r+Zp=>rsgTjI`xImtgKuz3+njC*B4UlTQ~Oektb~j&E9L5Gm9CIjPh+W?aZ12O%4nGZ3i=#U5-HH5fu3C6Xc9Ue z87PZ*1+grduo+A}ZF#*T*d^H&nX+&P1*>=T$zfjI1y{Q zTYO#vAFpnOCDo&?zIWGItynV_PT1?K`!br4y39S*ILh3R8C0qBQ1aJSDmu&FD} z&T#%dtj9tX#FldLsI0BjW9gH`y#9lqq+yf84feQwcg-XzESJC4{RZ_?mG))Ef=p~l zjD3P&xxC#Q5AEl;P3+Mf4sT&Q50(^hwjS4-Nv%ssj(iF;F6>ypCWHmgAD=OQdoIP3 zUGt^j4uW`8kRgiZ(Bn;>3z-_#j5HVHPCfQ2KH6Z{VLIfTOL8@zvCr`kQ{K3evYZxL z(>wVlY}x)rKBF62JnhTuPP;MvAhjx{0dc;l09g4#fnb;p?KV2Z!~IHn;f|6Lc9{3H zGHDa&jNnQ_6lZ{Yh0F5C^-^b-_t zRel`V!dy?fwNEM&o8P7d3(@yT_|B2!TmG&IJ{~MV_=fd3xNx~oe!3~5WEbNPs?z3o zsSNdXJ9OpQiVgQK_Xw!n(Kxd+{o2p zLKjzOqVbHPv`Iv(zC1fkEV-SW9^=97i@q1r{=4flDM#-17_36a_OsK2!Oe%}_hq6( z;-ZDJU;T)b*Rk#G@;R=I(oHyQV8J@y%_?Z^3zwBnQJL*%BbhLyh%C+R$9=wUr|%xu zjqDLX;Kwj9r==M%uf3aQNS^PgQ0Ugr$EKkjdC#mVns~p4A?x&W73r2}O;4-g8okKt zEz#@ysA#|OEki}Ve@b9HFE8n^MQv{h)}1U++UgmRv8el<+?^LTD=d(FIj(D?B@-8A zg<(R5m1}b5e{$@4D?F<4DO!TYNfN&1`|a8UcdlBD+aAvjXTHs6Dn-a+9Ikj9@GS0= zB=!>|d+lfp@OmZ=fa_xVoup1RW6lnu#53*3bU-DlvN@GMXm}`9**f%9wH6dY1onxW zj`0}=IKt}Y<{>6MBle!EFWt0zvvcGq?pqX6B@g91oVdsrFbjkx+ERWm<5|+9TU6uY zp#!&uoHNu8*hjFWce}1jhQ7#IVJE}x+c|HO!slnm;zx`-6hOZB9}2+;KO0w09{UG9 zt*RObKCFXXN_isL15c%KS+ACsG^Abwf`gjFM(kSwb)esoPm&&h4#N{(61 znI68LJ~A|<$&~gC8Goi6;>dJa#&99yH>V>kj)Al02dpUz0#bulUpD+si_e)pHTL?N zbCvD7Z8j59T1Y<6ad$+%Zs#&_qn8*WL+rHCAAcSz@6^f_x*fPx3TyQ7*Bj23u6S7y zfQ;URw?i9b`>n}lIiK5`zPQBLux6|PA*^kht{jsu%UPgKr>0#{Us+d$v6Vk@c~YbZ zv~QNqju928N2L*v18&M^Z_)@HAA-ZRhydZezljIasN@CGznKiRpX1x}F~Q*oEI`8m z2sRsK7a)G|?LFS{?VG4fgS)5{2f)|)J-`ndAm9Xk?ZJPgB7_0E%20_6z)r#oGPvF! z5SQa=y#6n-@YMSAhhnzGg+UQSe?t0C>Jz2175*E<(TSzLI%$5}v!5*2d!7WKxTMz? zAsF88Xe?=s6^#ySba98CsRuQ_)oz=DA4~Fet`!PXn!(-7lKPgtGt2@tm_eO%iF9Vu z8dud4tOco~cIWboXjA{yVjcyS9^6zopwbOctU{;+1rhMV=m@Iz!J`Z0?t~b|-qb41 z(IUWg(5m=Pgx(D>(*YcX0uW0Jyig8cGPeQjO8)hK(HGhcp!@G2{(rI&$p0t7P!F)< z_=aR?Q|=}s0mYM4c2m9)^0!C>RdhUj(C=QO$*f#^K$z3$p1K*jXOr5@aN`8QHF za!3ai8K`FVP(Mr&)K|$i^R8mNI{~RyVkDV=-g`%kQ?kUxmWm1ll7zh3FA_BJvP^c} z8h`a57~3z+@q49#Wmp@VQ*Y&Qued?kmla0+$F<{l;;zz#=xNGRMVbbRgQYndxwE`` zeA|~UBYB7<7n9hsJ@+X|yTc_p{W>l+4B;!yCl9N2;iD~^>a)?9U}<20)A(vJAaMww z**3fi73qyVD!`DRVR+4HR&CfW1gA;#!}+b*s}Dud(a*{`CquJYEBu*aY6@u=b=sXeXRQ&`Ksf_F<+ zzxHNJ(T&({&$@~|*dyJ9`4A<4uCv_C(v1nv!aFe@I>a$5BwV!zCBX9T$(nS<5IL=N z1n2E1ux?tI%(oXj?IWIyNi%b(?ga2&8&2Wr@$&jr{bRox8j)gxHgQ&>9Sx3in{o%i z4vC}noRua1K-H@8GmnY|+0 zHk=zeQ99)^;+OOG^n&HhOJMJJx#D*3>@o| zYUGlasu@x~d@(*kF6MAQ?fhHJ^Y8BtZ#@+I1|vK3xX&0DL;pY{7bnm6wEotT7c9n@ zcq2buQa!bl)c5D!&ahu-P#vztqEro8b31RluY19}ktS;^Gkf9S;;?d(5sFdo(~?|k zTT_WXsPwd-Gt`HlqA#(uz(^07cA`l#nCnovWR%DFA(&UVSFmJvo!cZakIk8QXJ3yM zOsJRJvU_0~x4c7e>FqomRYyu8tb$d2;%RL>I$t(-C2qI0N5imw!cYC{!~;)WUf*<_ zzULB)&UfvQQd}SWb5riZ{|S)JvKk5NU~8 zr5I19>x-~y4c((4ICEX znY2z%WsJ{Jc@e{hX`=%R^WD!t3}vNGr)&?yx=x4(Ny=8e>wcdx)}4P$W~*v-j_@?d zlg&T5!qO(Xd>|(e!)*V7$(`20oWK$!@O~ssx#k?tAqB7TH#*Jb_T$|4oqJBAp_jZ6 zw!RuK%HXw>gXcL!6??nWV~-SUDMXj+I;P~me~?dQ4OhmgN+maccl~`=;Dc@Yd%WtR zPx4e6#1l=iJ|&;zgM8)d)gUTXJcI=t&7Qsy6IBEm z75;LggP_P?a(bE-U$7&uqnb znj${2)9Dq-BjPc9QrOx;D$3E_Jdn~Ow3}KGUZfZjz|fA7BT2N(d1Q&zR?_%=Xobce zW-!cerLOJ~_n;9+8f(mRWEZwDLT3KWJqdd}2b$S$e!P8>D zeXIRUai^Bdj2|}b=neGv)$gp#iW{#HL#2@F(D|i!>*1D=aBKTn!f=fVNx1A9f*;x1 z1GbGgUcWyw0>k1EIfCu`ylDGSD<2-mij z1<#BK``&78m$4TQ)$s2%K*psyQ&-gX_f2B&H;6qsnq%1VtdpP9uh%3$ldDcNaS=$y zTC1Yy8O)WT?r?rmHhRPMm~|6%LM2P2-&CGL0N7%8!}f^Et3>5a9R5wE zu$cO)m2uPZJK!b&7UXaqrFF7co=-Lj&&o#7Q>>KR{D%P&2iSEE?BWNU6#y7Y9K3K; z0Q}q#c4aM~*8Lj_Ly^3oN@8UI^pyjkuYsG8+J7^+ z_##wQsx+!9wF*?pvBi76arCEvkNfVadCfm`bbXVqlYS{X6I~P;{2MRSBm91l(x*q7 zNyJBH-0swTOiON9V?_SM4?=Iw3l%gHbd*2eaI}b%j)+sF&FxbpZ;P3q-!2LB(SOA( zB+{qR@RKw|6aO@``?+gzv*Tfg?(892m9oVH-b(`6+_*!Yv+!k?BgGL*^(2?~v4bCX9F_;e?>I*C;$qGA~0kyB25}YLTud1Rw}6Ssde;y#jLJ>eL&{hWtSrBYS)e) zY?O}Gz9X|BU7tBb+YE}*AoVo%6Xqyhy<1BgGMd6?jF*D}nuAN?L}djGxAvuy^Q1C- zAAU34wEy*CngfI3#}~&k@(3RDVRljuAN>iVYAY7=kb|$jG?DpD5${}F9bQa#w{z|f zchs6}ZEHr={t`N8j2r!#;~o{hseWaBWmmCzO&h!S*svql+4Z^oZM}Tx=DmDeQITT# zlGONP`qul(SKor6dzzu6-gBZ#f6&)$xESkFOBRTbEp`vX(2om+zP@SO?%T3do@P~a zBrF8R`?M@9y|Inp?!X6^mwZ8vhdIMiD#D}qZ0DJbWbEznhMs`!7cx>2q1kHWL*>Yy z7BmCw!}fw^;ZXX@Tj{134F=X(L3qZt@Tql}mV3zbZw;A&(3#vA@#E_n%bEvqu*b^I zgd2)!vJCo>tX4Al@lV0JxZJ0LMTqwS5H{HTWVH(~Jgcfyro;Eo+y(9wKh?)o|Gq$d zxSf$kA}DgHYb;*U_s&s;B^Gl1I(FmI-C-rlrxrT@)Zyp3%PN23Gb!z7QqIoPgDitM z)U%T+TGw(V!Kwty3i$P)$PahWX*J#tn*O$Y9M(ve%EVmsW!@ur+EcnPQ~mq!YslL| zzN)vSg5ovS^Cac3fAA)tTP?Us$cswGRH!XG2f^8U+PDg#%^mxRX9w7vlQ1@VsUbrG zV~$BUSK-+m9~@WLpA+fQd0qlt_Tkp2v576YM!CYwu$n5dWaZKgblqmfL$HzwSVpb1#dmb(bo${kuZ9|%h+VJr2E~Ovp_3TFjm`7 zUx61{wIUs|dF0pXitp!`=k*ZTwR7`Fk5qjWlg}BP8f$!742Q3Z)>5G3#mpu=h0Ikg z%I#R!Oy50dWmq{%_jaOQn~lI8?{51N%JnNNw#iqsZG671nYV1?@rNk(9<&;F?4R2u zvo>v~c(GJ2&m*klesfCw&m!>riZtKSDeA9CXU$jKMBGeR?`at&mC@52qN+eU&-kct z8@)^n62>JXWD+bDOhf0ov^VO#?0a{)g2w|%I`x9F6TM9Hq^a(Iki_#yXDYKr3iWU& zDxf)#yCC0m8M=xR4M%YBPaLW0F4B5x9Xz)O>%{Af&`#1EtfVX@2>iArA6tEsUnO)G zq~QEj{elY`q514gY(2zoax>zI)yHy+Ooat3Sg>$rl;8yTX)>~_(%`w)v zLYp!!*pqinZ1FKUa|t5bL)_D=4 zlYo7$itn=UBqP;gT;<+F@s`wAii_`}ArY$R5WM2PsO}|ifA#O;?T0>jaqSA!l%+=3 z_9Wz|nyH=s^%TG6x%pfNvqZHf3wib|GSEoh3Nkla1*)?DR5Um@p3ZEGS8{Nx;}J@{%gSkfC7Kvi>s#V(H$*ROViUC=wUgUy&s20R)^YC2jTZ|c z$i<`Z;#^SPU9(EQYJzxdQg*7&eb>G%y5}PBYrpZyL&v-~ zy|iflYbLrvtNTd0)1-V2{>piQGPqXUb3tA3%V9#hKCPwBsa2loQwl`%_2`%Pn2V%l zHnR2FWb0&Tke>PIkjla{zAmw-2@jfWyY{ZosC-@L2Ab{HM=z#L%u?Y!Tk4aS5~WxO z-=a_GlblXdyrcmU6;>qB3D#&W!KzKCC{2FeJiX`eoLSDe`0Llaas*AFo*qYXlFW3& zF4-{2z=hU_;Fgf136qKJnps_s`U+KTYu{SkYJ#HP3DNN&b>~hT@~ugSt-WvCDvYlz zJ%!F&ZA=c5PIY%$_Y%VOlZ;xQp=bE&@)Q(a9{p}}S$l|#oy};mf_UX>aWu&`&1~HR zf9jUQJyVtOjQ2t0U71vTzbKdSs%ArGpm<5js-I+W+qvminAsx0$kGaa4%EPc8d!nB ziWsVi9K{BMpyW-mL5Kjrb-poRYe5RgN&Vsp;a(2`r5kFdgR%%kS-b}<+@Pqz1m#!v zAw2m{tc|#*CF@_7l3oW=KkwI=@qU5+Hp2JtynlW!vwIpr{FnDzy6L?B)>|QwudPoN zZ}E6>#JOdjvTuH#wU&8wk4&GJX^$_T@X$5(UV|p%Q!&+HH@9T5`O-62eoS^eECj@TiIpip3k31mo@;w3U9F1)?ch8a+9(u1x!)5r2yn3 z1D2S;G6dQV0Q>8eOQ;EC>>Xo%K$-D_on74k1e7%LnF)(ts7S#Wss`yS( z2YXLsc}Ts_>xber$~;hdf4@?#^`gF|b=~~BX>Eoks(O5fCWoi%Wym^K@MAcYJ&kQO zibv!wicrK9nB4vk0|`p17yFlrMEgIKB`7MA5l z>3R2;sU(99o>&p^8F8Lt-!$2LrZ7yN3;xScI>~jQ4y;nY`n>z z@?m-)R`PV=yLou8CL!~^^SYq^v4Yo)e#&1N9N52mbD$&v=5B>hT5|*`=#$%JBjg%3O?5oId8}Y$ytF z&tGUR+} zqe@9K9^g#~#89LV8LyQ2%7vY;(?{CMYDH9Ig zexBI+_O=it4U+xzKIgYb|(jdN-?FJ!-sn( zIpMxAe;WL;%!R;AhoY*nSYup6`y3sfG@ovkp&ZVJGzMkooKKY<8i|9}Tx_<9p&c6& z1Qzk#=2)i8{<|~x@avY~)OSox{ZwOBqLN{r83&{SDSD4it?&psxQ#-723@&f6`s)* zzN282TXdBWwOb3AaM}&Q*o9JhJnvgRcG99gvR=W|kP|?>MQ$Jk>+kDb)$qH!O3)II zJ!S(*sk%t2&Q}F0Ih20RDejLvs7qBLXUuh_exGl0Up`VbitTbO{<;@a;m`o8O1{ge z<_tsgfPvk4G8tMq@xTO6<$u_k%4C-tU~irq9YtMzzrMOQR8kFc-keU8II*L2nBX-J zvL4*He4~ABIySmnO~p@uXU8|RELOy)t79*pRN&X9>`s0>)w5Drv2DGF2@R;((N%eL zw+L!SM3=j9>i9x5PQ^Gi$wB`i#~C++vu+PhmX*bG`)>gW3x=w?L8LQHC8TRr3L7Ir zD!(q`#x97c)j-y}n3E?x4?J7&15XNj*Q$BQj&r4rws2lqz(F+ciuf~gT5_J|4Vo0s z@gmSCmc`uPa^u#;hwgaD7RPzL$TKg>aW-9(-z>t3KVZD7_oJ&>!8G?$`iJZAOGb5#_i@E&XWHG|r zNu>KBWEj??QlM#F{y3-3@Z6+U)8S5nSC{3+YWYN=*t-NF5Eft8?w#l%DcU~hm$%dE zj%5^+g|Y~Ksd^&#(PVL0kO+p>)c6AGEa4OuhBV5W{ddRb{nO&}IEz7BWTJ4k>NVn31fz8<>(VK@UWsJt5Cj}^^!joB;E)pZ znRmHy_14{xW(_0`2mC|VB4;pkJ#}LE=&^ymeiV6j=oj?sE||7ExN z?*ndx&a;e7_N+~Oy}|m#y;xIx$MAaB9hao4Ti^^7=i2a$J1nL0fF7F^x3|aRlg-q|bfHU~t6f$OBjJx{8ezxte=b<|%9#kRuoFzeHY zRx@3uHPZ^#_gw@*oji%OX45)e)iSIk;+u!_UQsPEPC~pdgQ#-}_Z=m)^7H8*&M|Cx z%vk^a-_1t;q9YV2`4fq9_#fz~6#yXNH$=p!$|F=kk2ruw{?;Yo-jpz-B4=bPH^>Tg zOQ>=aTciD3mo#cc1K*i1&%FtxaZ#)R=xE@EXS}EnHVDa7Yi9gi2}{j!)6I) zrXv@deDC<0%)Qa7(P!%l9`Dh3m~ zexO@TP0A}=3q_J2UpDo=kX+Q)sy>F z5$|UmAKd=%tZ}fd$A?1Z*PZ)J6m1ohJ^|@>GfzJHBsY$iISeQ}1*B5&4d=tFC6dg2 z!mFF^txv{EmU|wfj|pTqa`us|Z^w}y)NUD@{NR_88Y?-Vzbm){@!C&bLe#y|k0BGX zq->GzGoqR+Auo)nJ@@(ceZy6+N;SEq^kbYhQ*$rNz)G};s>*pri0g3d%o1ZOw3sbp&T9{yQVC7{}ZgD+7bUV z+FnyVfIFntMa;U&kCMI#GjiMabXZ9;VA&x_A(KD~ly;!G-P}sB26;P`F|y@Y705i$ zMc8`e=&EzcrE@*z(8cm7or9s{m76G*+>g7aHlKHgD-V~Up+%h6M0HmEACJ=mmZTtO z^%%dq6 zx7*ZlbLV5@O`?J4syp}*>@3Tt{PbR?UqE*;joO$H)qm1pbQI)kqS``Lm*UM}Zhipn z?Qg#CnzernlB?W&hgFzgUM!sC;qXz%)r^ReYY@YQzC#H6#lb$+aq~Pahtj8$^GG!` zP;IgLcadQ=eTW0{M;NCc-&&hG@f=P}0;5fNKs4#mnx8GWSyKS+SWqt=7n^d3BxrIKsY- ztcvIQ-D{93RfFLcm%vwnjm>Ll$&z!-@*i5NW$+u0V6pe`+RTY}R1?Lq?bvlFjU4hu zch%Yh3+%KM+T6I5N(cz1ZYLKDBkmHw|3AXsG9Zp^X%|jHfDkN!-~mE#CO~k95G=UP z;1FDA@WCNKa0>+2;4-*7!QGv~-QD%V&OT?K_x;Xy?~m0|Rjaz7yJyzaTF+B#LWn^n z-3Y8O*T@`&(i6qqMbz^%U=gDOK&8S-U%yy&4Z<{u^FDLEg8~ree>ehlvHA80bcc1U$tV=I+%@2>} ztu(lT#w^G13QFsBpvH$0rQ|TX{!JF-EpfcDprVZ$JjhaG5JW!*e^ zgQ*9ZpLFe;F;#kwQaDONFbnM1s$1t+g*oE?V+X4~tXr>=SwN%}v zv1Rc9ZO7fHQPrvP_z-m$Beq~Dz{UcPx;tRPa_WgpSv)=Vj0p!3z<#=~y*m+FT5O#) zYo6CT-3Oy63_p7MAy~rHs-lTu!hJpt^T9h%;Wcsy_q~CVc!A3*P(cAxPg$HBa>y4X zP8n$_Y@l>DU%B?2Q(nA6$}%h5JZ~n4;=wgt*Mn<`lHw!nsygU#45A9*F4cYC;4e?J z9Ii|C8=HdfWOY$JNJCNw)A^lR<;E+_NX$+X!m9K?p*E|4!r5?cKrM8{DsVqfYC1o& z!8GzkEYDI!knG!2H3p*J{?JkbPo7;vy>f@$Gt9^Lp2$`BcJ!Z0m~K202=e&%E(oM4 z_G75Qd3o*(vvt_Q`z%2A?{oBXVpdX1ntWNnkTPoSnhwP4;*$YnFyb>5S7rFt=`<(ktpCXIO&kT zQS_e>;1w(2Xx-N@v)?@Y&WDj|UL_MkL@CxDTe>;EBI7dC=O%eJ@VzfAz?q8|o85WW ziamja=juWtI5kP^qTQl7LF}!n8>bvU_E~HW1$F`F=V9jHGx{_w3T!ou4kLGE7+UyF z>_;P?*fBAu4VwYpO)^az5KM+z&8`9^WIV18Hg;8|P&XZU{v*;^IT{gG+G&xet6WJQ zIsT?nx%Pdv^(ts;>f%RtZasuPH*d)bP>}bz&TyLtBCv!|lh@o&R(i#PT&c%{`;UfzBoQ7VDKGO-J1X6Su8=&{0tx&r5!>h!*}=v zd#X=4FKD&`2;#17TLx*UMwY^j>N)@wNd%2!?;LbE=&}DD;Qx-)rzHMXcDVdcl&1fe zD4}{B*U9N-O{lddu?wNItjc$j(l)FAIxyHV+%e33&-#6KTAqz)0QU^0PTXzeS*+f< z#roki{N-Oa<~`J`SeJI6{NcWE*8)Sw1Rh@vV$TD@f71oQT#w<>@BNxD)`>1&%%tEE zrj*&Ur6?5@7mI^+>)yXG77t_plz%GdqEdKcXn0v`8P(QA-nEJMHD-#qfy<`E#to1D z*AI2RnH2xm?Nz7wWCEnP1)OWJ@8k^v9X+GBflKp+p9LG%=20DvYPB|O45SNoqs;0S z0}6*S+8sP5Zr0SK%Pyy~l60_Q#d$x!kr=sSzrL>O;6Mu>dM|Sk7vwJ16KbE8#&(u; zc>8Ss@TrAm+dhtxmAK{t`Sr}~6cam`;f^nHpyNj}6LSjh?m#>WWnJ?Ue}|1-Q90}g zLlam5wJQ=*_EoRV-5DGk8ZW?@sETvB)@CII*zfULz_QEvP{;P zkSsup)yrxw_&!Py#(|A%PuF{N9$Ul-gW;(4h8&dPF9Ou*`}G}P%Wg__9;aK!T6Sn! z@d*i>Z5W{poH|@b%#TrcX|$uoaLrbabo4D8nI`mpO0{bm`{grl z4`5#l6S38EV6+CVA7NMO(2})n-A@lOwTEyKbZwXXDO7OcBra{ z^*FjBNovLaJb;(p^*WVg>cmwNyDWufRyXZO?^A~#o<&e=4p!(6d96uX_auF7N%$1~ z&dgS~DRHf4iCy;@qKu`CHEc04xowi(=T|F4foh{TensMcT;lPKp=~S@+ZjJnuDOCA zkv06~SKn1lW7~jAnA>c);LLxvOxIv1N>jCK2Nw#lGbm4*%{5OfE?nGaHw>huDUOdo z`5z&lOiEk-^`v(*?x5EOFXrwuDh&+G=n=d1&4n3=y~$u{n#}jB`TvRB(Fvvq*-6+( zuQMpTJy%B)^q)EuilkR4 zAW}lLoEM*8XJAEIdx^eBK`)SiNq}B>WTK;>dpsc>4&7B8*wNjYJmkiUmrn1KPdJ@( zVdhCnTyA}D_H5y_x#VUYaDSGEaoU*zARHvN%l5X$X4B-(VBeZfo%z(Ge&xq91@(6G z@>PW%Hi)?*ldIbXDo92w8_l!@NtcE6Zw=zAU4IJo$yP^oLG`+PefIpyOnMb1T7|S= zGq8e(3Dvn-)N`AS4=~|%mAyI4)emBlB{E+{+fnxNCE&J|#@lF9)?Fj$UMBA7GQgQ< z#Lxi^FV~X{C-LZsA&2q8l4ua=GvJ_b;GjY{FpAyEg?QUTyjTMF&Y1U&{kVn8a`J)B znMtF4&kOkBWrZ2$CeuFYwwUrjqjkxx=nU6H%mA4FS4EIsaIUQ|Wr_c?Rmj$-;D*!? zu@3m;SL+||2?y3uctTG{oSKpHM>e>r+vos>Nx?vN5fBke>9kZB5NZh8SI{r#Vu9tq z0PRhs{ds`+XRd=nEHerUlg`gV75G2alYvf}0LtW1nF6`_or=bu46UmP+f*RKQl9G8&x5G_21m+VbA!~@+uu^L}M)*X@q$r=uMxExxE0WM{) z1Awwb`OjhNl!0;LkdfWkakE}m#)^_~K}9y@q|Lw@0eq_1xHew#wZT0{tH zh8Gxe`8Z;IMn(72sOsMZpl-Rh#ED+EJh|C5R1R!hoC%^~QXe7<(Hu+C8&A*BbpF~Y zorZ=T9ZT5W=62xL8S<4iZD9o%#Whzc4llcvaJXpr`D=7(6c(LiAiR>LfH0&>5heW6 zen)cQEUZk}BmOmj{E`9N-i;w6Xx55CK!4+GelK66W9>*{%!?vKXuDsVj{GP!lmAN0 zEsj9jh)OyyXS#REaqsSg5&^uF{_*y=aQ>Ffc2BXtP@|LMu9f!XryTk&y43UA8p-l} zciUUg?ye*BE)BBmI4wLxH+?@uao3eESZNwnGb>feznSh>zC)#0`5h8CyR&UN`@uHe zeng%#apc#w*fE=ZYz=Kq-%NV`meu5D><0@DqP|@nE|O3mY&$DQU;Hn0`X7HF>8qq{$hevb>iP_#l`|j6 z4>-f@yGr5*FK}D08HNX?YYNc{d-@+->|emzM?kCZgHr9GVLTYHJ@!r`TB(rb=mbAj zVDp0fh!^_ZuB<_SM#AoJ;-D@I_V$!ocaF&(>?-e#~;D8_hyjBztWnT zs2+#W|D-kdxlx1#-?oPaM`9KS3;WC0EoG=h;ehNBrx3#omopA;wLb-krm|j$p#I#~ zmR?IRaf^kfZtP=yp7e|B`bAS>s#Pdv^1>`Qn^f6qeb*H$v}Egg&`2#G61RR_EjMAu zzn$6kOD0P^t}^THjDfer$bptKJfjO4o7vkSsNshy;L~NK@Y+J1! zyS!AS%%nUpl5n>{C-o4`YAQ@&aS9QVBxgt39%12zebPi=zR#|DRwi(M1S{N#Gd{!e zP=ZqGk|$q(I#@K{f7^mJ&{$8Ahc!;rdn_3rl271boM2mTI<`$=3!|O2-h^h`_GG|4 zhUudr*AkT)HL8yrU?im4mgR8+qj|6~q?t7wmL}RdTdvvmsS9wC1hAQQP)BXM&d^6| zmnZGj)O$c@x95y4<~P*tZQKWIrs6Udy$x%W$bH??Fw;jcep}N&-OItjbbS5kkm@nris2I}^TpEN`a&-HB6Z3M1xuPiaeh zP3e312ka5EK5qUpfY?(pB5F;GN#L5nN>#;8|2_ZA*?r{4RcUF-^QDz9Yl01Gv-~g4 z7_dV18wYata>baUKCTLkj7gub8b?HET4#QqY_sWmlCKjt*_M|dZSZjwAkA{wpJA?; zSEf*LS(a3BnQpFF^>ECkDhp4bfxltM4+p=sCk8KnI0*D9k)A7)s5l&F&U6I49*F=) z8OH}KRz=C%(RZ9RkNSvD$PYLSbGxSKqtLnb$f)h$ZSDG%R29zhv=m-&?=EWe4~DoZ z&l9`d8yW1kgX3DT0$EV`o7AFwC&cYWmfM#j2<}lqMBw4==3f-Wy7wYw8zD8LX;0T( zkPKp*`O8W=g%}Dm%LoP#Vu4n2E~vQ3-JYsUC11I(S3eh77mpL~q%nX50Irz;VSgfF z6w-C-8sWL7{wu2D!f2te@?2d~)1?c)aG6gjWh8MY$hL;}^~`POj{ee8`;xr$=O;Fw z8Ao22;pnf9kf*v59X5E|RQW!2Z4Vi224Y^aF>Ye%jkRmK$cn#RR^dBJTqoTcncqlb zoAFBhp$W^@N~>-w-WuYX9oE+H((i3H9X2arOH<)nxHO}g?fNZlc={Y2X-3q1Wk>6c z=vx^7IbM5D2mZMq7TyezOOSo2Rbl%sbzV}I?d$b^C2iH%_TrjP0=)o6odM^A?j_~j z>XWe7ZKm&32RmlDINSLcOOG6Exu|fBG*$>33l}tl#-?Z1uVM_4U0H6Y9TbB@dUQY{ z-@Y0go$4Lf%do><5-)bIT+4oRqt~0DEddEEY<&~Xr)u#bvdcQw>qx5`@!a|L+4nb6hLrovR)mS_l{F4qY)CTU8d!xHEeg z3j9*=#JTS09B@jA9J7|w2Z;k5-;jy!NBz9`STfhy2!EYKEq@l@l*^o$lI3$5ZS2}^ls~2}Y~jtY z@m+>U&w|EZ*5(Fp_0%DUt;XA;TQBdsQI2CN>-uU3FqGaJ@L5tkFts0~r3nTE~;!B!0M4 zk)JD~DY09Ut4uK)VOnJOr*AQ93GmxB+7|k3#b9IB@pudUw4lF{;o%!u=kz3}iRmHL ztb&)Fv%W_p&G0*O_x)Fk)Z zG`%WZ$5o+1BDuQnsrzbdrrYB{f<`_}pr)623|^cb8O$lZAdbbyUExK2+_U7me$eOr z=$a6%kz4wctuvQ$Z+>Kb^Ai`LO6KL zN_&?sq}Ydj%MW}K-#5B z0ii|3uvYymn=UE3)r%^328y}O%r@noO7?~P13vhn%TN{tR#NX4<5Z;q9d_qzy6wc$ zaVj(3zEcFEz-8#G>&{TDb!59FMXnG2(_6A9ItK^b&NhLnlD^VeT8WjTY34Je zjA2bd#!1Yn`gGNMHCDGA1i;x&b+HEJkBOYhnR5@9+YCpF&v&JZlv@TJPWAV0&|hj5 z={d>_d<J87n0TEOYxHiG-fgTtUI^xVpXNCOCxlQY)L8|GSPd6=b}^OH)! z)Akw8#$d&V2N&)-XWj(9qD9<#Rqd(^5uF*2jelKv-rMH~=e1#3I*Y0%u!=W$kQ>H4 z$eABR(BBV^aUQLnJ)A`uJ?QwEImjVqkA3JKL>0{s2J|csBGSh`lxv2q;IIcb>R%sB zu^z4XAFa*>tgey&f`g0(Az1(ST4j%j+Z)kD33Ws;;(yjE^P|X|vtp`F-dssIW>B6x zMQKUKe%>THDS;$1RJgW&`VrN$oMxvDIOFP`+?wWg>bk+Q3yoX7ba`9_$Sql_D`zx9 z(Zd6C#}jWi7*(skQ@#}Xi)vf=4=p9|VK}Dnrx4lfrq7Je!>PyLRNH?eL>`7?yK4U+ zM3ny?O8z&5$l_ni{<3q_3I1Q$+=t;_{l=decG*Ak=zo!|r2WtNc(DhS(Ek^ki}`nr z-l#tmD%NH*_IF!nkISYI29#TtC;nLrcoQ{@l={)lX(UjFRM((nX350+ycKx&Gj{Xw;O$3jd^%|1*NmX!3jCURU(|)DAPM-W2P5r@kYDQmw)o zPWLXfR6MSVtXe03ZHq1FSmN%<*EkT9DccG8z%hn8P8!6iU4AOt6{9jSE=|4KrHWhe z?E8#Hn{+^YT9vp}DGmoMMElLdCTfYQtxstty^8Je%L4Ib^qAM7&$5J@XNY={LYk*ND+H(OMpGLdu(w1Oj`tuiq_ z@a}7?4Dv0@*`ZgvPi2ezx;Z%32Mnsnk-#M$#5F0ySf>oMly-Pp5GE~REw6SFQzl8D z`$Nz!!I_gpp1=V8b=V0mn;?3Uwqqk^lpt}i*!awD>8%fv)x|r&-r!SAdsZcgKD}hM706n~hM6fVXNFe~B2i;N z>E5IGe&CJleJkEezCjX^3w0*JBdoX(()9nz~=N zi^l}dhzFBJ^qtWRQn${3zFnI!Yr1Z~el2@PS_h6uJI^_+lf}7bOclZ#&3YRAeGRwM zx|u|UVCC0IqjX@>1=F5#B#Ep$(#SHMm-sEeSKydHVJL9QVS+v{jeX8d%UO&%hO+;o zqyy*NAX7KVS~I4N9$#WsED&+~N8kXvsT0e0ToKDnBF^J`Ev`dic|ELk*Pyw(FZ*l4 zC{8hBd32!#OmKUqd3#GVG5jHV(07b}BpO)}>ExR+H zxvUanI8KSF28>T>8*_>D4Jkx1*27%Pefea@J`<0FQ7=Pzoy}L3sqn{G8n{O{zW`xzoQ5Yi8&^0H4-4A z#GaSD@a`;()9pn+jBw#aZ!@NA&BN6Jir+r6UL(?SYcR3=^E#{9!z-FLDh00D(43#Y z|6M{c$(*I`)K&DfBu}4k1y!HYEb!^)C8|UoYW6p5yI1d=oB7(@c7K$8R^@<~WYoO4 zY^phUPePouPcFiu8%Z!M5EQ!-E`sF9$-JfT)2$`a-&vHL@TY9_NfHugh;ieA<2IAO zsaw61bn0~T7)s0wD}H2ZGW1Q1^B~BkY=VKfE0uhgypylqCwH88m$Ad-SH!oU3q`>0 zYr!Q+m0oAHsK&qWarVQ`u~O~(--?||=iNN92X1@_q5EAs=Xc%@OY9iqs`tD!cJ;Rp z6flv88qyQt>~A93PoR7c2LKBRGXvyi!$-S`t;J5DS93yf?_`5hl0O$-BozATDqXIM z2g-T>#(JTIaMCBQjX+vRcFB4ef1c-}P7Hjaw6Dv?nM=w7XMn8A2e$#kb3*$fg(LMP zQk^6Wcx9(bvbUI02kv;1t`-2s-rJN%wTrAqe#6EtCE%oa%4Jn6*;UultzQ{-M$8S>dC3ysd2&f%;N-R@!BTK&$WZ3XwB8p#weOczW};yuS*qEx z2$$F?gI|KTkK$TzM+@vy+Nn;Pji-I@IIlK{c(>1Zfcn+ljBoTSkan@l6%zXe zN94PDzQ=SP9VKu5fTk7-wXU~-U*8>yUXtF zpxh|B9Eom7tRIwAPESd0B1>%a8(%C;AgSU8Egru5g z`<>cl)!x$Nn{%WiZNIAWnw-~VgGQM3RnK1U+iAhK%t6X{ezVFSH#JMC_`Z$!hm~mGgRL#i7kEBf=)|7+K-ij*lcp7$-&i-i$CmCUgTcC~@XBf7*%L0YB&^ zd0pRiWIG2@q#BC|u50~qalVXf7_Cw~QQ;`$);uqlLk&eqyNIt84uO*t2pHiuJTAHP zF=F+Ia)k6i`J#RjqEBr3`_`GO?iN_^anP@;)+9+dZ|2D|FGk)Q>`=P&HeY!Zt~;Qy zSlMoaaDD`1Zk9VidNZEx6CHG$}>X%TJ9bb#RO!&8ye zbw_&b4Xx%;`enwpHd9GXy0F9Sux-DuwFX@M2&b)%b;QPV!?e+rIrf!WwobRUr6yQ) zc5D_?b&lFu@UC=6$)j;=^Tn*SoJ9(FHid&;97h)sadCacELZ8w-OyswV*l5-&!fG5 zpchgvztdj^K+V-00an^UtGMA~(NmwV>=w(bWS_q~?8QXI-*L+7_5;vBNq@MPXY zM+r?&j!Z{D8@$A6n~1MZ9i^V{#T=(WzJA(u`ZD}w9X*VrFFwS=Zfm#cprSLH-U06R zC8S1l&TY6Za%uO=F({yNpUon}0Y33~uHL6kI|u#ioOW&3{V#gR5l;KedqJr&U_@ z&YjWc7wYmX1aCwdHAds*ahpZSx7rM5E*+BF)7&myjblN8z9SbVyxd%;_$*bX>=M=R z)!k%wr5IQ72#fvXU0{o#h;`De-H z-=%WZABTn`=+$-)qKQ9L@KOJ(md(bzAhW8R-tb1NnF-x*zHj(QUWLHuu7(Meb2XT#Zxueg4cWpL;*Hgypy!Z}Cr&H;Q% z0Sc5{>9?oE?d3_B<95*<{Gw~2XKFpO>NxI0yDYQsDrIfGW@;YV z+%USevk*t;F5BO%kzx-*?uR!0nB?9>s&;(XOFYOQ)8*0+EpY_h8t||We$cHx=$IdL zv=4pHAC5&I8rH+P&_iRIea9j8;5P{J1OBM@d)R;bo1K#XK_|)4NuN%%f;)(Ay*-3( zeY`o|**8;LKV!!M76PA3144YfrAzHQ68m9+wWP`um22?Ru?#NmgWkS@cz9sXEfqpz z{JY36qSjQJhw1rT;J$zpLr2aYCGK#u_&`QJD}{ha|L4=(ITRxUHdJjt1LL$N8nIhB?Y{H}_3EiCwep+3nly^(94kq~4tYLxT;J^NUkfIpX=NBs}Ux z+j4&l`_&ygSc!x>$EH!w@_q6kEh&EKovE9XQBMSub(i=p!*R^6`MPvurK@thkId!r zRkynqJa9@^^Y^4*jlPMTbKbQ>p5&`tkb!Ntb}-6GazOc1*<|i?kbNn;-nikiF3ePM z#}FKV4(ofYM}%15qN`c?Pg&VZ)@l%GJLTsk zBU0AeQanF3t`M(NoVEZ@D^6b)bM{abN1rF2PR1m^9wy%$QiCS2)1X&Zk-uuH(3P|r zuz!k&xr)FWps7S6BW$HdQd9Iz{ceNv=~Q^Y#}W$98EhFS#WyiQk}oLkr#4T;$Q^bQ zVmV6G+@TQ958_KNlkQh6KWo)P$I)`tqEe(vJ~9M8iOvtvgRitnn#U)+QH0-ET8V=d z8#-?C&rtucz>?Sn2W9&L#_&iXdFC5$p`8e!Tl&{@E$r|l%tFH8{(+5jpdg(k(XAmeI>W{ zsc85a`Po^-smW!n@s+jmyKxH@pkb&_p2X7Vx42I`L_ZC95KNyHqk0*@BcHN)Ojc%{ zOV)pCC3`WCWw}?FHT{dbZbtYuql2*}-N&7+k0+ybe$TfVIDPntaX)BI^#m`*VwCZ`-Gzz(Lukow_>5A^|NGs~B)7b# z{NHqlJs}!xu3q1e$h|4^@*K#BdfyQvoYD9!kIsSc+22H+v9kKudDFkdu&ZB90LGvzOxhjeB)xc%X;lcHs!W9p?{twVkw3a5tee! z>o5Q``p}7%)HPvqaoh=BUmyHA!62XN*n8jaLsNKPw~cxvbvKbE-z#FA@fv2Pk?KL={woqrt4T97T#wXkG<1(PP>r)MVH3I47E z-a9ZUT5EEy#@|mzDPdP)WJPV-hk@9?bbQw&4jJj@Hj1^}mQiA<#=@<$$Vq96yQ=mp9M}#kWr(8gX%z<;(SfYov7e0C4jni+q;dHj(9J}LQ@Wen{dWdpYwkwRs(OGvt9Wk-q2 z^|pX^1)EbH57)CUcjn~rJH>5HHzWbxpIkmQ)?WnAh`G0y^|!XH<9Xso*`QipHBl7g zh(YRaNv{3$bnWErY!xOZ9nrS}ez}Bi@~F%5vNQn2sO^FiCsGQ`2VESb@(R4UxpT~R z>X7U*^btbLatzzQ^o66;!L!)&3OKel(hG`@t;g)PDtroYw_CU3U}-;V+WUKe%G(wF zz^I4rv46Vj+l@iY(Ci%l)dN_Y|KhG+86TwVYV@bagiK%XdZ;>caSdc_NL*8I{akTk znW!1ifqUg+dF?oXr+V1uc?J6tdzdV_3-1V%_j)Y ztd*Z?8Bu;+AnfbyEBi{4&5h(x6Y}qSH06iSu8rAMo zSdhvrq>5DNha0E`)0xO337^!xBkm!_NPIPrjE!`#Ls`u#bgZF)$vdAoWf)U{N0h<7 z{C4|k&9NDKDSk4t4e!y^yDwMJaBVXP&Pwn`o%j*dmx(~> z?R??6vN?T6)VKMS5x^fD`IRDb2gb{X-)(*Rjhk;4ZgX_%YHm-L?-s*c9IG11Zzm#d zZf=hc&-R4d4ta`QEPs229$?U%yjuFg{E6K5HQzzgw^yNLF_su_3p|?8KJZ${2z^Vw z&~Pao61yO~cK1_FHw2mKcWy~*M4b>VX!@u$5Z@B^I8A2SUf#XHnpepjP<+p|H@Pv) zcmHE_W}1e$hP~&ly^YHyTcsImTTu_+=g~KbEG;^8#Cv;ji4Kd#no|$CdJyfb47tI;q9g>;s3z*6S zKV$91TFXKsbt%r3J-nZI?bQCZr|!Is+3>Z#*w6g&z|&jEiWQP*8H->_C@HxfCOL5< zsy^u|!D{3L=OW7LEm4HR-1NvZy!()_`LIzQfBDZ$J-4~~X5FpI2yL|m@Zo{eLd+$u zl*X-ie3MsvnCzvEC*7gZ=&!x<`;BcwO~+Q3)RTi>>(7a&kJ%AM?kPm8xvoHu>!l!`7gN0P6BkbP`Svn+$)AWVRX zfy22npWzThN=89;qr=NUz zP1MBtQ1240RWfJ-o~@Kwz-&K_d{qy7D;!i-b2RZv=zXcHvbD-G?(5}t!=zq&B1;(?>DAAhaj`~($PWo=;uzWSI z`-EFc!R&MS+~aVki07DTZl^nl^5v5{Lv%1Fehi6Lqb}0#CL(C2lW8cwy;%Q2Gn33E z)Pp7fqJmq2z*?Ev?ro^TV((*QmYEiq4JLO|bfSF+$qP}Jn9(R*BceuZ&0m8vLmb8r zT{;O7Mw0MDt{1as-FWU#mlv&?AS9%Fs_Ti(Zg+RpG4rGly{fNq2vk7}*a_dB(LYaA zefEY_TA1i9FE6k2ug{ntVmzPX{aT#zB&c#Y83N31W&>S$P<<=|LU}J*MsIe1I^l{9 z$2^pKOlZ@_6%C(g*ERQ5K>sRmUI#Ohd zuBp-zF;Q{iDYVBNid*Uv1LuU_87cek7dIlk=PlyZLCol zRni}52m-Khu9&s62Dv51YyMPNHPq;v3EH07Nr<51_-VRksIYFho-S2Qzy<8>+aQ?W z+?rX5WL|C0*O#`DlpooesndYi_MF(HZAN<`GFA4ejIiZZLvT4@(4ZYAfyw4`2y-{7~m@ z>Bc}_9{24V^0;@ETXE>}^_o%@5KGeJHk|c&UGZ-FVqMn5Xu?^W$jSD=-?47Z+fz^T zJcF`~5tEg(1&upwhz)x(LwAkGt#z!ICEyjAy;nDuQ-smPbhv5f*T8NZBjq3R1fl3D zBHXDv-0ed8+9U@%ra}t4Tk8QAgez&r&|tZJ(T0pA+|7llv9t1~ypVRn3tUIqm))Z7 zH2~L3ofdp9?EK!u(dkHmwMYAEV?ncbD@`p?@ZN6@P(&MZf>36^@d5^t_t!_?3N?wp ztJ$E~3Lb$*}t9iaZ_0=y7JD7~t3N^m{= zNfX(9B>ev4`+X2;L(|*61;U1AoDT<8UdSulUPL$7FHSJDoA5^a4{LnK=ZB*DD^Ze4 z$?2~b`_l`Yqsd!VksBlE_65IDM!Px#*+jT3uh&ccO%kqCR(Y^?Fw}ASJj`cuyJxeO zMH_#Pj76j-A6+-UY%Ta!Rm=^cwc;5eZqR(kHcznxI;N+Gh&S@wKQ8e@Bvrl4qWx#_ z7JZ*Tkzkcg7p?CKX|D-DGDE}bH~u~tA4Tp1g(-#Ka^P}sqLRXtLr*4M*WK@%?1W*K z&+mehc%yx<0Fs15^A4HUim0NWUJzzvu5y0EElRR6nzin!KHtBtSdB?Q>^(%HC~05X zc!QR8gJWW8!CHdAdl#dE>+E*F41lk7ISB*Kv zcc52NLFU8TJE2)o2lJX0YV-WJw}+PoqHd0kcb}&5BI@prxt*^Lpg0}#D0p96@F5F? zH25#7DG7ePeE4{IUiR)c_z9ZR!f#>~OVqcO7&Bg>?j#M|zw71JKOQH)P>+mc3wW>J zN5LC?vaPpI&O4yMH?zov(2<^8h#@dk!t8qHzrtozEmU}3PgUhD&wV5Xud;7}z`irHc_)r9KV=QVYB&1n!g)OA z5|FH|*=rfI{9Y7C*tNi`$oHbVmN&jqfpOw2zB>(-o;Q4#z4P=A(8sdl+deJ*4j3^p zt>H*b&6`tqe?>&Q|Cu%9Kyd0W$k3u_xAlYzKLDATdkas8(Gha}EfHD+$ znO5&Zp{z$CPar1?ukzgbn%@A%=doWPd|3VrG;>wT*VHpdJvlg2sDDs0+Odsk za~awHDhfgc=AVY;GgPxF5CZnW>V5-zoTF`Hc6c8Onw{+!i{(v3@?KqC7ZgE7VsqvO zpr5Q5hQ4rL6f`DSeOUO|8WYgAqlUj(R^t*>j?57wSiKJD&^pth521jjFyH~1J_mO~ zU$f*Fd`vrXiatjp2z}z(eXW`*zZDi*RkM=S&3wP?QNW-oIkGiPv8Ui$5(tRHv?6aG56Fb?upL4OLvUCR|w~rlXO?f z+}0)g?IrX1B@!At_D(*EcX6yF^8+Mv?k;Yw6Rl_V-)F1?##5edSDWi+m~^uigstQz zyRVe6K>+<3NXPJy4po`=tPtmZJDkcujZ3`%R_WOGdbDbNenbAUi(nUr7%t;rxWA1_ zB_kxJll~*&xx{rN#xbx?f!Bnvl4zYUfXAReT_K?mTMuGGCDpOD9z^Kc=x^qg*+tvm zY-`OT$gY%rjnQ-GSt-N5w8CzX%CV90C2VsAlpw`J?!FN4hL$;TM&<|lMCoh_<<5?u z;2AheVUeq)Lvf@J!h^PghwU3c);N8wmtv3ALj?L}AyP1gnbEDvy@G$8p#@7rIRb4` zkrabGP~*iS0rLlfEh_XlF-0!Fnk?fRX9z-bX9%m4L?(esTrP9jGVe6*G(@tnoRk

NL-P3%9D%iQ8;QG$H*JItN&6e}<_4 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 literal 0 HcmV?d00001 diff --git a/build/NUGG_ABAP2XLSX_V_1_0.nugg b/build/NUGG_ABAP2XLSX_V_1_0.nugg new file mode 100644 index 0000000..8a10341 --- /dev/null +++ b/build/NUGG_ABAP2XLSX_V_1_0.nugg @@ -0,0 +1,15306 @@ + + + + class ZCL_EXCEL_STYLE_ALIGNMENT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data HORIZONTAL type ZEXCEL_ALIGNMENT . + data VERTICAL type ZEXCEL_ALIGNMENT . + data TEXTROTATION type ZEXCEL_TEXT_ROTATION value 0. "#EC NOTEXT . + data WRAPTEXT type FLAG . + data SHRINKTOFIT type FLAG . + data INDENT type ZEXCEL_INDENT value 0. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +private section. + + constants C_HORIZONTAL_GENERAL type ZEXCEL_ALIGNMENT value 'general'. "#EC NOTEXT + constants C_HORIZONTAL_LEFT type ZEXCEL_ALIGNMENT value 'left'. "#EC NOTEXT + constants C_HORIZONTAL_RIGHT type ZEXCEL_ALIGNMENT value 'right'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER_CONTINUOUS type ZEXCEL_ALIGNMENT value 'centerContinuous'. "#EC NOTEXT + constants C_HORIZONTAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + constants C_VERTICAL_BOTTOM type ZEXCEL_ALIGNMENT value 'bottom'. "#EC NOTEXT + constants C_VERTICAL_TOP type ZEXCEL_ALIGNMENT value 'top'. "#EC NOTEXT + constants C_VERTICAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_VERTICAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + METHOD constructor. + horizontal = me->c_horizontal_general. + vertical = me->c_vertical_bottom. + wrapText = abap_false. + shrinkToFit = abap_false. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_BORDER definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +public section. + + data BORDER_STYLE type ZEXCEL_BORDER . + data BORDER_COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_BORDER_NONE type ZEXCEL_BORDER value 'none'. "#EC NOTEXT . + class-data C_BORDER_DASHDOT type ZEXCEL_BORDER value 'dashDot'. "#EC NOTEXT . + class-data C_BORDER_DASHDOTDOT type ZEXCEL_BORDER value 'dashDotDot'. "#EC NOTEXT . + class-data C_BORDER_DASHED type ZEXCEL_BORDER value 'dashed'. "#EC NOTEXT . + class-data C_BORDER_DOTTED type ZEXCEL_BORDER value 'dotted'. "#EC NOTEXT . + class-data C_BORDER_DOUBLE type ZEXCEL_BORDER value 'double'. "#EC NOTEXT . + class-data C_BORDER_HAIR type ZEXCEL_BORDER value 'hair'. "#EC NOTEXT . + class-data C_BORDER_MEDIUM type ZEXCEL_BORDER value 'medium'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOT type ZEXCEL_BORDER value 'mediumDashDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOTDOT type ZEXCEL_BORDER value 'mediumDashDotDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHED type ZEXCEL_BORDER value 'mediumDashed'. "#EC NOTEXT . + class-data C_BORDER_SLANTDASHDOT type ZEXCEL_BORDER value 'slantDashDot'. "#EC NOTEXT . + class-data C_BORDER_THICK type ZEXCEL_BORDER value 'thick'. "#EC NOTEXT . + class-data C_BORDER_THIN type ZEXCEL_BORDER value 'thin'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + METHOD constructor. + border_style = zcl_excel_style_border=>c_border_none. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_BORDERS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +public section. + + data LEFT type ref to ZCL_EXCEL_STYLE_BORDER . + data RIGHT type ref to ZCL_EXCEL_STYLE_BORDER . + data TOP type ref to ZCL_EXCEL_STYLE_BORDER . + data DOWN type ref to ZCL_EXCEL_STYLE_BORDER . + data DIAGONAL type ref to ZCL_EXCEL_STYLE_BORDER . + data ALLBORDERS type ref to ZCL_EXCEL_STYLE_BORDER . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_BORDER . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +private section. + + constants C_DIAGONAL_NONE type ZEXCEL_DIAGONAL value 0. "#EC NOTEXT + constants C_DIAGONAL_UP type ZEXCEL_DIAGONAL value 1. "#EC NOTEXT + constants C_DIAGONAL_DOWN type ZEXCEL_DIAGONAL value 2. "#EC NOTEXT + constants C_DIAGONAL_BOTH type ZEXCEL_DIAGONAL value 3. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method CONSTRUCTOR. +endmethod. + + + + METHOD get_structure. + +* Check if all borders is set otherwise check single border + IF me->allborders IS BOUND. + es_fill-left_color = me->allborders->border_color. + es_fill-left_style = me->allborders->border_style. + es_fill-right_color = me->allborders->border_color. + es_fill-right_style = me->allborders->border_style. + es_fill-top_color = me->allborders->border_color. + es_fill-top_style = me->allborders->border_style. + es_fill-bottom_color = me->allborders->border_color. + es_fill-bottom_style = me->allborders->border_style. + ELSE. + IF me->left IS BOUND. + es_fill-left_color = me->left->border_color. + es_fill-left_style = me->left->border_style. + ENDIF. + IF me->right IS BOUND. + es_fill-right_color = me->right->border_color. + es_fill-right_style = me->right->border_style. + ENDIF. + IF me->top IS BOUND. + es_fill-top_color = me->top->border_color. + es_fill-top_style = me->top->border_style. + ENDIF. + IF me->down IS BOUND. + es_fill-bottom_color = me->down->border_color. + es_fill-bottom_style = me->down->border_style. + ENDIF. + ENDIF. + +* Check if diagonal is set + IF me->diagonal IS BOUND. + es_fill-diagonal_color = me->diagonal->border_color. + es_fill-diagonal_style = me->diagonal->border_style. + ENDIF. + +ENDMETHOD. "get_structure + + + + class ZCL_EXCEL_STYLE_COLOR definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +public section. + + class-data C_BLACK type ZEXCEL_STYLE_COLOR_ARGB value 'FF000000'. "#EC NOTEXT . + class-data C_BLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF0000FF'. "#EC NOTEXT . + class-data C_DARKBLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF000080'. "#EC NOTEXT . + class-data C_DARKGREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF008000'. "#EC NOTEXT . + class-data C_DARKRED type ZEXCEL_STYLE_COLOR_ARGB value 'FF800000'. "#EC NOTEXT . + class-data C_DARKYELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FF808000'. "#EC NOTEXT . + class-data C_GRAY type ZEXCEL_STYLE_COLOR_ARGB value 'FFCCCCCC'. "#EC NOTEXT . + class-data C_GREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF00FF00'. "#EC NOTEXT . + class-data C_RED type ZEXCEL_STYLE_COLOR_ARGB value 'FFFF0000'. "#EC NOTEXT . + class-data C_WHITE type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFFFF'. "#EC NOTEXT . + class-data C_YELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFF00'. "#EC NOTEXT . + + methods CONSTRUCTOR . + class-methods CREATE_NEW_ARGB + importing + !IP_RED type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_GREEN type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_BLU type ZEXCEL_STYLE_COLOR_COMPONENT + returning + value(EP_COLOR_ARGB) type ZEXCEL_STYLE_COLOR_ARGB . + *"* protected components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +private section. + + class-data C_ALPHA type CHAR2 value 'FF'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +endmethod. + + + + + + + METHOD create_new_argb. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. + +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +public section. + + class-data C_ICONSET_3ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '3Arrows'. "#EC NOTEXT . + class-data C_ICONSET_3ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '3ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_3FLAGS type ZEXCEL_CONDITION_RULE_ICONSET value '3Flags'. "#EC NOTEXT . + class-data C_ICONSET_3SIGNS type ZEXCEL_CONDITION_RULE_ICONSET value '3Signs'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols2'. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value ''. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3TrafficLights2'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '4Arrows'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '4ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_4RATING type ZEXCEL_CONDITION_RULE_ICONSET value '4Rating'. "#EC NOTEXT . + class-data C_ICONSET_4REDTOBLACK type ZEXCEL_CONDITION_RULE_ICONSET value '4RedToBlack'. "#EC NOTEXT . + class-data C_ICONSET_4TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value '4TrafficLights'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '5Arrows'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '5ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_5QUARTERS type ZEXCEL_CONDITION_RULE_ICONSET value '5Quarters'. "#EC NOTEXT . + class-data C_ICONSET_5RATING type ZEXCEL_CONDITION_RULE_ICONSET value '5Rating'. "#EC NOTEXT . + class-data C_OPERATOR_BEGINSWITH type ZEXCEL_CONDITION_OPERATOR value 'beginsWith'. "#EC NOTEXT . + class-data C_OPERATOR_BETWEEN type ZEXCEL_CONDITION_OPERATOR value 'between'. "#EC NOTEXT . + class-data C_OPERATOR_CONTAINSTEXT type ZEXCEL_CONDITION_OPERATOR value 'containsText'. "#EC NOTEXT . + class-data C_OPERATOR_ENDSWITH type ZEXCEL_CONDITION_OPERATOR value 'endsWith'. "#EC NOTEXT . + class-data C_OPERATOR_EQUAL type ZEXCEL_CONDITION_OPERATOR value 'equal'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHAN type ZEXCEL_CONDITION_OPERATOR value 'greaterThan'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'greaterThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHAN type ZEXCEL_CONDITION_OPERATOR value 'lessThan'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'lessThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_NONE type ZEXCEL_CONDITION_OPERATOR value ''. "#EC NOTEXT . + class-data C_OPERATOR_NOTCONTAINS type ZEXCEL_CONDITION_OPERATOR value 'notContains'. "#EC NOTEXT . + class-data C_OPERATOR_NOTEQUAL type ZEXCEL_CONDITION_OPERATOR value 'notEqual'. "#EC NOTEXT . + class-data C_RULE_CELLIS type ZEXCEL_CONDITION_RULE value 'cellIs'. "#EC NOTEXT . + class-data C_RULE_CONTAINSTEXT type ZEXCEL_CONDITION_RULE value 'containsText'. "#EC NOTEXT . + class-data C_RULE_EXPRESSION type ZEXCEL_CONDITION_RULE value 'expression'. "#EC NOTEXT . + class-data C_RULE_ICONSET type ZEXCEL_CONDITION_RULE value 'iconSet'. "#EC NOTEXT . + class-data C_RULE_NONE type ZEXCEL_CONDITION_RULE value 'none'. "#EC NOTEXT . + data FORMULA type ZEXCEL_STYLE_FORMULA . + data ICONSET type ZEXCEL_CONDITION_RULE_ICONSET . + data OPERATOR type ZEXCEL_CONDITION_OPERATOR . + data PRIORITY type ZEXCEL_STYLE_PRIORITY value 1. "#EC NOTEXT . + data RULE type ZEXCEL_CONDITION_RULE . + + methods CONSTRUCTOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods SET_RANGE + importing + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data START_CELL type ZEXCEL_S_CELL_DATA . + data STOP_CELL type ZEXCEL_S_CELL_DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + rule = me->c_rule_none. + operator = me->c_operator_none. +* inizialize dimension range + stop_cell-cell_row = 1. + stop_cell-cell_column = 1. + start_cell-cell_row = 1. + start_cell-cell_column = 1. +ENDMETHOD. + + + + METHOD get_dimension_range. + IF stop_cell EQ start_cell. "only one cell + ep_dimension_range = start_cell-cell_coords. + ELSE. + CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. + ENDIF. +ENDMETHOD. + + + + + + + METHOD set_range. + DATA: lv_column TYPE zexcel_cell_column, + lv_row_alpha TYPE string. + + lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). + stop_cell-cell_row = 1. + stop_cell-cell_column = lv_column. + lv_row_alpha = ip_stop_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. + + lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). + start_cell-cell_row = 1. + start_cell-cell_column = lv_column. + lv_row_alpha = ip_start_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_FILL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +public section. + + class-data C_FILL_NONE type ZEXCEL_FILL_TYPE value 'none'. "#EC NOTEXT . + class-data C_FILL_SOLID type ZEXCEL_FILL_TYPE value 'solid'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_LINEAR type ZEXCEL_FILL_TYPE value 'linear'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_PATH type ZEXCEL_FILL_TYPE value 'path'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKDOWN type ZEXCEL_FILL_TYPE value 'darkDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRAY type ZEXCEL_FILL_TYPE value 'darkGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRID type ZEXCEL_FILL_TYPE value 'darkGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKHORIZONTAL type ZEXCEL_FILL_TYPE value 'darkHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKTRELLIS type ZEXCEL_FILL_TYPE value 'darkTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKUP type ZEXCEL_FILL_TYPE value 'darkUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKVERTICAL type ZEXCEL_FILL_TYPE value 'darkVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY0625 type ZEXCEL_FILL_TYPE value 'gray0625'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY125 type ZEXCEL_FILL_TYPE value 'gray125'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTDOWN type ZEXCEL_FILL_TYPE value 'lightDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRAY type ZEXCEL_FILL_TYPE value 'lightGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRID type ZEXCEL_FILL_TYPE value 'lightGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTHORIZONTAL type ZEXCEL_FILL_TYPE value 'lightHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTTRELLIS type ZEXCEL_FILL_TYPE value 'lightTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTUP type ZEXCEL_FILL_TYPE value 'lightUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTVERTICAL type ZEXCEL_FILL_TYPE value 'lightVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_MEDIUMGRAY type ZEXCEL_FILL_TYPE value 'mediumGray'. "#EC NOTEXT . + data FILLTYPE type ZEXCEL_FILL_TYPE . + data ROTATION type ZEXCEL_ROTATION . + data FGCOLOR type ZEXCEL_STYLE_COLOR_ARGB . + data BGCOLOR type ZEXCEL_STYLE_COLOR_ARGB value '64'. "#EC NOTEXT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_FILL . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + filltype = zcl_excel_style_fill=>c_fill_none. + rotation = 0. +ENDMETHOD. + + + + METHOD get_structure. + es_fill-rotation = me->rotation. + es_fill-filltype = me->filltype. + es_fill-fgColor = me->fgColor. + es_fill-bgColor = me->bgColor. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_FONT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data BOLD type FLAG . + data COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_SCHEME_MAJOR type ZEXCEL_STYLE_FONT_SCHEME value 'major'. "#EC NOTEXT . + class-data C_SCHEME_MINOR type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLE type CHAR20 value 'double'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLEACCOUNTING type CHAR20 value 'doubleAccounting'. "#EC NOTEXT . + class-data C_UNDERLINE_NONE type CHAR20 value 'none'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLE type CHAR20 value 'single'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLEACCOUNTING type CHAR20 value 'singleAccounting'. "#EC NOTEXT . + data FAMILY type INT1 value 2. "#EC NOTEXT . + data ITALIC type FLAG . + data NAME type CHAR255 value 'Calibri'. "#EC NOTEXT . + data SCHEME type ZEXCEL_STYLE_FONT_SCHEME . + data SIZE type INT1 value 11. "#EC NOTEXT . + data STRIKETHROUGH type FLAG . + data UNDERLINE type FLAG . + data UNDERLINE_MODE type CHAR20 . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FONT) type ZEXCEL_S_STYLE_FONT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->color = zcl_excel_style_color=>c_black. + me->scheme = zcl_excel_style_font=>c_scheme_minor. + me->underline_mode = zcl_excel_style_font=>c_underline_single. +ENDMETHOD. + + + + METHOD get_structure. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + es_font-bold = me->bold. + es_font-italic = me->italic. + es_font-underline = me->underline. + es_font-underline_mode = me->underline_mode. + es_font-strikethrough = me->strikethrough. + es_font-size = me->size. + es_font-color = me->color. + es_font-name = me->name. + es_font-family = me->family. + es_font-scheme = me->scheme. + +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_NUMBER_FORMAT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +public section. + + class-data C_FORMAT_NUMBER type ZEXCEL_NUMBER_FORMAT value '0'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_00 type ZEXCEL_NUMBER_FORMAT value '0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP1 type ZEXCEL_NUMBER_FORMAT value '#,##0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP2 type ZEXCEL_NUMBER_FORMAT value '#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE type ZEXCEL_NUMBER_FORMAT value '0%'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE_00 type ZEXCEL_NUMBER_FORMAT value '0.00%'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD2 type ZEXCEL_NUMBER_FORMAT value 'yyyy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD type ZEXCEL_NUMBER_FORMAT value 'yy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DDMMYYYY type ZEXCEL_NUMBER_FORMAT value 'dd/mm/yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYSLASH type ZEXCEL_NUMBER_FORMAT value 'd/m/y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m'. "#EC NOTEXT . + class-data C_FORMAT_DATE_MYMINUS type ZEXCEL_NUMBER_FORMAT value 'm-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX14 type ZEXCEL_NUMBER_FORMAT value 'mm-dd-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX15 type ZEXCEL_NUMBER_FORMAT value 'd-mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX16 type ZEXCEL_NUMBER_FORMAT value 'd-mmm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX17 type ZEXCEL_NUMBER_FORMAT value 'mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX22 type ZEXCEL_NUMBER_FORMAT value 'm/d/yy h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DATETIME type ZEXCEL_NUMBER_FORMAT value 'd/m/y h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME1 type ZEXCEL_NUMBER_FORMAT value 'h:mm AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME2 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME3 type ZEXCEL_NUMBER_FORMAT value 'h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME4 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME5 type ZEXCEL_NUMBER_FORMAT value 'mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME6 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME7 type ZEXCEL_NUMBER_FORMAT value 'i:s.S'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME8 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss@'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yy/mm/dd@'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD_SIMPLE type ZEXCEL_NUMBER_FORMAT value '"$"#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD type ZEXCEL_NUMBER_FORMAT value '$#,##0_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_EUR_SIMPLE type ZEXCEL_NUMBER_FORMAT value '[$EUR ]#,##0.00_-'. "#EC NOTEXT . + data FORMAT_CODE type ZEXCEL_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(EP_NUMBER_FORMAT) type ZEXCEL_NUMBER_FORMAT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +private section. + + class-data C_FORMAT_GENERAL type ZEXCEL_NUMBER_FORMAT value ''. "#EC NOTEXT . + class-data C_FORMAT_TEXT type ZEXCEL_NUMBER_FORMAT value '@'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + format_code = me->c_format_general. +ENDMETHOD. + + + + METHOD get_structure. + ep_number_format = me->format_code. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_PROTECTION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +public section. + + constants C_PROTECTION_INHERIT type ZEXCEL_PROTECTION value 'inherit'. "#EC NOTEXT + constants C_PROTECTION_PROTECTED type ZEXCEL_PROTECTION value 'protected'. "#EC NOTEXT + constants C_PROTECTION_UNPROTECTED type ZEXCEL_PROTECTION value 'unprotected'. "#EC NOTEXT + data LOCKED type ZEXCEL_PROTECTION . + data HIDDEN type ZEXCEL_PROTECTION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + METHOD constructor. + locked = me->c_protection_inherit. + hidden = me->c_protection_inherit. +ENDMETHOD. + + + + class ZCL_EXCEL_WORKSHEET definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + class-data C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT . + class-data C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT . + class-data C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT . + class-data C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT . + data DEFAULTROWHEIGHT type INT1 value 15. "#EC NOTEXT . + data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . + data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . + data SHEET_STATE type ZEXCEL_SHEET_STATE . + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_ACTIVE_CELL + returning + value(EP_ACTIVE_CELL) type STRING . + methods GET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + exporting + !EP_VALUE type ZEXCEL_CELL_VALUE + !EP_RC type SYSUBRC . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + methods SET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_VALUE type ZEXCEL_CELL_VALUE + !IP_FORMULA type ZEXCEL_CELL_FORMULA optional + !IP_STYLE type ZEXCEL_CELL_STYLE optional . + methods SET_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional + !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional + !IP_TABLE_TITLE type STRING optional + !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' + !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . + methods ADD_NEW_CONDITIONAL_STYLE + returning + value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_COND_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + + data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . + data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + + methods UPDATE_DIMENSION_RANGE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + METHOD add_new_conditional_style. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). +ENDMETHOD. + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + sheet_state = me->c_sheet_state_visible. + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +ENDMETHOD. + + + + METHOD get_active_cell. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + +ENDMETHOD. + + + + + + + METHOD get_cell. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. +ENDMETHOD. + + + + method GET_COND_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->conditional_styles->get_iterator( ). +endmethod. + + + + METHOD get_dimension_range. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + ep_dimension_range = upper_cell-cell_coords. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + +ENDMETHOD. + + + + method GET_GUID. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. + +endmethod. + + + + + + + + METHOD set_cell. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = ZCL_EXCEL_COMMON=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_value = ip_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = ip_style. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = ip_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = ip_style. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content. + SORT sheet_content BY cell_row cell_column. +* me->update_dimension_range( ). + + ENDIF. + +ENDMETHOD. + + + + + + + + + METHOD set_table. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE '2', + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_body_style ). + ADD 1 TO lv_row_int. + ENDLOOP. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDLOOP. + +ENDMETHOD. + + + METHOD update_dimension_range. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +ENDMETHOD. + + + + class ZCL_EXCEL_WORKSHEETS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +public section. + + data ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET value 1. "#EC NOTEXT . + data NAME type ZEXCEL_WORKSHEETS_NAME value 'Worksheets'. "#EC NOTEXT . + + methods ADD + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +private section. + + data WORKSHEETS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + METHOD ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->add( ip_worksheet ). +ENDMETHOD. + + + METHOD clear. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->clear( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT worksheets. + +ENDMETHOD. + + + + + METHOD get. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). +ENDMETHOD. + + + + METHOD get_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= worksheets->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = worksheets->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->remove( ip_worksheet ). +ENDMETHOD. + + + + METHOD size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = worksheets->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + methods CONSTRUCTOR + importing + !IO_EXCEL type ref to ZCL_EXCEL . + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_CALCCHAIN type STRING value 'xl/calcChain.xml'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_CALCCHAIN + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->excel = io_excel. +ENDMETHOD. + + + + METHOD create. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sharedStrings.xml to zip + lv_content = me->create_xl_calcchain( ). + lo_zip->add( name = me->c_xl_calcchain + content = lv_content ). + +********************************************************************** +* STEP 11: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +ENDMETHOD. + + + + METHOD create_content_types. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lv_xml_node_worksheet_pn ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_docprops_app. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_docprops_core. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD CREATE_RELATIONSHIPS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_calcchain. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_calcchain TYPE string VALUE 'calcChain', + lc_xml_node_c TYPE string VALUE 'c', + " Node attributes + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_i TYPE string VALUE 'i', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string, + lv_value_i TYPE string, + lv_sheets_count TYPE i. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create xl/calcChain.xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node calcChain + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_calcchain + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_sheets_count. + MOVE lv_sheets_count TO lv_value_i. + SHIFT lv_value_i RIGHT DELETING TRAILING space. + SHIFT lv_value_i LEFT DELETING LEADING space. + LOOP AT lo_worksheet->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_formula IS NOT INITIAL. + " formula chain node + lo_element = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_i + value = lv_value_i ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_relationships. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + lc_xml_node_rid_calcchain_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml', + lc_xml_node_rid_calcchain_tg TYPE string VALUE 'calcChain.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 1 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_calcchain_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_calcchain_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_sharedstrings. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + + METHOD create_xl_sheet. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional. + + DATA: lv_value TYPE string, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + lv_value = io_worksheet->defaultrowheight. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + lo_element_root->append_child( lo_element ). " sheetFormatPr node + + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = '1:1' ). " <******************************* + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + IF ls_style_mapping-cell_format IS INITIAL. " to avoid errors if no style has been created + IF <ls_sheet_content>-cell_formula IS INITIAL. + ls_style_mapping-cell_format = 'S'. + ELSE. + ls_style_mapping-cell_format = 'F'. + ENDIF. + ENDIF. + " is a shared string and is not a formula + IF ls_style_mapping-cell_format EQ 'S'. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = 's' ). + ENDIF. + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ENDIF. + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF ls_style_mapping-cell_format EQ 'S'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_sheet_rels. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + lc_xml_node_rid_print_id TYPE string VALUE 'rId1', + " Node type + lc_xml_node_rid_print_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', + " Node target + lc_xml_node_rid_print_tg TYPE string VALUE '../printerSettings/printerSettings1.bin'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rid_print_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_print_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_print_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_styles. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + ls_format TYPE zexcel_number_format, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_format = lo_style->number_format->get_structure( ). + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + + IF ls_format IS INITIAL. + ls_cellxfs-numfmtid = 0. " number format + ELSE. + ls_cellxfs-numfmtid = ls_format. " number format + ENDIF. + ls_cellxfs-xfid = 0. + + IF ls_format IS NOT INITIAL. + ls_cellxfs-applynumberformat = 1. + ls_styles_mapping-cell_format = 'I'. + ELSE. + ls_cellxfs-applynumberformat = 0. + ls_styles_mapping-cell_format = 'S'. + ENDIF. + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + " Collect color + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = 'TableStyleMedium9' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = 'PivotStyleLight16' ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_theme. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +ENDMETHOD. + + + + METHOD create_xl_workbook. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + METHOD flag2bool. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +ENDMETHOD. + + + + + METHOD get_shared_string_index. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +ENDMETHOD. + + + + class ZCL_EXCEL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL +*"* do not include other source files here!!! +public section. + + constants C_XLS type ZEXCEL_FORMAT value 'XLS'. "#EC NOTEXT + constants C_XLSX type ZEXCEL_FORMAT value 'XLSX'. "#EC NOTEXT + data PROPERTIES type ref to ZCL_EXCEL_PROPERTIES . + data SECURITY type ref to ZCL_EXCEL_SECURITY . + + methods ADD_NEW_DRAWING + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods ADD_NEW_STYLE + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods ADD_NEW_WORKSHEET + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods CONSTRUCTOR . + methods GET_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_NAME + returning + value(EP_NAME) type ZEXCEL_WORKSHEETS_NAME . + methods GET_WORKSHEETS_SIZE + returning + value(EP_SIZE) type I . + methods SAVE_AS + importing + !IP_FORMAT type ZEXCEL_FORMAT + returning + value(EP_FILE) type XSTRING . + *"* protected components of class ZABAP_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . + data RANGES type ref to ZCL_EXCEL_RANGES . + data STYLES type ref to ZCL_EXCEL_STYLES . + data WORKSHEETS type ref to ZCL_EXCEL_WORKSHEETS . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + METHOD add_new_drawing. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_title = ip_title. + drawings->add( eo_drawing ). +ENDMETHOD. + + + + method ADD_NEW_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Create default style + CREATE OBJECT eo_style. + styles->add( eo_style ). + +endmethod. + + + + + METHOD add_new_worksheet. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_title = ip_title. + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT properties. + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings. + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. + + +ENDMETHOD. + + + + method GET_ACTIVE_WORKSHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + +endmethod. + + + + METHOD GET_DRAWINGS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->drawings->get_iterator( ). +ENDMETHOD. + + + + METHOD GET_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->styles->get_iterator( ). +ENDMETHOD. + + + + METHOD get_worksheets_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->worksheets->get_iterator( ). +ENDMETHOD. + + + + METHOD GET_WORKSHEETS_NAME. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_name = me->worksheets->name. + +ENDMETHOD. + + + + METHOD get_worksheets_size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = me->worksheets->size( ). + +ENDMETHOD. + + + + + METHOD save_as. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lo_excel_writer_2007 TYPE REF TO zcl_excel_writer_2007. + +* Determine the output engine to use + CASE ip_format. + WHEN me->c_xlsx. " XLSX for Office 2007 + CREATE OBJECT lo_excel_writer_2007 EXPORTING io_excel = me. + ep_file = lo_excel_writer_2007->create( ). + WHEN OTHERS. + ENDCASE. + +ENDMETHOD. + + + + class ZCL_EXCEL_COMMON definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +public section. + + class-methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + class-methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* protected components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +private section. + + class-data C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + METHOD convert_column2alpha. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +ENDMETHOD. + + + + + METHOD convert_column2int. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( zcl_excel_common=>c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( zcl_excel_common=>c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - zcl_excel_common=>c_excel_col_module. + ENDIF. + +ENDMETHOD. + + + + class ZCL_EXCEL_DRAWING definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + data X_REFERENCES type CHAR1 . + data Y_REFERENCES type CHAR1 . + data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +private section. + + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + + methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + METHOD CONSTRUCTOR. + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +ENDMETHOD. + + + + + METHOD CONVERT_COLUMN2ALPHA. + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +ENDMETHOD. + + + + + METHOD CONVERT_COLUMN2INT. + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( me->c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( me->c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - me->c_excel_col_module. + ENDIF. + +ENDMETHOD. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + class ZCL_EXCEL_DRAWINGS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD add. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->add( ip_drawing ). +ENDMETHOD. + + + METHOD clear. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->clear( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT drawings. + +ENDMETHOD. + + + + + METHOD get. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_drawing ?= drawings->if_object_collection~get( lv_index ). +ENDMETHOD. + + + + METHOD get_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= drawings->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = drawings->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->remove( ip_drawing ). +ENDMETHOD. + + + + METHOD size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = drawings->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_PROPERTIES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +public section. + + data CREATOR type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data LASTMODIFIEDBY type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data CREATED type TIMESTAMPL . + data MODIFIED type TIMESTAMPL . + data TITLE type ZEXCEL_TITLE value 'Untitled Spreadsheet'. "#EC NOTEXT . + data SUBJECT type ZEXCEL_SUBJECT . + data DESCRIPTION type ZEXCEL_DESCRIPTION . + data KEYWORDS type ZEXCEL_KEYWORDS . + data CATEGORY type ZEXCEL_CATEGORY . + data COMPANY type ZEXCEL_COMPANY value 'Microsoft Corporation'. "#EC NOTEXT . + data APPLICATION type ZEXCEL_APPLICATION value 'Microsoft Excel'. "#EC NOTEXT . + data DOCSECURITY type ZEXCEL_DOCSECURITY value '0'. "#EC NOTEXT . + data SCALECROP type ZEXCEL_SCALECROP value ''. "#EC NOTEXT . + data LINKSUPTODATE type FLAG . + data SHAREDDOC type FLAG . + data HYPERLINKSCHANGED type FLAG . + data APPVERSION type ZEXCEL_APPVERSION value '12.0000'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_PROPERTIES +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + METHOD CONSTRUCTOR. + + DATA: lv_timestamp TYPE timestampl. + + GET TIME STAMP FIELD lv_timestamp. + created = lv_timestamp. + modified = lv_timestamp. + +ENDMETHOD. + + + + class ZCL_EXCEL_RANGE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +public section. + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + method CONSTRUCTOR. +endmethod. + + + + class ZCL_EXCEL_RANGES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_RANGES +*"* do not include other source files here!!! +private section. + + data RANGES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD ADD. + ranges->add( ip_range ). +ENDMETHOD. + + + METHOD CLEAR. + ranges->clear( ). +ENDMETHOD. + + + method CONSTRUCTOR. +endmethod. + + + + + METHOD GET. + eo_range ?= ranges->if_object_collection~get( ip_index ). +ENDMETHOD. + + + + METHOD GET_ITERATOR. + eo_iterator ?= ranges->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD IS_EMPTY. + is_empty = ranges->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD REMOVE. + ranges->remove( ip_range ). +ENDMETHOD. + + + + METHOD SIZE. + ep_size = ranges->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_SECURITY definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SECURITY +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data LOCKREVISION type FLAG . + data LOCKSTRUCTURE type FLAG . + data LOCKWINDOWS type FLAG . + data REVISIONSPASSWORD type ZEXCEL_REVISIONSPASSWORD . + data WORKBOOKPASSWORD type ZEXCEL_WORKBOOKPASSWORD . + + methods CONSTRUCTOR . + methods IS_SECURITY_ENABLED + returning + value(EP_SECURITY_ENABLED) type FLAG . + *"* protected components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + method CONSTRUCTOR. +endmethod. + + + + METHOD IS_SECURITY_ENABLED. + IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. + ep_security_enabled = abap_true. + ENDIF. +ENDMETHOD. + + + + class ZCL_EXCEL_SHEET_SETUP definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants C_PAPERSIZE_LETTER type ZEXCEL_SHEET_PAPER_SIZE value 1. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 2. "#EC NOTEXT + constants C_PAPERSIZE_TABLOID type ZEXCEL_SHEET_PAPER_SIZE value 3. "#EC NOTEXT + constants C_PAPERSIZE_LEDGER type ZEXCEL_SHEET_PAPER_SIZE value 4. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL type ZEXCEL_SHEET_PAPER_SIZE value 5. "#EC NOTEXT + constants C_PAPERSIZE_STATEMENT type ZEXCEL_SHEET_PAPER_SIZE value 6. "#EC NOTEXT + constants C_PAPERSIZE_EXECUTIVE type ZEXCEL_SHEET_PAPER_SIZE value 7. "#EC NOTEXT + constants C_PAPERSIZE_A3 type ZEXCEL_SHEET_PAPER_SIZE value 8. "#EC NOTEXT + constants C_PAPERSIZE_A4 type ZEXCEL_SHEET_PAPER_SIZE value 9. "#EC NOTEXT + constants C_PAPERSIZE_A4_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 10. "#EC NOTEXT + constants C_PAPERSIZE_A5 type ZEXCEL_SHEET_PAPER_SIZE value 11. "#EC NOTEXT + constants C_PAPERSIZE_B4 type ZEXCEL_SHEET_PAPER_SIZE value 12. "#EC NOTEXT + constants C_PAPERSIZE_B5 type ZEXCEL_SHEET_PAPER_SIZE value 13. "#EC NOTEXT + constants C_PAPERSIZE_FOLIO type ZEXCEL_SHEET_PAPER_SIZE value 14. "#EC NOTEXT + constants C_PAPERSIZE_QUARTO type ZEXCEL_SHEET_PAPER_SIZE value 15. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_1 type ZEXCEL_SHEET_PAPER_SIZE value 16. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_2 type ZEXCEL_SHEET_PAPER_SIZE value 17. "#EC NOTEXT + constants C_PAPERSIZE_NOTE type ZEXCEL_SHEET_PAPER_SIZE value 18. "#EC NOTEXT + constants C_PAPERSIZE_NO9_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 19. "#EC NOTEXT + constants C_PAPERSIZE_NO10_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 20. "#EC NOTEXT + constants C_PAPERSIZE_NO11_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 21. "#EC NOTEXT + constants C_PAPERSIZE_NO12_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 22. "#EC NOTEXT + constants C_PAPERSIZE_NO14_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 23. "#EC NOTEXT + constants C_PAPERSIZE_C type ZEXCEL_SHEET_PAPER_SIZE value 24. "#EC NOTEXT + constants C_PAPERSIZE_D type ZEXCEL_SHEET_PAPER_SIZE value 25. "#EC NOTEXT + constants C_PAPERSIZE_E type ZEXCEL_SHEET_PAPER_SIZE value 26. "#EC NOTEXT + constants C_PAPERSIZE_DL_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 27. "#EC NOTEXT + constants C_PAPERSIZE_C5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 28. "#EC NOTEXT + constants C_PAPERSIZE_C3_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 29. "#EC NOTEXT + constants C_PAPERSIZE_C4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 30. "#EC NOTEXT + constants C_PAPERSIZE_C6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 31. "#EC NOTEXT + constants C_PAPERSIZE_C65_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 32. "#EC NOTEXT + constants C_PAPERSIZE_B4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 33. "#EC NOTEXT + constants C_PAPERSIZE_B5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 34. "#EC NOTEXT + constants C_PAPERSIZE_B6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 35. "#EC NOTEXT + constants C_PAPERSIZE_ITALY_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 36. "#EC NOTEXT + constants C_PAPERSIZE_MONARCH_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 37. "#EC NOTEXT + constants C_PAPERSIZE_6_3_4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 38. "#EC NOTEXT + constants C_PAPERSIZE_US_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 39. "#EC NOTEXT + constants C_PAPERSIZE_DE_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 40. "#EC NOTEXT + constants C_PAPERSIZE_DE_LEG_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 41. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B4 type ZEXCEL_SHEET_PAPER_SIZE value 42. "#EC NOTEXT + constants C_PAPERSIZE_JPN_DBL_POSTCARD type ZEXCEL_SHEET_PAPER_SIZE value 43. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_1 type ZEXCEL_SHEET_PAPER_SIZE value 44. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_2 type ZEXCEL_SHEET_PAPER_SIZE value 45. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_3 type ZEXCEL_SHEET_PAPER_SIZE value 46. "#EC NOTEXT + constants C_PAPERSIZE_INVITE_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 47. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 48. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 49. "#EC NOTEXT + constants C_PAPERSIZE_TABL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 50. "#EC NOTEXT + constants C_PAPERSIZE_A4_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 51. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 52. "#EC NOTEXT + constants C_PAPERSIZE_A4_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 53. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 54. "#EC NOTEXT + constants C_PAPERSIZE_SUPERA_A4_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 55. "#EC NOTEXT + constants C_PAPERSIZE_SUPERB_A3_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 56. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 57. "#EC NOTEXT + constants C_PAPERSIZE_A4_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 58. "#EC NOTEXT + constants C_PAPERSIZE_A5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 59. "#EC NOTEXT + constants C_PAPERSIZE_JIS_B5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 60. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 61. "#EC NOTEXT + constants C_PAPERSIZE_A5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 62. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 63. "#EC NOTEXT + constants C_PAPERSIZE_A2_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 64. "#EC NOTEXT + constants C_PAPERSIZE_A3_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 65. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 66. "#EC NOTEXT + constants C_ORIENTATION_DEFAULT type ZEXCEL_SHEET_ORIENATATION value 'default'. "#EC NOTEXT + constants C_ORIENTATION_LANDSCAPE type ZEXCEL_SHEET_ORIENATATION value 'landscape'. "#EC NOTEXT + constants C_ORIENTATION_PORTRAIT type ZEXCEL_SHEET_ORIENATATION value 'portrait'. "#EC NOTEXT + data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + orientation = me->c_orientation_default. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +public section. + + data FONT type ref to ZCL_EXCEL_STYLE_FONT . + data FILL type ref to ZCL_EXCEL_STYLE_FILL . + data BORDERS type ref to ZCL_EXCEL_STYLE_BORDERS . + data NUMBER_FORMAT type ref to ZCL_EXCEL_STYLE_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_CELL_STYLE . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +private section. + + data ALIGNMENT type ref to ZCL_EXCEL_STYLE_ALIGNMENT . + data PROTECTION type ref to ZCL_EXCEL_STYLE_PROTECTION . + data GUID type ZEXCEL_CELL_STYLE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT font. + CREATE OBJECT fill. + CREATE OBJECT borders. + CREATE OBJECT alignment. + CREATE OBJECT number_format. + CREATE OBJECT protection. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + +ENDMETHOD. + + + + METHOD get_guid. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods SIZE + returning + value(EP_SIZE) type I . + methods REGISTER_NEW_STYLE + importing + !IO_STYLE type ref to ZCL_EXCEL_STYLE + returning + value(EP_STYLE_CODE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +private section. + + data STYLES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD add. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->add( ip_style ). +ENDMETHOD. + + + METHOD clear. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->clear( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT styles. +ENDMETHOD. + + + + + METHOD get. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_style ?= styles->if_object_collection~get( ip_index ). +ENDMETHOD. + + + + METHOD get_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= styles->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = styles->if_object_collection~is_empty( ). +ENDMETHOD. + + + + + METHOD register_new_style. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->add( io_style ). + ep_style_code = me->size( ) - 1. "style count starts from 0 +ENDMETHOD. + + + + METHOD remove. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->remove( ip_style ). +ENDMETHOD. + + + + METHOD size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = styles->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_STYLES_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_STYLE_CONDITIONAL) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data STYLES_CONDITIONAL type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD add. + styles_conditional->add( ip_style_conditional ). +ENDMETHOD. + + + METHOD clear. + styles_conditional->clear( ). +ENDMETHOD. + + + METHOD constructor. + + CREATE OBJECT styles_conditional. + +ENDMETHOD. + + + + + METHOD get. + DATA lv_index TYPE i. + lv_index = ip_index. + eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). +ENDMETHOD. + + + + METHOD get_iterator. + eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. + is_empty = styles_conditional->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. + styles_conditional->remove( ip_style_conditional ). +ENDMETHOD. + + + + METHOD size. + ep_size = styles_conditional->if_object_collection~size( ). +ENDMETHOD. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + class ZCL_EXCEL_STYLE_ALIGNMENT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data HORIZONTAL type ZEXCEL_ALIGNMENT . + data VERTICAL type ZEXCEL_ALIGNMENT . + data TEXTROTATION type ZEXCEL_TEXT_ROTATION value 0. "#EC NOTEXT . + data WRAPTEXT type FLAG . + data SHRINKTOFIT type FLAG . + data INDENT type ZEXCEL_INDENT value 0. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +private section. + + constants C_HORIZONTAL_GENERAL type ZEXCEL_ALIGNMENT value 'general'. "#EC NOTEXT + constants C_HORIZONTAL_LEFT type ZEXCEL_ALIGNMENT value 'left'. "#EC NOTEXT + constants C_HORIZONTAL_RIGHT type ZEXCEL_ALIGNMENT value 'right'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER_CONTINUOUS type ZEXCEL_ALIGNMENT value 'centerContinuous'. "#EC NOTEXT + constants C_HORIZONTAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + constants C_VERTICAL_BOTTOM type ZEXCEL_ALIGNMENT value 'bottom'. "#EC NOTEXT + constants C_VERTICAL_TOP type ZEXCEL_ALIGNMENT value 'top'. "#EC NOTEXT + constants C_VERTICAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_VERTICAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + METHOD constructor. + horizontal = me->c_horizontal_general. + vertical = me->c_vertical_bottom. + wrapText = abap_false. + shrinkToFit = abap_false. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_BORDER definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +public section. + + data BORDER_STYLE type ZEXCEL_BORDER . + data BORDER_COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_BORDER_NONE type ZEXCEL_BORDER value 'none'. "#EC NOTEXT . + class-data C_BORDER_DASHDOT type ZEXCEL_BORDER value 'dashDot'. "#EC NOTEXT . + class-data C_BORDER_DASHDOTDOT type ZEXCEL_BORDER value 'dashDotDot'. "#EC NOTEXT . + class-data C_BORDER_DASHED type ZEXCEL_BORDER value 'dashed'. "#EC NOTEXT . + class-data C_BORDER_DOTTED type ZEXCEL_BORDER value 'dotted'. "#EC NOTEXT . + class-data C_BORDER_DOUBLE type ZEXCEL_BORDER value 'double'. "#EC NOTEXT . + class-data C_BORDER_HAIR type ZEXCEL_BORDER value 'hair'. "#EC NOTEXT . + class-data C_BORDER_MEDIUM type ZEXCEL_BORDER value 'medium'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOT type ZEXCEL_BORDER value 'mediumDashDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOTDOT type ZEXCEL_BORDER value 'mediumDashDotDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHED type ZEXCEL_BORDER value 'mediumDashed'. "#EC NOTEXT . + class-data C_BORDER_SLANTDASHDOT type ZEXCEL_BORDER value 'slantDashDot'. "#EC NOTEXT . + class-data C_BORDER_THICK type ZEXCEL_BORDER value 'thick'. "#EC NOTEXT . + class-data C_BORDER_THIN type ZEXCEL_BORDER value 'thin'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + METHOD constructor. + border_style = zcl_excel_style_border=>c_border_none. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_BORDERS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +public section. + + data LEFT type ref to ZCL_EXCEL_STYLE_BORDER . + data RIGHT type ref to ZCL_EXCEL_STYLE_BORDER . + data TOP type ref to ZCL_EXCEL_STYLE_BORDER . + data DOWN type ref to ZCL_EXCEL_STYLE_BORDER . + data DIAGONAL type ref to ZCL_EXCEL_STYLE_BORDER . + data ALLBORDERS type ref to ZCL_EXCEL_STYLE_BORDER . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_BORDER . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +private section. + + constants C_DIAGONAL_NONE type ZEXCEL_DIAGONAL value 0. "#EC NOTEXT + constants C_DIAGONAL_UP type ZEXCEL_DIAGONAL value 1. "#EC NOTEXT + constants C_DIAGONAL_DOWN type ZEXCEL_DIAGONAL value 2. "#EC NOTEXT + constants C_DIAGONAL_BOTH type ZEXCEL_DIAGONAL value 3. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method CONSTRUCTOR. +endmethod. + + + + METHOD get_structure. + +* Check if all borders is set otherwise check single border + IF me->allborders IS BOUND. + es_fill-left_color = me->allborders->border_color. + es_fill-left_style = me->allborders->border_style. + es_fill-right_color = me->allborders->border_color. + es_fill-right_style = me->allborders->border_style. + es_fill-top_color = me->allborders->border_color. + es_fill-top_style = me->allborders->border_style. + es_fill-bottom_color = me->allborders->border_color. + es_fill-bottom_style = me->allborders->border_style. + ELSE. + IF me->left IS BOUND. + es_fill-left_color = me->left->border_color. + es_fill-left_style = me->left->border_style. + ENDIF. + IF me->right IS BOUND. + es_fill-right_color = me->right->border_color. + es_fill-right_style = me->right->border_style. + ENDIF. + IF me->top IS BOUND. + es_fill-top_color = me->top->border_color. + es_fill-top_style = me->top->border_style. + ENDIF. + IF me->down IS BOUND. + es_fill-bottom_color = me->down->border_color. + es_fill-bottom_style = me->down->border_style. + ENDIF. + ENDIF. + +* Check if diagonal is set + IF me->diagonal IS BOUND. + es_fill-diagonal_color = me->diagonal->border_color. + es_fill-diagonal_style = me->diagonal->border_style. + ENDIF. + +ENDMETHOD. "get_structure + + + + class ZCL_EXCEL_STYLE_COLOR definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +public section. + + class-data C_BLACK type ZEXCEL_STYLE_COLOR_ARGB value 'FF000000'. "#EC NOTEXT . + class-data C_BLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF0000FF'. "#EC NOTEXT . + class-data C_DARKBLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF000080'. "#EC NOTEXT . + class-data C_DARKGREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF008000'. "#EC NOTEXT . + class-data C_DARKRED type ZEXCEL_STYLE_COLOR_ARGB value 'FF800000'. "#EC NOTEXT . + class-data C_DARKYELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FF808000'. "#EC NOTEXT . + class-data C_GRAY type ZEXCEL_STYLE_COLOR_ARGB value 'FFCCCCCC'. "#EC NOTEXT . + class-data C_GREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF00FF00'. "#EC NOTEXT . + class-data C_RED type ZEXCEL_STYLE_COLOR_ARGB value 'FFFF0000'. "#EC NOTEXT . + class-data C_WHITE type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFFFF'. "#EC NOTEXT . + class-data C_YELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFF00'. "#EC NOTEXT . + + methods CONSTRUCTOR . + class-methods CREATE_NEW_ARGB + importing + !IP_RED type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_GREEN type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_BLU type ZEXCEL_STYLE_COLOR_COMPONENT + returning + value(EP_COLOR_ARGB) type ZEXCEL_STYLE_COLOR_ARGB . + *"* protected components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +private section. + + class-data C_ALPHA type CHAR2 value 'FF'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +endmethod. + + + + + + + METHOD create_new_argb. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. + +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +public section. + + class-data C_ICONSET_3ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '3Arrows'. "#EC NOTEXT . + class-data C_ICONSET_3ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '3ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_3FLAGS type ZEXCEL_CONDITION_RULE_ICONSET value '3Flags'. "#EC NOTEXT . + class-data C_ICONSET_3SIGNS type ZEXCEL_CONDITION_RULE_ICONSET value '3Signs'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols2'. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value ''. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3TrafficLights2'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '4Arrows'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '4ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_4RATING type ZEXCEL_CONDITION_RULE_ICONSET value '4Rating'. "#EC NOTEXT . + class-data C_ICONSET_4REDTOBLACK type ZEXCEL_CONDITION_RULE_ICONSET value '4RedToBlack'. "#EC NOTEXT . + class-data C_ICONSET_4TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value '4TrafficLights'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '5Arrows'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '5ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_5QUARTERS type ZEXCEL_CONDITION_RULE_ICONSET value '5Quarters'. "#EC NOTEXT . + class-data C_ICONSET_5RATING type ZEXCEL_CONDITION_RULE_ICONSET value '5Rating'. "#EC NOTEXT . + class-data C_OPERATOR_BEGINSWITH type ZEXCEL_CONDITION_OPERATOR value 'beginsWith'. "#EC NOTEXT . + class-data C_OPERATOR_BETWEEN type ZEXCEL_CONDITION_OPERATOR value 'between'. "#EC NOTEXT . + class-data C_OPERATOR_CONTAINSTEXT type ZEXCEL_CONDITION_OPERATOR value 'containsText'. "#EC NOTEXT . + class-data C_OPERATOR_ENDSWITH type ZEXCEL_CONDITION_OPERATOR value 'endsWith'. "#EC NOTEXT . + class-data C_OPERATOR_EQUAL type ZEXCEL_CONDITION_OPERATOR value 'equal'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHAN type ZEXCEL_CONDITION_OPERATOR value 'greaterThan'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'greaterThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHAN type ZEXCEL_CONDITION_OPERATOR value 'lessThan'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'lessThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_NONE type ZEXCEL_CONDITION_OPERATOR value ''. "#EC NOTEXT . + class-data C_OPERATOR_NOTCONTAINS type ZEXCEL_CONDITION_OPERATOR value 'notContains'. "#EC NOTEXT . + class-data C_OPERATOR_NOTEQUAL type ZEXCEL_CONDITION_OPERATOR value 'notEqual'. "#EC NOTEXT . + class-data C_RULE_CELLIS type ZEXCEL_CONDITION_RULE value 'cellIs'. "#EC NOTEXT . + class-data C_RULE_CONTAINSTEXT type ZEXCEL_CONDITION_RULE value 'containsText'. "#EC NOTEXT . + class-data C_RULE_EXPRESSION type ZEXCEL_CONDITION_RULE value 'expression'. "#EC NOTEXT . + class-data C_RULE_ICONSET type ZEXCEL_CONDITION_RULE value 'iconSet'. "#EC NOTEXT . + class-data C_RULE_NONE type ZEXCEL_CONDITION_RULE value 'none'. "#EC NOTEXT . + data FORMULA type ZEXCEL_STYLE_FORMULA . + data ICONSET type ZEXCEL_CONDITION_RULE_ICONSET . + data OPERATOR type ZEXCEL_CONDITION_OPERATOR . + data PRIORITY type ZEXCEL_STYLE_PRIORITY value 1. "#EC NOTEXT . + data RULE type ZEXCEL_CONDITION_RULE . + + methods CONSTRUCTOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods SET_RANGE + importing + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data START_CELL type ZEXCEL_S_CELL_DATA . + data STOP_CELL type ZEXCEL_S_CELL_DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + rule = me->c_rule_none. + operator = me->c_operator_none. +* inizialize dimension range + stop_cell-cell_row = 1. + stop_cell-cell_column = 1. + start_cell-cell_row = 1. + start_cell-cell_column = 1. +ENDMETHOD. + + + + METHOD get_dimension_range. + IF stop_cell EQ start_cell. "only one cell + ep_dimension_range = start_cell-cell_coords. + ELSE. + CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. + ENDIF. +ENDMETHOD. + + + + + + + METHOD set_range. + DATA: lv_column TYPE zexcel_cell_column, + lv_row_alpha TYPE string. + + lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). + stop_cell-cell_row = 1. + stop_cell-cell_column = lv_column. + lv_row_alpha = ip_stop_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. + + lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). + start_cell-cell_row = 1. + start_cell-cell_column = lv_column. + lv_row_alpha = ip_start_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_FILL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +public section. + + class-data C_FILL_NONE type ZEXCEL_FILL_TYPE value 'none'. "#EC NOTEXT . + class-data C_FILL_SOLID type ZEXCEL_FILL_TYPE value 'solid'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_LINEAR type ZEXCEL_FILL_TYPE value 'linear'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_PATH type ZEXCEL_FILL_TYPE value 'path'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKDOWN type ZEXCEL_FILL_TYPE value 'darkDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRAY type ZEXCEL_FILL_TYPE value 'darkGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRID type ZEXCEL_FILL_TYPE value 'darkGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKHORIZONTAL type ZEXCEL_FILL_TYPE value 'darkHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKTRELLIS type ZEXCEL_FILL_TYPE value 'darkTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKUP type ZEXCEL_FILL_TYPE value 'darkUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKVERTICAL type ZEXCEL_FILL_TYPE value 'darkVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY0625 type ZEXCEL_FILL_TYPE value 'gray0625'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY125 type ZEXCEL_FILL_TYPE value 'gray125'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTDOWN type ZEXCEL_FILL_TYPE value 'lightDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRAY type ZEXCEL_FILL_TYPE value 'lightGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRID type ZEXCEL_FILL_TYPE value 'lightGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTHORIZONTAL type ZEXCEL_FILL_TYPE value 'lightHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTTRELLIS type ZEXCEL_FILL_TYPE value 'lightTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTUP type ZEXCEL_FILL_TYPE value 'lightUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTVERTICAL type ZEXCEL_FILL_TYPE value 'lightVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_MEDIUMGRAY type ZEXCEL_FILL_TYPE value 'mediumGray'. "#EC NOTEXT . + data FILLTYPE type ZEXCEL_FILL_TYPE . + data ROTATION type ZEXCEL_ROTATION . + data FGCOLOR type ZEXCEL_STYLE_COLOR_ARGB . + data BGCOLOR type ZEXCEL_STYLE_COLOR_ARGB value '64'. "#EC NOTEXT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_FILL . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + filltype = zcl_excel_style_fill=>c_fill_none. + rotation = 0. +ENDMETHOD. + + + + METHOD get_structure. + es_fill-rotation = me->rotation. + es_fill-filltype = me->filltype. + es_fill-fgColor = me->fgColor. + es_fill-bgColor = me->bgColor. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_FONT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data BOLD type FLAG . + data COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_SCHEME_MAJOR type ZEXCEL_STYLE_FONT_SCHEME value 'major'. "#EC NOTEXT . + class-data C_SCHEME_MINOR type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLE type CHAR20 value 'double'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLEACCOUNTING type CHAR20 value 'doubleAccounting'. "#EC NOTEXT . + class-data C_UNDERLINE_NONE type CHAR20 value 'none'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLE type CHAR20 value 'single'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLEACCOUNTING type CHAR20 value 'singleAccounting'. "#EC NOTEXT . + data FAMILY type INT1 value 2. "#EC NOTEXT . + data ITALIC type FLAG . + data NAME type CHAR255 value 'Calibri'. "#EC NOTEXT . + data SCHEME type ZEXCEL_STYLE_FONT_SCHEME . + data SIZE type INT1 value 11. "#EC NOTEXT . + data STRIKETHROUGH type FLAG . + data UNDERLINE type FLAG . + data UNDERLINE_MODE type CHAR20 . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FONT) type ZEXCEL_S_STYLE_FONT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->color = zcl_excel_style_color=>c_black. + me->scheme = zcl_excel_style_font=>c_scheme_minor. + me->underline_mode = zcl_excel_style_font=>c_underline_single. +ENDMETHOD. + + + + METHOD get_structure. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + es_font-bold = me->bold. + es_font-italic = me->italic. + es_font-underline = me->underline. + es_font-underline_mode = me->underline_mode. + es_font-strikethrough = me->strikethrough. + es_font-size = me->size. + es_font-color = me->color. + es_font-name = me->name. + es_font-family = me->family. + es_font-scheme = me->scheme. + +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_NUMBER_FORMAT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +public section. + + class-data C_FORMAT_NUMBER type ZEXCEL_NUMBER_FORMAT value '0'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_00 type ZEXCEL_NUMBER_FORMAT value '0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP1 type ZEXCEL_NUMBER_FORMAT value '#,##0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP2 type ZEXCEL_NUMBER_FORMAT value '#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE type ZEXCEL_NUMBER_FORMAT value '0%'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE_00 type ZEXCEL_NUMBER_FORMAT value '0.00%'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD2 type ZEXCEL_NUMBER_FORMAT value 'yyyy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD type ZEXCEL_NUMBER_FORMAT value 'yy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DDMMYYYY type ZEXCEL_NUMBER_FORMAT value 'dd/mm/yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYSLASH type ZEXCEL_NUMBER_FORMAT value 'd/m/y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m'. "#EC NOTEXT . + class-data C_FORMAT_DATE_MYMINUS type ZEXCEL_NUMBER_FORMAT value 'm-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX14 type ZEXCEL_NUMBER_FORMAT value 'mm-dd-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX15 type ZEXCEL_NUMBER_FORMAT value 'd-mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX16 type ZEXCEL_NUMBER_FORMAT value 'd-mmm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX17 type ZEXCEL_NUMBER_FORMAT value 'mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX22 type ZEXCEL_NUMBER_FORMAT value 'm/d/yy h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DATETIME type ZEXCEL_NUMBER_FORMAT value 'd/m/y h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME1 type ZEXCEL_NUMBER_FORMAT value 'h:mm AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME2 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME3 type ZEXCEL_NUMBER_FORMAT value 'h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME4 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME5 type ZEXCEL_NUMBER_FORMAT value 'mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME6 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME7 type ZEXCEL_NUMBER_FORMAT value 'i:s.S'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME8 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss@'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yy/mm/dd@'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD_SIMPLE type ZEXCEL_NUMBER_FORMAT value '"$"#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD type ZEXCEL_NUMBER_FORMAT value '$#,##0_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_EUR_SIMPLE type ZEXCEL_NUMBER_FORMAT value '[$EUR ]#,##0.00_-'. "#EC NOTEXT . + data FORMAT_CODE type ZEXCEL_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(EP_NUMBER_FORMAT) type ZEXCEL_NUMBER_FORMAT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +private section. + + class-data C_FORMAT_GENERAL type ZEXCEL_NUMBER_FORMAT value ''. "#EC NOTEXT . + class-data C_FORMAT_TEXT type ZEXCEL_NUMBER_FORMAT value '@'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + format_code = me->c_format_general. +ENDMETHOD. + + + + METHOD get_structure. + ep_number_format = me->format_code. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE_PROTECTION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +public section. + + constants C_PROTECTION_INHERIT type ZEXCEL_PROTECTION value 'inherit'. "#EC NOTEXT + constants C_PROTECTION_PROTECTED type ZEXCEL_PROTECTION value 'protected'. "#EC NOTEXT + constants C_PROTECTION_UNPROTECTED type ZEXCEL_PROTECTION value 'unprotected'. "#EC NOTEXT + data LOCKED type ZEXCEL_PROTECTION . + data HIDDEN type ZEXCEL_PROTECTION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + METHOD constructor. + locked = me->c_protection_inherit. + hidden = me->c_protection_inherit. +ENDMETHOD. + + + + class ZCL_EXCEL_WORKSHEET definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + class-data C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT . + class-data C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT . + class-data C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT . + class-data C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT . + data DEFAULTROWHEIGHT type INT1 value 15. "#EC NOTEXT . + data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . + data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . + data SHEET_STATE type ZEXCEL_SHEET_STATE . + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_ACTIVE_CELL + returning + value(EP_ACTIVE_CELL) type STRING . + methods GET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + exporting + !EP_VALUE type ZEXCEL_CELL_VALUE + !EP_RC type SYSUBRC . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + methods SET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_VALUE type ZEXCEL_CELL_VALUE + !IP_FORMULA type ZEXCEL_CELL_FORMULA optional + !IP_STYLE type ZEXCEL_CELL_STYLE optional . + methods SET_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional + !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional + !IP_TABLE_TITLE type STRING optional + !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' + !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . + methods ADD_NEW_CONDITIONAL_STYLE + returning + value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_COND_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + + data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . + data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + + methods UPDATE_DIMENSION_RANGE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + METHOD add_new_conditional_style. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). +ENDMETHOD. + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + sheet_state = me->c_sheet_state_visible. + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +ENDMETHOD. + + + + METHOD get_active_cell. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + +ENDMETHOD. + + + + + + + METHOD get_cell. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. +ENDMETHOD. + + + + method GET_COND_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->conditional_styles->get_iterator( ). +endmethod. + + + + METHOD get_dimension_range. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + ep_dimension_range = upper_cell-cell_coords. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + +ENDMETHOD. + + + + method GET_GUID. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. + +endmethod. + + + + + + + + METHOD set_cell. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = ZCL_EXCEL_COMMON=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_value = ip_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = ip_style. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = ip_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = ip_style. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content. + SORT sheet_content BY cell_row cell_column. +* me->update_dimension_range( ). + + ENDIF. + +ENDMETHOD. + + + + + + + + + METHOD set_table. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE '2', + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_body_style ). + ADD 1 TO lv_row_int. + ENDLOOP. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDLOOP. + +ENDMETHOD. + + + METHOD update_dimension_range. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +ENDMETHOD. + + + + class ZCL_EXCEL_WORKSHEETS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +public section. + + data ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET value 1. "#EC NOTEXT . + data NAME type ZEXCEL_WORKSHEETS_NAME value 'Worksheets'. "#EC NOTEXT . + + methods ADD + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +private section. + + data WORKSHEETS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + METHOD ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->add( ip_worksheet ). +ENDMETHOD. + + + METHOD clear. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->clear( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT worksheets. + +ENDMETHOD. + + + + + METHOD get. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). +ENDMETHOD. + + + + METHOD get_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= worksheets->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = worksheets->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->remove( ip_worksheet ). +ENDMETHOD. + + + + METHOD size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = worksheets->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + methods CONSTRUCTOR + importing + !IO_EXCEL type ref to ZCL_EXCEL . + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_CALCCHAIN type STRING value 'xl/calcChain.xml'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_CALCCHAIN + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->excel = io_excel. +ENDMETHOD. + + + + METHOD create. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sharedStrings.xml to zip + lv_content = me->create_xl_calcchain( ). + lo_zip->add( name = me->c_xl_calcchain + content = lv_content ). + +********************************************************************** +* STEP 11: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +ENDMETHOD. + + + + METHOD create_content_types. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lv_xml_node_worksheet_pn ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_docprops_app. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_docprops_core. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD CREATE_RELATIONSHIPS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_calcchain. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_calcchain TYPE string VALUE 'calcChain', + lc_xml_node_c TYPE string VALUE 'c', + " Node attributes + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_i TYPE string VALUE 'i', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string, + lv_value_i TYPE string, + lv_sheets_count TYPE i. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create xl/calcChain.xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node calcChain + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_calcchain + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_sheets_count. + MOVE lv_sheets_count TO lv_value_i. + SHIFT lv_value_i RIGHT DELETING TRAILING space. + SHIFT lv_value_i LEFT DELETING LEADING space. + LOOP AT lo_worksheet->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_formula IS NOT INITIAL. + " formula chain node + lo_element = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_i + value = lv_value_i ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_relationships. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + lc_xml_node_rid_calcchain_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml', + lc_xml_node_rid_calcchain_tg TYPE string VALUE 'calcChain.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 1 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_calcchain_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_calcchain_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_sharedstrings. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + + METHOD create_xl_sheet. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional. + + DATA: lv_value TYPE string, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + lv_value = io_worksheet->defaultrowheight. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + lo_element_root->append_child( lo_element ). " sheetFormatPr node + + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = '1:1' ). " <******************************* + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + IF ls_style_mapping-cell_format IS INITIAL. " to avoid errors if no style has been created + IF <ls_sheet_content>-cell_formula IS INITIAL. + ls_style_mapping-cell_format = 'S'. + ELSE. + ls_style_mapping-cell_format = 'F'. + ENDIF. + ENDIF. + " is a shared string and is not a formula + IF ls_style_mapping-cell_format EQ 'S'. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = 's' ). + ENDIF. + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ENDIF. + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF ls_style_mapping-cell_format EQ 'S'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_sheet_rels. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + lc_xml_node_rid_print_id TYPE string VALUE 'rId1', + " Node type + lc_xml_node_rid_print_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', + " Node target + lc_xml_node_rid_print_tg TYPE string VALUE '../printerSettings/printerSettings1.bin'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rid_print_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_print_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_print_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_styles. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + ls_format TYPE zexcel_number_format, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_format = lo_style->number_format->get_structure( ). + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + + IF ls_format IS INITIAL. + ls_cellxfs-numfmtid = 0. " number format + ELSE. + ls_cellxfs-numfmtid = ls_format. " number format + ENDIF. + ls_cellxfs-xfid = 0. + + IF ls_format IS NOT INITIAL. + ls_cellxfs-applynumberformat = 1. + ls_styles_mapping-cell_format = 'I'. + ELSE. + ls_cellxfs-applynumberformat = 0. + ls_styles_mapping-cell_format = 'S'. + ENDIF. + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + " Collect color + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = 'TableStyleMedium9' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = 'PivotStyleLight16' ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_theme. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +ENDMETHOD. + + + + METHOD create_xl_workbook. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + METHOD flag2bool. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +ENDMETHOD. + + + + + METHOD get_shared_string_index. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +ENDMETHOD. + + + + class ZCL_EXCEL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL +*"* do not include other source files here!!! +public section. + + constants C_XLS type ZEXCEL_FORMAT value 'XLS'. "#EC NOTEXT + constants C_XLSX type ZEXCEL_FORMAT value 'XLSX'. "#EC NOTEXT + data PROPERTIES type ref to ZCL_EXCEL_PROPERTIES . + data SECURITY type ref to ZCL_EXCEL_SECURITY . + + methods ADD_NEW_DRAWING + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods ADD_NEW_STYLE + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods ADD_NEW_WORKSHEET + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods CONSTRUCTOR . + methods GET_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_NAME + returning + value(EP_NAME) type ZEXCEL_WORKSHEETS_NAME . + methods GET_WORKSHEETS_SIZE + returning + value(EP_SIZE) type I . + methods SAVE_AS + importing + !IP_FORMAT type ZEXCEL_FORMAT + returning + value(EP_FILE) type XSTRING . + *"* protected components of class ZABAP_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . + data RANGES type ref to ZCL_EXCEL_RANGES . + data STYLES type ref to ZCL_EXCEL_STYLES . + data WORKSHEETS type ref to ZCL_EXCEL_WORKSHEETS . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + METHOD add_new_drawing. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_title = ip_title. + drawings->add( eo_drawing ). +ENDMETHOD. + + + + method ADD_NEW_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Create default style + CREATE OBJECT eo_style. + styles->add( eo_style ). + +endmethod. + + + + + METHOD add_new_worksheet. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_title = ip_title. + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT properties. + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings. + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. + + +ENDMETHOD. + + + + method GET_ACTIVE_WORKSHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + +endmethod. + + + + METHOD GET_DRAWINGS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->drawings->get_iterator( ). +ENDMETHOD. + + + + METHOD GET_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->styles->get_iterator( ). +ENDMETHOD. + + + + METHOD get_worksheets_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->worksheets->get_iterator( ). +ENDMETHOD. + + + + METHOD GET_WORKSHEETS_NAME. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_name = me->worksheets->name. + +ENDMETHOD. + + + + METHOD get_worksheets_size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = me->worksheets->size( ). + +ENDMETHOD. + + + + + METHOD save_as. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lo_excel_writer_2007 TYPE REF TO zcl_excel_writer_2007. + +* Determine the output engine to use + CASE ip_format. + WHEN me->c_xlsx. " XLSX for Office 2007 + CREATE OBJECT lo_excel_writer_2007 EXPORTING io_excel = me. + ep_file = lo_excel_writer_2007->create( ). + WHEN OTHERS. + ENDCASE. + +ENDMETHOD. + + + + class ZCL_EXCEL_COMMON definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +public section. + + class-methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + class-methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* protected components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +private section. + + class-data C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + METHOD convert_column2alpha. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +ENDMETHOD. + + + + + METHOD convert_column2int. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( zcl_excel_common=>c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( zcl_excel_common=>c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - zcl_excel_common=>c_excel_col_module. + ENDIF. + +ENDMETHOD. + + + + class ZCL_EXCEL_DRAWING definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + data X_REFERENCES type CHAR1 . + data Y_REFERENCES type CHAR1 . + data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +private section. + + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + + methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + METHOD CONSTRUCTOR. + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +ENDMETHOD. + + + + + METHOD CONVERT_COLUMN2ALPHA. + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +ENDMETHOD. + + + + + METHOD CONVERT_COLUMN2INT. + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( me->c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( me->c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - me->c_excel_col_module. + ENDIF. + +ENDMETHOD. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + class ZCL_EXCEL_DRAWINGS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD add. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->add( ip_drawing ). +ENDMETHOD. + + + METHOD clear. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->clear( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT drawings. + +ENDMETHOD. + + + + + METHOD get. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_drawing ?= drawings->if_object_collection~get( lv_index ). +ENDMETHOD. + + + + METHOD get_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= drawings->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = drawings->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->remove( ip_drawing ). +ENDMETHOD. + + + + METHOD size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = drawings->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_PROPERTIES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +public section. + + data CREATOR type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data LASTMODIFIEDBY type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data CREATED type TIMESTAMPL . + data MODIFIED type TIMESTAMPL . + data TITLE type ZEXCEL_TITLE value 'Untitled Spreadsheet'. "#EC NOTEXT . + data SUBJECT type ZEXCEL_SUBJECT . + data DESCRIPTION type ZEXCEL_DESCRIPTION . + data KEYWORDS type ZEXCEL_KEYWORDS . + data CATEGORY type ZEXCEL_CATEGORY . + data COMPANY type ZEXCEL_COMPANY value 'Microsoft Corporation'. "#EC NOTEXT . + data APPLICATION type ZEXCEL_APPLICATION value 'Microsoft Excel'. "#EC NOTEXT . + data DOCSECURITY type ZEXCEL_DOCSECURITY value '0'. "#EC NOTEXT . + data SCALECROP type ZEXCEL_SCALECROP value ''. "#EC NOTEXT . + data LINKSUPTODATE type FLAG . + data SHAREDDOC type FLAG . + data HYPERLINKSCHANGED type FLAG . + data APPVERSION type ZEXCEL_APPVERSION value '12.0000'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_PROPERTIES +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + METHOD CONSTRUCTOR. + + DATA: lv_timestamp TYPE timestampl. + + GET TIME STAMP FIELD lv_timestamp. + created = lv_timestamp. + modified = lv_timestamp. + +ENDMETHOD. + + + + class ZCL_EXCEL_RANGE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +public section. + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + method CONSTRUCTOR. +endmethod. + + + + class ZCL_EXCEL_RANGES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_RANGES +*"* do not include other source files here!!! +private section. + + data RANGES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD ADD. + ranges->add( ip_range ). +ENDMETHOD. + + + METHOD CLEAR. + ranges->clear( ). +ENDMETHOD. + + + method CONSTRUCTOR. +endmethod. + + + + + METHOD GET. + eo_range ?= ranges->if_object_collection~get( ip_index ). +ENDMETHOD. + + + + METHOD GET_ITERATOR. + eo_iterator ?= ranges->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD IS_EMPTY. + is_empty = ranges->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD REMOVE. + ranges->remove( ip_range ). +ENDMETHOD. + + + + METHOD SIZE. + ep_size = ranges->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_SECURITY definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SECURITY +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data LOCKREVISION type FLAG . + data LOCKSTRUCTURE type FLAG . + data LOCKWINDOWS type FLAG . + data REVISIONSPASSWORD type ZEXCEL_REVISIONSPASSWORD . + data WORKBOOKPASSWORD type ZEXCEL_WORKBOOKPASSWORD . + + methods CONSTRUCTOR . + methods IS_SECURITY_ENABLED + returning + value(EP_SECURITY_ENABLED) type FLAG . + *"* protected components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + method CONSTRUCTOR. +endmethod. + + + + METHOD IS_SECURITY_ENABLED. + IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. + ep_security_enabled = abap_true. + ENDIF. +ENDMETHOD. + + + + class ZCL_EXCEL_SHEET_SETUP definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants C_PAPERSIZE_LETTER type ZEXCEL_SHEET_PAPER_SIZE value 1. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 2. "#EC NOTEXT + constants C_PAPERSIZE_TABLOID type ZEXCEL_SHEET_PAPER_SIZE value 3. "#EC NOTEXT + constants C_PAPERSIZE_LEDGER type ZEXCEL_SHEET_PAPER_SIZE value 4. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL type ZEXCEL_SHEET_PAPER_SIZE value 5. "#EC NOTEXT + constants C_PAPERSIZE_STATEMENT type ZEXCEL_SHEET_PAPER_SIZE value 6. "#EC NOTEXT + constants C_PAPERSIZE_EXECUTIVE type ZEXCEL_SHEET_PAPER_SIZE value 7. "#EC NOTEXT + constants C_PAPERSIZE_A3 type ZEXCEL_SHEET_PAPER_SIZE value 8. "#EC NOTEXT + constants C_PAPERSIZE_A4 type ZEXCEL_SHEET_PAPER_SIZE value 9. "#EC NOTEXT + constants C_PAPERSIZE_A4_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 10. "#EC NOTEXT + constants C_PAPERSIZE_A5 type ZEXCEL_SHEET_PAPER_SIZE value 11. "#EC NOTEXT + constants C_PAPERSIZE_B4 type ZEXCEL_SHEET_PAPER_SIZE value 12. "#EC NOTEXT + constants C_PAPERSIZE_B5 type ZEXCEL_SHEET_PAPER_SIZE value 13. "#EC NOTEXT + constants C_PAPERSIZE_FOLIO type ZEXCEL_SHEET_PAPER_SIZE value 14. "#EC NOTEXT + constants C_PAPERSIZE_QUARTO type ZEXCEL_SHEET_PAPER_SIZE value 15. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_1 type ZEXCEL_SHEET_PAPER_SIZE value 16. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_2 type ZEXCEL_SHEET_PAPER_SIZE value 17. "#EC NOTEXT + constants C_PAPERSIZE_NOTE type ZEXCEL_SHEET_PAPER_SIZE value 18. "#EC NOTEXT + constants C_PAPERSIZE_NO9_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 19. "#EC NOTEXT + constants C_PAPERSIZE_NO10_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 20. "#EC NOTEXT + constants C_PAPERSIZE_NO11_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 21. "#EC NOTEXT + constants C_PAPERSIZE_NO12_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 22. "#EC NOTEXT + constants C_PAPERSIZE_NO14_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 23. "#EC NOTEXT + constants C_PAPERSIZE_C type ZEXCEL_SHEET_PAPER_SIZE value 24. "#EC NOTEXT + constants C_PAPERSIZE_D type ZEXCEL_SHEET_PAPER_SIZE value 25. "#EC NOTEXT + constants C_PAPERSIZE_E type ZEXCEL_SHEET_PAPER_SIZE value 26. "#EC NOTEXT + constants C_PAPERSIZE_DL_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 27. "#EC NOTEXT + constants C_PAPERSIZE_C5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 28. "#EC NOTEXT + constants C_PAPERSIZE_C3_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 29. "#EC NOTEXT + constants C_PAPERSIZE_C4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 30. "#EC NOTEXT + constants C_PAPERSIZE_C6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 31. "#EC NOTEXT + constants C_PAPERSIZE_C65_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 32. "#EC NOTEXT + constants C_PAPERSIZE_B4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 33. "#EC NOTEXT + constants C_PAPERSIZE_B5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 34. "#EC NOTEXT + constants C_PAPERSIZE_B6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 35. "#EC NOTEXT + constants C_PAPERSIZE_ITALY_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 36. "#EC NOTEXT + constants C_PAPERSIZE_MONARCH_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 37. "#EC NOTEXT + constants C_PAPERSIZE_6_3_4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 38. "#EC NOTEXT + constants C_PAPERSIZE_US_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 39. "#EC NOTEXT + constants C_PAPERSIZE_DE_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 40. "#EC NOTEXT + constants C_PAPERSIZE_DE_LEG_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 41. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B4 type ZEXCEL_SHEET_PAPER_SIZE value 42. "#EC NOTEXT + constants C_PAPERSIZE_JPN_DBL_POSTCARD type ZEXCEL_SHEET_PAPER_SIZE value 43. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_1 type ZEXCEL_SHEET_PAPER_SIZE value 44. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_2 type ZEXCEL_SHEET_PAPER_SIZE value 45. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_3 type ZEXCEL_SHEET_PAPER_SIZE value 46. "#EC NOTEXT + constants C_PAPERSIZE_INVITE_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 47. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 48. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 49. "#EC NOTEXT + constants C_PAPERSIZE_TABL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 50. "#EC NOTEXT + constants C_PAPERSIZE_A4_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 51. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 52. "#EC NOTEXT + constants C_PAPERSIZE_A4_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 53. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 54. "#EC NOTEXT + constants C_PAPERSIZE_SUPERA_A4_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 55. "#EC NOTEXT + constants C_PAPERSIZE_SUPERB_A3_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 56. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 57. "#EC NOTEXT + constants C_PAPERSIZE_A4_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 58. "#EC NOTEXT + constants C_PAPERSIZE_A5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 59. "#EC NOTEXT + constants C_PAPERSIZE_JIS_B5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 60. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 61. "#EC NOTEXT + constants C_PAPERSIZE_A5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 62. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 63. "#EC NOTEXT + constants C_PAPERSIZE_A2_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 64. "#EC NOTEXT + constants C_PAPERSIZE_A3_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 65. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 66. "#EC NOTEXT + constants C_ORIENTATION_DEFAULT type ZEXCEL_SHEET_ORIENATATION value 'default'. "#EC NOTEXT + constants C_ORIENTATION_LANDSCAPE type ZEXCEL_SHEET_ORIENATATION value 'landscape'. "#EC NOTEXT + constants C_ORIENTATION_PORTRAIT type ZEXCEL_SHEET_ORIENATATION value 'portrait'. "#EC NOTEXT + data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD constructor. + orientation = me->c_orientation_default. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +public section. + + data FONT type ref to ZCL_EXCEL_STYLE_FONT . + data FILL type ref to ZCL_EXCEL_STYLE_FILL . + data BORDERS type ref to ZCL_EXCEL_STYLE_BORDERS . + data NUMBER_FORMAT type ref to ZCL_EXCEL_STYLE_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_CELL_STYLE . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +private section. + + data ALIGNMENT type ref to ZCL_EXCEL_STYLE_ALIGNMENT . + data PROTECTION type ref to ZCL_EXCEL_STYLE_PROTECTION . + data GUID type ZEXCEL_CELL_STYLE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT font. + CREATE OBJECT fill. + CREATE OBJECT borders. + CREATE OBJECT alignment. + CREATE OBJECT number_format. + CREATE OBJECT protection. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + +ENDMETHOD. + + + + METHOD get_guid. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods SIZE + returning + value(EP_SIZE) type I . + methods REGISTER_NEW_STYLE + importing + !IO_STYLE type ref to ZCL_EXCEL_STYLE + returning + value(EP_STYLE_CODE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +private section. + + data STYLES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD add. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->add( ip_style ). +ENDMETHOD. + + + METHOD clear. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->clear( ). +ENDMETHOD. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT styles. +ENDMETHOD. + + + + + METHOD get. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_style ?= styles->if_object_collection~get( ip_index ). +ENDMETHOD. + + + + METHOD get_iterator. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= styles->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = styles->if_object_collection~is_empty( ). +ENDMETHOD. + + + + + METHOD register_new_style. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->add( io_style ). + ep_style_code = me->size( ) - 1. "style count starts from 0 +ENDMETHOD. + + + + METHOD remove. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->remove( ip_style ). +ENDMETHOD. + + + + METHOD size. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = styles->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_STYLES_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_STYLE_CONDITIONAL) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data STYLES_CONDITIONAL type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + METHOD add. + styles_conditional->add( ip_style_conditional ). +ENDMETHOD. + + + METHOD clear. + styles_conditional->clear( ). +ENDMETHOD. + + + METHOD constructor. + + CREATE OBJECT styles_conditional. + +ENDMETHOD. + + + + + METHOD get. + DATA lv_index TYPE i. + lv_index = ip_index. + eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). +ENDMETHOD. + + + + METHOD get_iterator. + eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. + is_empty = styles_conditional->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. + styles_conditional->remove( ip_style_conditional ). +ENDMETHOD. + + + + METHOD size. + ep_size = styles_conditional->if_object_collection~size( ). +ENDMETHOD. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel1. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HelloWorld.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel2. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +CREATE OBJECT lo_border_light. +lo_border_light->border_color = zcl_excel_style_color=>c_gray. +lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. +" Create a bold / italic style +lo_style_bold = lo_excel->add_new_style( ). +lo_style_bold->font->bold = abap_true. +lo_style_bold->font->italic = abap_true. +lo_style_bold->font->color = zcl_excel_style_color=>c_red. +lv_style_bold_guid = lo_style_bold->get_guid( ). +" Create an underline double style +lo_style_underline = lo_excel->add_new_style( ). +lo_style_underline->font->underline = abap_true. +lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. +lv_style_underline_guid = lo_style_underline->get_guid( ). +" Create filled style +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lv_style_filled_guid = lo_style_filled->get_guid( ). +" Create border with button effects +lo_style_button = lo_excel->add_new_style( ). +lo_style_button->borders->right = lo_border_dark. +lo_style_button->borders->down = lo_border_dark. +lo_style_button->borders->left = lo_border_light. +lo_style_button->borders->top = lo_border_light. +lv_style_button_guid = lo_style_button->get_guid( ). +"Create style with border +lo_style_border = lo_excel->add_new_style( ). +lo_style_border->borders->allborders = lo_border_dark. +lv_style_border_guid = lo_style_border->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Styles'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Styles.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel3. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_header TYPE REF TO zcl_excel_style, + lo_style_body TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_header_guid TYPE zexcel_cell_style, + lv_style_body_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +" Create filled style +lo_style_header = lo_excel->add_new_style( ). +lo_style_header->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_header->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lo_style_header->borders->allborders = lo_border_dark. +lv_style_header_guid = lo_style_header->get_guid( ). +"Create style with border +lo_style_body = lo_excel->add_new_style( ). +lo_style_body->borders->allborders = lo_border_dark. +lv_style_body_guid = lo_style_body->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. +lo_worksheet->set_table( ip_table = lt_test + ip_hdr_style = lv_style_header_guid + ip_body_style = lv_style_body_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTab.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel4. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). + +lo_worksheet = lo_excel->add_new_worksheet( ). +lo_worksheet->title = 'Sheet2'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Sheets.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel5. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '100' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '1000' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '150' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '500' ip_style = lv_style_number_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\CondFormatting.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel6. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '100' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '1000' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '150' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '500' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '1760' ip_formula = 'SUM(C4:C8)' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Formula.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel7. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 5 + ip_stop_column = 'B' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 5 + ip_stop_column = 'C' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3flags. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 5 + ip_stop_column = 'D' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 5 + ip_stop_column = 'E' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 5 + ip_stop_column = 'F' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3signs. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'G' + ip_start_row = 5 + ip_stop_column = 'G' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'H' + ip_start_row = 5 + ip_stop_column = 'H' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'I' + ip_start_row = 5 + ip_stop_column = 'I' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 12 + ip_stop_column = 'B' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 12 + ip_stop_column = 'C' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 12 + ip_stop_column = 'D' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 12 + ip_stop_column = 'E' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 12 + ip_stop_column = 'F' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 19 + ip_stop_column = 'B' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 19 + ip_stop_column = 'C' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 19 + ip_stop_column = 'D' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5quarters. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 19 + ip_stop_column = 'E' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'E' ip_value = 'C_ICONSET_5QUARTERS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Iconset.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/NUGG_ABAP2XLSX_V_1_1.nugg b/build/NUGG_ABAP2XLSX_V_1_1.nugg new file mode 100644 index 0000000..ab41aae --- /dev/null +++ b/build/NUGG_ABAP2XLSX_V_1_1.nugg @@ -0,0 +1,8789 @@ + + + + class ZCL_EXCEL_STYLES_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_STYLE_CONDITIONAL) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data STYLES_CONDITIONAL type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + styles_conditional->add( ip_style_conditional ). +endmethod. + + + method CLEAR. + styles_conditional->clear( ). +endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT styles_conditional. + +endmethod. + + + + + method GET. + DATA lv_index TYPE i. + lv_index = ip_index. + eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = styles_conditional->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + styles_conditional->remove( ip_style_conditional ). +endmethod. + + + + method SIZE. + ep_size = styles_conditional->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_STYLE_ALIGNMENT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data HORIZONTAL type ZEXCEL_ALIGNMENT . + data VERTICAL type ZEXCEL_ALIGNMENT . + data TEXTROTATION type ZEXCEL_TEXT_ROTATION value 0. "#EC NOTEXT . + data WRAPTEXT type FLAG . + data SHRINKTOFIT type FLAG . + data INDENT type ZEXCEL_INDENT value 0. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +private section. + + constants C_HORIZONTAL_GENERAL type ZEXCEL_ALIGNMENT value 'general'. "#EC NOTEXT + constants C_HORIZONTAL_LEFT type ZEXCEL_ALIGNMENT value 'left'. "#EC NOTEXT + constants C_HORIZONTAL_RIGHT type ZEXCEL_ALIGNMENT value 'right'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER_CONTINUOUS type ZEXCEL_ALIGNMENT value 'centerContinuous'. "#EC NOTEXT + constants C_HORIZONTAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + constants C_VERTICAL_BOTTOM type ZEXCEL_ALIGNMENT value 'bottom'. "#EC NOTEXT + constants C_VERTICAL_TOP type ZEXCEL_ALIGNMENT value 'top'. "#EC NOTEXT + constants C_VERTICAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_VERTICAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + horizontal = me->c_horizontal_general. + vertical = me->c_vertical_bottom. + wrapText = abap_false. + shrinkToFit = abap_false. +endmethod. + + + + class ZCL_EXCEL_STYLE_BORDER definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +public section. + + data BORDER_STYLE type ZEXCEL_BORDER . + data BORDER_COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_BORDER_NONE type ZEXCEL_BORDER value 'none'. "#EC NOTEXT . + class-data C_BORDER_DASHDOT type ZEXCEL_BORDER value 'dashDot'. "#EC NOTEXT . + class-data C_BORDER_DASHDOTDOT type ZEXCEL_BORDER value 'dashDotDot'. "#EC NOTEXT . + class-data C_BORDER_DASHED type ZEXCEL_BORDER value 'dashed'. "#EC NOTEXT . + class-data C_BORDER_DOTTED type ZEXCEL_BORDER value 'dotted'. "#EC NOTEXT . + class-data C_BORDER_DOUBLE type ZEXCEL_BORDER value 'double'. "#EC NOTEXT . + class-data C_BORDER_HAIR type ZEXCEL_BORDER value 'hair'. "#EC NOTEXT . + class-data C_BORDER_MEDIUM type ZEXCEL_BORDER value 'medium'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOT type ZEXCEL_BORDER value 'mediumDashDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOTDOT type ZEXCEL_BORDER value 'mediumDashDotDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHED type ZEXCEL_BORDER value 'mediumDashed'. "#EC NOTEXT . + class-data C_BORDER_SLANTDASHDOT type ZEXCEL_BORDER value 'slantDashDot'. "#EC NOTEXT . + class-data C_BORDER_THICK type ZEXCEL_BORDER value 'thick'. "#EC NOTEXT . + class-data C_BORDER_THIN type ZEXCEL_BORDER value 'thin'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + border_style = zcl_excel_style_border=>c_border_none. +endmethod. + + + + class ZCL_EXCEL_STYLE_BORDERS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +public section. + + data LEFT type ref to ZCL_EXCEL_STYLE_BORDER . + data RIGHT type ref to ZCL_EXCEL_STYLE_BORDER . + data TOP type ref to ZCL_EXCEL_STYLE_BORDER . + data DOWN type ref to ZCL_EXCEL_STYLE_BORDER . + data DIAGONAL type ref to ZCL_EXCEL_STYLE_BORDER . + data ALLBORDERS type ref to ZCL_EXCEL_STYLE_BORDER . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_BORDER . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +private section. + + constants C_DIAGONAL_NONE type ZEXCEL_DIAGONAL value 0. "#EC NOTEXT + constants C_DIAGONAL_UP type ZEXCEL_DIAGONAL value 1. "#EC NOTEXT + constants C_DIAGONAL_DOWN type ZEXCEL_DIAGONAL value 2. "#EC NOTEXT + constants C_DIAGONAL_BOTH type ZEXCEL_DIAGONAL value 3. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method CONSTRUCTOR. +endmethod. + + + + method GET_STRUCTURE. + +* Check if all borders is set otherwise check single border + IF me->allborders IS BOUND. + es_fill-left_color = me->allborders->border_color. + es_fill-left_style = me->allborders->border_style. + es_fill-right_color = me->allborders->border_color. + es_fill-right_style = me->allborders->border_style. + es_fill-top_color = me->allborders->border_color. + es_fill-top_style = me->allborders->border_style. + es_fill-bottom_color = me->allborders->border_color. + es_fill-bottom_style = me->allborders->border_style. + ELSE. + IF me->left IS BOUND. + es_fill-left_color = me->left->border_color. + es_fill-left_style = me->left->border_style. + ENDIF. + IF me->right IS BOUND. + es_fill-right_color = me->right->border_color. + es_fill-right_style = me->right->border_style. + ENDIF. + IF me->top IS BOUND. + es_fill-top_color = me->top->border_color. + es_fill-top_style = me->top->border_style. + ENDIF. + IF me->down IS BOUND. + es_fill-bottom_color = me->down->border_color. + es_fill-bottom_style = me->down->border_style. + ENDIF. + ENDIF. + +* Check if diagonal is set + IF me->diagonal IS BOUND. + es_fill-diagonal_color = me->diagonal->border_color. + es_fill-diagonal_style = me->diagonal->border_style. + ENDIF. + +endmethod. + + + + class ZCL_EXCEL_STYLE_COLOR definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +public section. + + class-data C_BLACK type ZEXCEL_STYLE_COLOR_ARGB value 'FF000000'. "#EC NOTEXT . + class-data C_BLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF0000FF'. "#EC NOTEXT . + class-data C_DARKBLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF000080'. "#EC NOTEXT . + class-data C_DARKGREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF008000'. "#EC NOTEXT . + class-data C_DARKRED type ZEXCEL_STYLE_COLOR_ARGB value 'FF800000'. "#EC NOTEXT . + class-data C_DARKYELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FF808000'. "#EC NOTEXT . + class-data C_GRAY type ZEXCEL_STYLE_COLOR_ARGB value 'FFCCCCCC'. "#EC NOTEXT . + class-data C_GREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF00FF00'. "#EC NOTEXT . + class-data C_RED type ZEXCEL_STYLE_COLOR_ARGB value 'FFFF0000'. "#EC NOTEXT . + class-data C_WHITE type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFFFF'. "#EC NOTEXT . + class-data C_YELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFF00'. "#EC NOTEXT . + + methods CONSTRUCTOR . + class-methods CREATE_NEW_ARGB + importing + !IP_RED type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_GREEN type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_BLU type ZEXCEL_STYLE_COLOR_COMPONENT + returning + value(EP_COLOR_ARGB) type ZEXCEL_STYLE_COLOR_ARGB . + *"* protected components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +private section. + + class-data C_ALPHA type CHAR2 value 'FF'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +endmethod. + + + + + + + method CREATE_NEW_ARGB. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. + +endmethod. + + + + class ZCL_EXCEL_STYLE_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +public section. + + class-data C_ICONSET_3ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '3Arrows'. "#EC NOTEXT . + class-data C_ICONSET_3ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '3ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_3FLAGS type ZEXCEL_CONDITION_RULE_ICONSET value '3Flags'. "#EC NOTEXT . + class-data C_ICONSET_3SIGNS type ZEXCEL_CONDITION_RULE_ICONSET value '3Signs'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols2'. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value ''. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3TrafficLights2'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '4Arrows'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '4ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_4RATING type ZEXCEL_CONDITION_RULE_ICONSET value '4Rating'. "#EC NOTEXT . + class-data C_ICONSET_4REDTOBLACK type ZEXCEL_CONDITION_RULE_ICONSET value '4RedToBlack'. "#EC NOTEXT . + class-data C_ICONSET_4TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value '4TrafficLights'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '5Arrows'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '5ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_5QUARTERS type ZEXCEL_CONDITION_RULE_ICONSET value '5Quarters'. "#EC NOTEXT . + class-data C_ICONSET_5RATING type ZEXCEL_CONDITION_RULE_ICONSET value '5Rating'. "#EC NOTEXT . + class-data C_OPERATOR_BEGINSWITH type ZEXCEL_CONDITION_OPERATOR value 'beginsWith'. "#EC NOTEXT . + class-data C_OPERATOR_BETWEEN type ZEXCEL_CONDITION_OPERATOR value 'between'. "#EC NOTEXT . + class-data C_OPERATOR_CONTAINSTEXT type ZEXCEL_CONDITION_OPERATOR value 'containsText'. "#EC NOTEXT . + class-data C_OPERATOR_ENDSWITH type ZEXCEL_CONDITION_OPERATOR value 'endsWith'. "#EC NOTEXT . + class-data C_OPERATOR_EQUAL type ZEXCEL_CONDITION_OPERATOR value 'equal'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHAN type ZEXCEL_CONDITION_OPERATOR value 'greaterThan'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'greaterThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHAN type ZEXCEL_CONDITION_OPERATOR value 'lessThan'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'lessThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_NONE type ZEXCEL_CONDITION_OPERATOR value ''. "#EC NOTEXT . + class-data C_OPERATOR_NOTCONTAINS type ZEXCEL_CONDITION_OPERATOR value 'notContains'. "#EC NOTEXT . + class-data C_OPERATOR_NOTEQUAL type ZEXCEL_CONDITION_OPERATOR value 'notEqual'. "#EC NOTEXT . + class-data C_RULE_CELLIS type ZEXCEL_CONDITION_RULE value 'cellIs'. "#EC NOTEXT . + class-data C_RULE_CONTAINSTEXT type ZEXCEL_CONDITION_RULE value 'containsText'. "#EC NOTEXT . + class-data C_RULE_EXPRESSION type ZEXCEL_CONDITION_RULE value 'expression'. "#EC NOTEXT . + class-data C_RULE_ICONSET type ZEXCEL_CONDITION_RULE value 'iconSet'. "#EC NOTEXT . + class-data C_RULE_NONE type ZEXCEL_CONDITION_RULE value 'none'. "#EC NOTEXT . + data FORMULA type ZEXCEL_STYLE_FORMULA . + data ICONSET type ZEXCEL_CONDITION_RULE_ICONSET . + data OPERATOR type ZEXCEL_CONDITION_OPERATOR . + data PRIORITY type ZEXCEL_STYLE_PRIORITY value 1. "#EC NOTEXT . + data RULE type ZEXCEL_CONDITION_RULE . + + methods CONSTRUCTOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods SET_RANGE + importing + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data START_CELL type ZEXCEL_S_CELL_DATA . + data STOP_CELL type ZEXCEL_S_CELL_DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + rule = me->c_rule_none. + operator = me->c_operator_none. +* inizialize dimension range + stop_cell-cell_row = 1. + stop_cell-cell_column = 1. + start_cell-cell_row = 1. + start_cell-cell_column = 1. +endmethod. + + + + method GET_DIMENSION_RANGE. + IF stop_cell EQ start_cell. "only one cell + ep_dimension_range = start_cell-cell_coords. + ELSE. + CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. + ENDIF. +endmethod. + + + + + + + method SET_RANGE. + DATA: lv_column TYPE zexcel_cell_column, + lv_row_alpha TYPE string. + + lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). + stop_cell-cell_row = 1. + stop_cell-cell_column = lv_column. + lv_row_alpha = ip_stop_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. + + lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). + start_cell-cell_row = 1. + start_cell-cell_column = lv_column. + lv_row_alpha = ip_start_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. +endmethod. + + + + class ZCL_EXCEL_STYLE_FILL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +public section. + + class-data C_FILL_NONE type ZEXCEL_FILL_TYPE value 'none'. "#EC NOTEXT . + class-data C_FILL_SOLID type ZEXCEL_FILL_TYPE value 'solid'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_LINEAR type ZEXCEL_FILL_TYPE value 'linear'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_PATH type ZEXCEL_FILL_TYPE value 'path'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKDOWN type ZEXCEL_FILL_TYPE value 'darkDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRAY type ZEXCEL_FILL_TYPE value 'darkGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRID type ZEXCEL_FILL_TYPE value 'darkGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKHORIZONTAL type ZEXCEL_FILL_TYPE value 'darkHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKTRELLIS type ZEXCEL_FILL_TYPE value 'darkTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKUP type ZEXCEL_FILL_TYPE value 'darkUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKVERTICAL type ZEXCEL_FILL_TYPE value 'darkVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY0625 type ZEXCEL_FILL_TYPE value 'gray0625'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY125 type ZEXCEL_FILL_TYPE value 'gray125'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTDOWN type ZEXCEL_FILL_TYPE value 'lightDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRAY type ZEXCEL_FILL_TYPE value 'lightGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRID type ZEXCEL_FILL_TYPE value 'lightGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTHORIZONTAL type ZEXCEL_FILL_TYPE value 'lightHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTTRELLIS type ZEXCEL_FILL_TYPE value 'lightTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTUP type ZEXCEL_FILL_TYPE value 'lightUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTVERTICAL type ZEXCEL_FILL_TYPE value 'lightVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_MEDIUMGRAY type ZEXCEL_FILL_TYPE value 'mediumGray'. "#EC NOTEXT . + data FILLTYPE type ZEXCEL_FILL_TYPE . + data ROTATION type ZEXCEL_ROTATION . + data FGCOLOR type ZEXCEL_STYLE_COLOR_ARGB . + data BGCOLOR type ZEXCEL_STYLE_COLOR_ARGB value '64'. "#EC NOTEXT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_FILL . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + filltype = zcl_excel_style_fill=>c_fill_none. + rotation = 0. +endmethod. + + + + method GET_STRUCTURE. + es_fill-rotation = me->rotation. + es_fill-filltype = me->filltype. + es_fill-fgColor = me->fgColor. + es_fill-bgColor = me->bgColor. +endmethod. + + + + class ZCL_EXCEL_STYLE_FONT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data BOLD type FLAG . + data COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_SCHEME_MAJOR type ZEXCEL_STYLE_FONT_SCHEME value 'major'. "#EC NOTEXT . + class-data C_SCHEME_MINOR type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLE type CHAR20 value 'double'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLEACCOUNTING type CHAR20 value 'doubleAccounting'. "#EC NOTEXT . + class-data C_UNDERLINE_NONE type CHAR20 value 'none'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLE type CHAR20 value 'single'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLEACCOUNTING type CHAR20 value 'singleAccounting'. "#EC NOTEXT . + data FAMILY type INT1 value 2. "#EC NOTEXT . + data ITALIC type FLAG . + data NAME type CHAR255 value 'Calibri'. "#EC NOTEXT . + data SCHEME type ZEXCEL_STYLE_FONT_SCHEME . + data SIZE type INT1 value 11. "#EC NOTEXT . + data STRIKETHROUGH type FLAG . + data UNDERLINE type FLAG . + data UNDERLINE_MODE type CHAR20 . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FONT) type ZEXCEL_S_STYLE_FONT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->color = zcl_excel_style_color=>c_black. + me->scheme = zcl_excel_style_font=>c_scheme_minor. + me->underline_mode = zcl_excel_style_font=>c_underline_single. +endmethod. + + + + method GET_STRUCTURE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + es_font-bold = me->bold. + es_font-italic = me->italic. + es_font-underline = me->underline. + es_font-underline_mode = me->underline_mode. + es_font-strikethrough = me->strikethrough. + es_font-size = me->size. + es_font-color = me->color. + es_font-name = me->name. + es_font-family = me->family. + es_font-scheme = me->scheme. + +endmethod. + + + + class ZCL_EXCEL_STYLE_NUMBER_FORMAT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +public section. + + class-data C_FORMAT_NUMBER type ZEXCEL_NUMBER_FORMAT value '0'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_00 type ZEXCEL_NUMBER_FORMAT value '0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP1 type ZEXCEL_NUMBER_FORMAT value '#,##0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP2 type ZEXCEL_NUMBER_FORMAT value '#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE type ZEXCEL_NUMBER_FORMAT value '0%'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE_00 type ZEXCEL_NUMBER_FORMAT value '0.00%'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD2 type ZEXCEL_NUMBER_FORMAT value 'yyyy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD type ZEXCEL_NUMBER_FORMAT value 'yy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DDMMYYYY type ZEXCEL_NUMBER_FORMAT value 'dd/mm/yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYSLASH type ZEXCEL_NUMBER_FORMAT value 'd/m/y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m'. "#EC NOTEXT . + class-data C_FORMAT_DATE_MYMINUS type ZEXCEL_NUMBER_FORMAT value 'm-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX14 type ZEXCEL_NUMBER_FORMAT value 'mm-dd-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX15 type ZEXCEL_NUMBER_FORMAT value 'd-mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX16 type ZEXCEL_NUMBER_FORMAT value 'd-mmm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX17 type ZEXCEL_NUMBER_FORMAT value 'mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX22 type ZEXCEL_NUMBER_FORMAT value 'm/d/yy h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DATETIME type ZEXCEL_NUMBER_FORMAT value 'd/m/y h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME1 type ZEXCEL_NUMBER_FORMAT value 'h:mm AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME2 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME3 type ZEXCEL_NUMBER_FORMAT value 'h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME4 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME5 type ZEXCEL_NUMBER_FORMAT value 'mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME6 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME7 type ZEXCEL_NUMBER_FORMAT value 'i:s.S'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME8 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss@'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yy/mm/dd@'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD_SIMPLE type ZEXCEL_NUMBER_FORMAT value '"$"#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD type ZEXCEL_NUMBER_FORMAT value '$#,##0_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_EUR_SIMPLE type ZEXCEL_NUMBER_FORMAT value '[$EUR ]#,##0.00_-'. "#EC NOTEXT . + data FORMAT_CODE type ZEXCEL_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(EP_NUMBER_FORMAT) type ZEXCEL_NUMBER_FORMAT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +private section. + + class-data C_FORMAT_GENERAL type ZEXCEL_NUMBER_FORMAT value ''. "#EC NOTEXT . + class-data C_FORMAT_TEXT type ZEXCEL_NUMBER_FORMAT value '@'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + format_code = me->c_format_general. +endmethod. + + + + method GET_STRUCTURE. + ep_number_format = me->format_code. +endmethod. + + + + class ZCL_EXCEL_STYLE_PROTECTION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +public section. + + constants C_PROTECTION_INHERIT type ZEXCEL_PROTECTION value 'inherit'. "#EC NOTEXT + constants C_PROTECTION_PROTECTED type ZEXCEL_PROTECTION value 'protected'. "#EC NOTEXT + constants C_PROTECTION_UNPROTECTED type ZEXCEL_PROTECTION value 'unprotected'. "#EC NOTEXT + data LOCKED type ZEXCEL_PROTECTION . + data HIDDEN type ZEXCEL_PROTECTION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + method CONSTRUCTOR. + locked = me->c_protection_inherit. + hidden = me->c_protection_inherit. +endmethod. + + + + class ZCL_EXCEL_WORKSHEET definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + class-data C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT . + class-data C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT . + class-data C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT . + class-data C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT . + data DEFAULTROWHEIGHT type INT1 value 15. "#EC NOTEXT . + data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . + data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . + data SHEET_STATE type ZEXCEL_SHEET_STATE . + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + + methods ADD_NEW_CONDITIONAL_STYLE + returning + value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods ADD_NEW_DATA_VALIDATION + returning + value(EO_DATA_VALIDATION) type ref to ZCL_EXCEL_DATA_VALIDATION . + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_ACTIVE_CELL + returning + value(EP_ACTIVE_CELL) type STRING . + methods GET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + exporting + !EP_VALUE type ZEXCEL_CELL_VALUE + !EP_RC type SYSUBRC . + methods GET_COND_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DATA_VALIDATIONS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods GET_GUID + returning + value(EP_GUID) type OLTPGUID16 . + methods SET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_VALUE type ZEXCEL_CELL_VALUE + !IP_FORMULA type ZEXCEL_CELL_FORMULA optional + !IP_STYLE type ZEXCEL_CELL_STYLE optional . + methods SET_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional + !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional + !IP_TABLE_TITLE type STRING optional + !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' + !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . + methods GET_DATA_VALIDATIONS_SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + + data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . + data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . + data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS . + data GUID type OLTPGUID16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + + methods UPDATE_DIMENSION_RANGE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + method ADD_NEW_CONDITIONAL_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). +endmethod. + + + + method ADD_NEW_DATA_VALIDATION. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT eo_data_validation. + data_validations->add( eo_data_validation ). +endmethod. + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + sheet_state = me->c_sheet_state_visible. + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + CREATE OBJECT data_validations. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +ENDMETHOD. + + + + method GET_ACTIVE_CELL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + +endmethod. + + + + + + + method GET_CELL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. +endmethod. + + + + method GET_COND_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->conditional_styles->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->data_validations->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_SIZE. + ep_size = me->data_validations->size( ). +endmethod. + + + + method GET_DIMENSION_RANGE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + ep_dimension_range = upper_cell-cell_coords. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + +endmethod. + + + + method GET_GUID. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. + +endmethod. + + + + + + + + method SET_CELL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = ZCL_EXCEL_COMMON=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_value = ip_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = ip_style. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = ip_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = ip_style. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content. + SORT sheet_content BY cell_row cell_column. +* me->update_dimension_range( ). + + ENDIF. + +endmethod. + + + + + + + + + method SET_TABLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE '2', + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_body_style ). + ADD 1 TO lv_row_int. + ENDLOOP. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDLOOP. + +endmethod. + + + method UPDATE_DIMENSION_RANGE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +endmethod. + + + + class ZCL_EXCEL_WORKSHEETS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +public section. + + data ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET value 1. "#EC NOTEXT . + data NAME type ZEXCEL_WORKSHEETS_NAME value 'Worksheets'. "#EC NOTEXT . + + methods ADD + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +private section. + + data WORKSHEETS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->add( ip_worksheet ). +endmethod. + + + method CLEAR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->clear( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT worksheets. + +endmethod. + + + + + method GET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= worksheets->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = worksheets->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->remove( ip_worksheet ). +endmethod. + + + + method SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = worksheets->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + methods CONSTRUCTOR + importing + !IO_EXCEL type ref to ZCL_EXCEL . + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_CALCCHAIN type STRING value 'xl/calcChain.xml'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_CALCCHAIN + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->excel = io_excel. +endmethod. + + + + method CREATE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sharedStrings.xml to zip + lv_content = me->create_xl_calcchain( ). + lo_zip->add( name = me->c_xl_calcchain + content = lv_content ). + +********************************************************************** +* STEP 11: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +endmethod. + + + + method CREATE_CONTENT_TYPES. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lv_xml_node_worksheet_pn ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_APP. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_CORE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_RELATIONSHIPS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_CALCCHAIN. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_calcchain TYPE string VALUE 'calcChain', + lc_xml_node_c TYPE string VALUE 'c', + " Node attributes + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_i TYPE string VALUE 'i', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string, + lv_value_i TYPE string, + lv_sheets_count TYPE i. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create xl/calcChain.xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node calcChain + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_calcchain + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_sheets_count. + MOVE lv_sheets_count TO lv_value_i. + SHIFT lv_value_i RIGHT DELETING TRAILING space. + SHIFT lv_value_i LEFT DELETING LEADING space. + LOOP AT lo_worksheet->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_formula IS NOT INITIAL. + " formula chain node + lo_element = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_i + value = lv_value_i ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_RELATIONSHIPS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + lc_xml_node_rid_calcchain_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml', + lc_xml_node_rid_calcchain_tg TYPE string VALUE 'calcChain.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 1 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_calcchain_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_calcchain_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_SHAREDSTRINGS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + + METHOD create_xl_sheet. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', + lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', + lc_xml_node_formula1 TYPE string VALUE 'formula1', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', + lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', + lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_data_validation TYPE REF TO zcl_excel_data_validation. + + DATA: lv_value TYPE string, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + lv_value = io_worksheet->defaultrowheight. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + lo_element_root->append_child( lo_element ). " sheetFormatPr node + + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = '1:1' ). " <******************************* + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + IF ls_style_mapping-cell_format IS INITIAL. " to avoid errors if no style has been created + IF <ls_sheet_content>-cell_formula IS INITIAL. + ls_style_mapping-cell_format = 'S'. + ELSE. + ls_style_mapping-cell_format = 'F'. + ENDIF. + ENDIF. + " is a shared string and is not a formula + IF ls_style_mapping-cell_format EQ 'S'. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = 's' ). + ENDIF. + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ENDIF. + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF ls_style_mapping-cell_format EQ 'S'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + + + IF io_worksheet->get_data_validations_size( ) GT 0. + " dataValidations node + lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations + parent = lo_document ). + " Conditional formatting node + lo_iterator = io_worksheet->get_data_validations_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_data_validation ?= lo_iterator->get_next( ). + " dataValidation node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation + parent = lo_document ). + lv_value = lo_data_validation->type. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + IF lo_data_validation->allowblank EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank + value = lv_value ). + IF lo_data_validation->showinputmessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage + value = lv_value ). + IF lo_data_validation->showerrormessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage + value = lv_value ). + lv_cell_row_s = lo_data_validation->cell_row. + SHIFT lv_cell_row_s RIGHT DELETING TRAILING space. + SHIFT lv_cell_row_s LEFT DELETING LEADING space. + CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + " formula1 node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 + parent = lo_document ). + lv_value = lo_data_validation->value. + lo_element_3->set_value( lv_value ). + + lo_element_2->append_child( lo_element_3 ). " formula1 node + + lo_element->append_child( lo_element_2 ). " dataValidation node + ENDWHILE. + lo_element_root->append_child( lo_element ). " dataValidations node + ENDIF. + + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + method CREATE_XL_SHEET_RELS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + lc_xml_node_rid_print_id TYPE string VALUE 'rId1', + " Node type + lc_xml_node_rid_print_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', + " Node target + lc_xml_node_rid_print_tg TYPE string VALUE '../printerSettings/printerSettings1.bin'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rid_print_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_print_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_print_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_STYLES. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + ls_format TYPE zexcel_number_format, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_format = lo_style->number_format->get_structure( ). + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + + IF ls_format IS INITIAL. + ls_cellxfs-numfmtid = 0. " number format + ELSE. + ls_cellxfs-numfmtid = ls_format. " number format + ENDIF. + ls_cellxfs-xfid = 0. + + IF ls_format IS NOT INITIAL. + ls_cellxfs-applynumberformat = 1. + ls_styles_mapping-cell_format = 'I'. + ELSE. + ls_cellxfs-applynumberformat = 0. + ls_styles_mapping-cell_format = 'S'. + ENDIF. + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + " Collect color + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = 'TableStyleMedium9' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = 'PivotStyleLight16' ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_THEME. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +endmethod. + + + + METHOD create_xl_workbook. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + + " ranges node + lo_element = lo_document->create_simple_element( name = lc_xml_node_definedNames + parent = lo_document ). + lo_iterator = excel->get_ranges_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedName + parent = lo_document ). + lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( lv_value ). + lo_element->append_child( lo_sub_element ). " range node + ENDWHILE. + lo_element_root->append_child( lo_element )." ranges node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + method FLAG2BOOL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +endmethod. + + + + + method GET_SHARED_STRING_INDEX. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +endmethod. + + + + class ZCL_EXCEL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL +*"* do not include other source files here!!! +public section. + + constants C_XLS type ZEXCEL_FORMAT value 'XLS'. "#EC NOTEXT + constants C_XLSX type ZEXCEL_FORMAT value 'XLSX'. "#EC NOTEXT + data PROPERTIES type ref to ZCL_EXCEL_PROPERTIES . + data SECURITY type ref to ZCL_EXCEL_SECURITY . + + methods ADD_NEW_DRAWING + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods ADD_NEW_RANGE + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods ADD_NEW_STYLE + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods ADD_NEW_WORKSHEET + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods CONSTRUCTOR . + methods GET_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_RANGES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_NAME + returning + value(EP_NAME) type ZEXCEL_WORKSHEETS_NAME . + methods GET_WORKSHEETS_SIZE + returning + value(EP_SIZE) type I . + methods SAVE_AS + importing + !IP_FORMAT type ZEXCEL_FORMAT + returning + value(EP_FILE) type XSTRING . + *"* protected components of class ZABAP_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . + data RANGES type ref to ZCL_EXCEL_RANGES . + data STYLES type ref to ZCL_EXCEL_STYLES . + data WORKSHEETS type ref to ZCL_EXCEL_WORKSHEETS . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method ADD_NEW_DRAWING. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_title = ip_title. + drawings->add( eo_drawing ). +endmethod. + + + + method ADD_NEW_RANGE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Create default blank range + CREATE OBJECT eo_range. + ranges->add( eo_range ). +endmethod. + + + + method ADD_NEW_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Create default style + CREATE OBJECT eo_style. + styles->add( eo_style ). + +endmethod. + + + + + method ADD_NEW_WORKSHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_title = ip_title. + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT properties. + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings. + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. + + +endmethod. + + + + method GET_ACTIVE_WORKSHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + +endmethod. + + + + method GET_DRAWINGS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->drawings->get_iterator( ). +endmethod. + + + + method GET_RANGES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->ranges->get_iterator( ). +endmethod. + + + + method GET_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->styles->get_iterator( ). +endmethod. + + + + method GET_WORKSHEETS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->worksheets->get_iterator( ). +endmethod. + + + + method GET_WORKSHEETS_NAME. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_name = me->worksheets->name. + +endmethod. + + + + method GET_WORKSHEETS_SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = me->worksheets->size( ). + +endmethod. + + + + + method SAVE_AS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lo_excel_writer_2007 TYPE REF TO zcl_excel_writer_2007. + +* Determine the output engine to use + CASE ip_format. + WHEN me->c_xlsx. " XLSX for Office 2007 + CREATE OBJECT lo_excel_writer_2007 EXPORTING io_excel = me. + ep_file = lo_excel_writer_2007->create( ). + WHEN OTHERS. + ENDCASE. + +endmethod. + + + + class ZCL_EXCEL_COMMON definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +public section. + + class-methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + class-methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* protected components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +private section. + + class-data C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method CONVERT_COLUMN2ALPHA. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +endmethod. + + + + + method CONVERT_COLUMN2INT. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( zcl_excel_common=>c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( zcl_excel_common=>c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - zcl_excel_common=>c_excel_col_module. + ENDIF. + +endmethod. + + + + class ZCL_EXCEL_DATA_VALIDATION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data ALLOWBLANK type FLAG value 'X'. "#EC NOTEXT . + data CELL_ROW type ZEXCEL_CELL_ROW . + class-data C_TYPE_LIST type ZEXCEL_DATA_VAL_TYPE value 'list'. "#EC NOTEXT . + data SHOWERRORMESSAGE type FLAG value 'X'. "#EC NOTEXT . + data SHOWINPUTMESSAGE type FLAG value 'X'. "#EC NOTEXT . + data TYPE type ZEXCEL_DATA_VAL_TYPE . + data VALUE type ZEXCEL_VALIDATION_FORMULA1 . + data CELL_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + METHOD constructor. + type = me->c_type_list. +* inizialize dimension range + cell_row = 1. + cell_column = 'A'. +ENDMETHOD. + + + + class ZCL_EXCEL_DATA_VALIDATIONS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + methods ADD + importing + !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . + methods CLEAR . + methods CONSTRUCTOR . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +private section. + + data DATA_VALIDATIONS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + METHOD add. + data_validations->add( ip_data_validation ). +ENDMETHOD. + + + METHOD clear. + data_validations->clear( ). +ENDMETHOD. + + + METHOD constructor. + + CREATE OBJECT data_validations. + +ENDMETHOD. + + + + METHOD get_iterator. + eo_iterator ?= data_validations->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. + is_empty = data_validations->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. + data_validations->remove( ip_data_validation ). +ENDMETHOD. + + + + METHOD size. + ep_size = data_validations->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_DRAWING definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + data X_REFERENCES type CHAR1 . + data Y_REFERENCES type CHAR1 . + data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +private section. + + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + + methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + method CONSTRUCTOR. + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +endmethod. + + + + + method CONVERT_COLUMN2ALPHA. + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +endmethod. + + + + + method CONVERT_COLUMN2INT. + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( me->c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( me->c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - me->c_excel_col_module. + ENDIF. + +endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + class ZCL_EXCEL_DRAWINGS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->add( ip_drawing ). +endmethod. + + + method CLEAR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->clear( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT drawings. + +endmethod. + + + + + method GET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_drawing ?= drawings->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= drawings->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = drawings->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->remove( ip_drawing ). +endmethod. + + + + method SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = drawings->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_PROPERTIES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +public section. + + data CREATOR type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data LASTMODIFIEDBY type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data CREATED type TIMESTAMPL . + data MODIFIED type TIMESTAMPL . + data TITLE type ZEXCEL_TITLE value 'Untitled Spreadsheet'. "#EC NOTEXT . + data SUBJECT type ZEXCEL_SUBJECT . + data DESCRIPTION type ZEXCEL_DESCRIPTION . + data KEYWORDS type ZEXCEL_KEYWORDS . + data CATEGORY type ZEXCEL_CATEGORY . + data COMPANY type ZEXCEL_COMPANY value 'Microsoft Corporation'. "#EC NOTEXT . + data APPLICATION type ZEXCEL_APPLICATION value 'Microsoft Excel'. "#EC NOTEXT . + data DOCSECURITY type ZEXCEL_DOCSECURITY value '0'. "#EC NOTEXT . + data SCALECROP type ZEXCEL_SCALECROP value ''. "#EC NOTEXT . + data LINKSUPTODATE type FLAG . + data SHAREDDOC type FLAG . + data HYPERLINKSCHANGED type FLAG . + data APPVERSION type ZEXCEL_APPVERSION value '12.0000'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_PROPERTIES +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + + DATA: lv_timestamp TYPE timestampl. + + GET TIME STAMP FIELD lv_timestamp. + created = lv_timestamp. + modified = lv_timestamp. + +endmethod. + + + + class ZCL_EXCEL_RANGE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +public section. + + data NAME type ZEXCEL_RANGE_NAME . + data GUID type ZEXCEL_RANGE_GUID . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_RANGE_GUID . + methods SET_VALUE + importing + !IP_SHEET_NAME type ZEXCEL_SHEET_TITLE + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + methods GET_VALUE + returning + value(EP_VALUE) type ZEXCEL_RANGE_VALUE . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +private section. + + data VALUE type ZEXCEL_RANGE_VALUE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method CONSTRUCTOR. +endmethod. + + + + METHOD get_guid. + + ep_guid = me->guid. + +ENDMETHOD. + + + + METHOD get_value. + + ep_value = me->value. + +ENDMETHOD. + + + + + + + + METHOD set_value. + DATA: lv_start_row_c TYPE char7, + lv_stop_row_c TYPE char7. + lv_stop_row_c = ip_stop_row. + SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. + SHIFT lv_stop_row_c LEFT DELETING LEADING space. + lv_start_row_c = ip_start_row. + SHIFT lv_start_row_c RIGHT DELETING TRAILING space. + SHIFT lv_start_row_c LEFT DELETING LEADING space. + CONCATENATE ip_sheet_name '!$' ip_start_column '$' lv_start_row_c ':$' ip_stop_column '$' lv_stop_row_c INTO me->value. +ENDMETHOD. + + + + class ZCL_EXCEL_RANGES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_RANGES +*"* do not include other source files here!!! +private section. + + data RANGES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + ranges->add( ip_range ). +endmethod. + + + method CLEAR. + ranges->clear( ). +endmethod. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT ranges. + +ENDMETHOD. + + + + + method GET. + eo_range ?= ranges->if_object_collection~get( ip_index ). +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= ranges->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = ranges->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + ranges->remove( ip_range ). +endmethod. + + + + method SIZE. + ep_size = ranges->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_SECURITY definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SECURITY +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data LOCKREVISION type FLAG . + data LOCKSTRUCTURE type FLAG . + data LOCKWINDOWS type FLAG . + data REVISIONSPASSWORD type ZEXCEL_REVISIONSPASSWORD . + data WORKBOOKPASSWORD type ZEXCEL_WORKBOOKPASSWORD . + + methods CONSTRUCTOR . + methods IS_SECURITY_ENABLED + returning + value(EP_SECURITY_ENABLED) type FLAG . + *"* protected components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + method CONSTRUCTOR. +endmethod. + + + + method IS_SECURITY_ENABLED. + IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. + ep_security_enabled = abap_true. + ENDIF. +endmethod. + + + + class ZCL_EXCEL_SHEET_SETUP definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants C_PAPERSIZE_LETTER type ZEXCEL_SHEET_PAPER_SIZE value 1. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 2. "#EC NOTEXT + constants C_PAPERSIZE_TABLOID type ZEXCEL_SHEET_PAPER_SIZE value 3. "#EC NOTEXT + constants C_PAPERSIZE_LEDGER type ZEXCEL_SHEET_PAPER_SIZE value 4. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL type ZEXCEL_SHEET_PAPER_SIZE value 5. "#EC NOTEXT + constants C_PAPERSIZE_STATEMENT type ZEXCEL_SHEET_PAPER_SIZE value 6. "#EC NOTEXT + constants C_PAPERSIZE_EXECUTIVE type ZEXCEL_SHEET_PAPER_SIZE value 7. "#EC NOTEXT + constants C_PAPERSIZE_A3 type ZEXCEL_SHEET_PAPER_SIZE value 8. "#EC NOTEXT + constants C_PAPERSIZE_A4 type ZEXCEL_SHEET_PAPER_SIZE value 9. "#EC NOTEXT + constants C_PAPERSIZE_A4_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 10. "#EC NOTEXT + constants C_PAPERSIZE_A5 type ZEXCEL_SHEET_PAPER_SIZE value 11. "#EC NOTEXT + constants C_PAPERSIZE_B4 type ZEXCEL_SHEET_PAPER_SIZE value 12. "#EC NOTEXT + constants C_PAPERSIZE_B5 type ZEXCEL_SHEET_PAPER_SIZE value 13. "#EC NOTEXT + constants C_PAPERSIZE_FOLIO type ZEXCEL_SHEET_PAPER_SIZE value 14. "#EC NOTEXT + constants C_PAPERSIZE_QUARTO type ZEXCEL_SHEET_PAPER_SIZE value 15. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_1 type ZEXCEL_SHEET_PAPER_SIZE value 16. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_2 type ZEXCEL_SHEET_PAPER_SIZE value 17. "#EC NOTEXT + constants C_PAPERSIZE_NOTE type ZEXCEL_SHEET_PAPER_SIZE value 18. "#EC NOTEXT + constants C_PAPERSIZE_NO9_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 19. "#EC NOTEXT + constants C_PAPERSIZE_NO10_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 20. "#EC NOTEXT + constants C_PAPERSIZE_NO11_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 21. "#EC NOTEXT + constants C_PAPERSIZE_NO12_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 22. "#EC NOTEXT + constants C_PAPERSIZE_NO14_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 23. "#EC NOTEXT + constants C_PAPERSIZE_C type ZEXCEL_SHEET_PAPER_SIZE value 24. "#EC NOTEXT + constants C_PAPERSIZE_D type ZEXCEL_SHEET_PAPER_SIZE value 25. "#EC NOTEXT + constants C_PAPERSIZE_E type ZEXCEL_SHEET_PAPER_SIZE value 26. "#EC NOTEXT + constants C_PAPERSIZE_DL_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 27. "#EC NOTEXT + constants C_PAPERSIZE_C5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 28. "#EC NOTEXT + constants C_PAPERSIZE_C3_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 29. "#EC NOTEXT + constants C_PAPERSIZE_C4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 30. "#EC NOTEXT + constants C_PAPERSIZE_C6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 31. "#EC NOTEXT + constants C_PAPERSIZE_C65_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 32. "#EC NOTEXT + constants C_PAPERSIZE_B4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 33. "#EC NOTEXT + constants C_PAPERSIZE_B5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 34. "#EC NOTEXT + constants C_PAPERSIZE_B6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 35. "#EC NOTEXT + constants C_PAPERSIZE_ITALY_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 36. "#EC NOTEXT + constants C_PAPERSIZE_MONARCH_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 37. "#EC NOTEXT + constants C_PAPERSIZE_6_3_4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 38. "#EC NOTEXT + constants C_PAPERSIZE_US_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 39. "#EC NOTEXT + constants C_PAPERSIZE_DE_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 40. "#EC NOTEXT + constants C_PAPERSIZE_DE_LEG_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 41. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B4 type ZEXCEL_SHEET_PAPER_SIZE value 42. "#EC NOTEXT + constants C_PAPERSIZE_JPN_DBL_POSTCARD type ZEXCEL_SHEET_PAPER_SIZE value 43. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_1 type ZEXCEL_SHEET_PAPER_SIZE value 44. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_2 type ZEXCEL_SHEET_PAPER_SIZE value 45. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_3 type ZEXCEL_SHEET_PAPER_SIZE value 46. "#EC NOTEXT + constants C_PAPERSIZE_INVITE_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 47. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 48. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 49. "#EC NOTEXT + constants C_PAPERSIZE_TABL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 50. "#EC NOTEXT + constants C_PAPERSIZE_A4_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 51. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 52. "#EC NOTEXT + constants C_PAPERSIZE_A4_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 53. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 54. "#EC NOTEXT + constants C_PAPERSIZE_SUPERA_A4_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 55. "#EC NOTEXT + constants C_PAPERSIZE_SUPERB_A3_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 56. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 57. "#EC NOTEXT + constants C_PAPERSIZE_A4_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 58. "#EC NOTEXT + constants C_PAPERSIZE_A5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 59. "#EC NOTEXT + constants C_PAPERSIZE_JIS_B5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 60. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 61. "#EC NOTEXT + constants C_PAPERSIZE_A5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 62. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 63. "#EC NOTEXT + constants C_PAPERSIZE_A2_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 64. "#EC NOTEXT + constants C_PAPERSIZE_A3_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 65. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 66. "#EC NOTEXT + constants C_ORIENTATION_DEFAULT type ZEXCEL_SHEET_ORIENATATION value 'default'. "#EC NOTEXT + constants C_ORIENTATION_LANDSCAPE type ZEXCEL_SHEET_ORIENATATION value 'landscape'. "#EC NOTEXT + constants C_ORIENTATION_PORTRAIT type ZEXCEL_SHEET_ORIENATATION value 'portrait'. "#EC NOTEXT + data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + orientation = me->c_orientation_default. +endmethod. + + + + class ZCL_EXCEL_STYLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +public section. + + data FONT type ref to ZCL_EXCEL_STYLE_FONT . + data FILL type ref to ZCL_EXCEL_STYLE_FILL . + data BORDERS type ref to ZCL_EXCEL_STYLE_BORDERS . + data NUMBER_FORMAT type ref to ZCL_EXCEL_STYLE_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_CELL_STYLE . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +private section. + + data ALIGNMENT type ref to ZCL_EXCEL_STYLE_ALIGNMENT . + data PROTECTION type ref to ZCL_EXCEL_STYLE_PROTECTION . + data GUID type ZEXCEL_CELL_STYLE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT font. + CREATE OBJECT fill. + CREATE OBJECT borders. + CREATE OBJECT alignment. + CREATE OBJECT number_format. + CREATE OBJECT protection. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + +endmethod. + + + + method GET_GUID. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. +endmethod. + + + + class ZCL_EXCEL_STYLES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods SIZE + returning + value(EP_SIZE) type I . + methods REGISTER_NEW_STYLE + importing + !IO_STYLE type ref to ZCL_EXCEL_STYLE + returning + value(EP_STYLE_CODE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +private section. + + data STYLES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->add( ip_style ). +endmethod. + + + method CLEAR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->clear( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT styles. +endmethod. + + + + + method GET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_style ?= styles->if_object_collection~get( ip_index ). +endmethod. + + + + method GET_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= styles->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = styles->if_object_collection~is_empty( ). +endmethod. + + + + + method REGISTER_NEW_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->add( io_style ). + ep_style_code = me->size( ) - 1. "style count starts from 0 +endmethod. + + + + method REMOVE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->remove( ip_style ). +endmethod. + + + + method SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = styles->if_object_collection~size( ). +endmethod. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel9. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + +lo_data_validation = lo_worksheet->add_new_data_validation( ). +lo_data_validation->value = lo_range->name. +lo_data_validation->cell_row = 4. +lo_data_validation->cell_column = 'A'. + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Select a value' ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\DataValidation.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel8. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Range.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel7. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 5 + ip_stop_column = 'B' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 5 + ip_stop_column = 'C' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3flags. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 5 + ip_stop_column = 'D' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 5 + ip_stop_column = 'E' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 5 + ip_stop_column = 'F' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3signs. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'G' + ip_start_row = 5 + ip_stop_column = 'G' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'H' + ip_start_row = 5 + ip_stop_column = 'H' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'I' + ip_start_row = 5 + ip_stop_column = 'I' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 12 + ip_stop_column = 'B' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 12 + ip_stop_column = 'C' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 12 + ip_stop_column = 'D' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 12 + ip_stop_column = 'E' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 12 + ip_stop_column = 'F' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 19 + ip_stop_column = 'B' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 19 + ip_stop_column = 'C' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 19 + ip_stop_column = 'D' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5quarters. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 19 + ip_stop_column = 'E' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'E' ip_value = 'C_ICONSET_5QUARTERS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Iconset.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel6. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '100' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '1000' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '150' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '500' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '1760' ip_formula = 'SUM(C4:C8)' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Formula.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel5. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '100' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '1000' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '150' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '500' ip_style = lv_style_number_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\CondFormatting.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel4. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). + +lo_worksheet = lo_excel->add_new_worksheet( ). +lo_worksheet->title = 'Sheet2'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Sheets.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel3. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_header TYPE REF TO zcl_excel_style, + lo_style_body TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_header_guid TYPE zexcel_cell_style, + lv_style_body_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +" Create filled style +lo_style_header = lo_excel->add_new_style( ). +lo_style_header->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_header->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lo_style_header->borders->allborders = lo_border_dark. +lv_style_header_guid = lo_style_header->get_guid( ). +"Create style with border +lo_style_body = lo_excel->add_new_style( ). +lo_style_body->borders->allborders = lo_border_dark. +lv_style_body_guid = lo_style_body->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. +lo_worksheet->set_table( ip_table = lt_test + ip_hdr_style = lv_style_header_guid + ip_body_style = lv_style_body_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTab.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel2. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +CREATE OBJECT lo_border_light. +lo_border_light->border_color = zcl_excel_style_color=>c_gray. +lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. +" Create a bold / italic style +lo_style_bold = lo_excel->add_new_style( ). +lo_style_bold->font->bold = abap_true. +lo_style_bold->font->italic = abap_true. +lo_style_bold->font->color = zcl_excel_style_color=>c_red. +lv_style_bold_guid = lo_style_bold->get_guid( ). +" Create an underline double style +lo_style_underline = lo_excel->add_new_style( ). +lo_style_underline->font->underline = abap_true. +lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. +lv_style_underline_guid = lo_style_underline->get_guid( ). +" Create filled style +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lv_style_filled_guid = lo_style_filled->get_guid( ). +" Create border with button effects +lo_style_button = lo_excel->add_new_style( ). +lo_style_button->borders->right = lo_border_dark. +lo_style_button->borders->down = lo_border_dark. +lo_style_button->borders->left = lo_border_light. +lo_style_button->borders->top = lo_border_light. +lv_style_button_guid = lo_style_button->get_guid( ). +"Create style with border +lo_style_border = lo_excel->add_new_style( ). +lo_style_border->borders->allborders = lo_border_dark. +lv_style_border_guid = lo_style_border->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Styles'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Styles.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel1. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HelloWorld.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report Z_ZAKE_SVN +*& +*&---------------------------------------------------------------------* +*& Checkout / Checkin the ZAKE_SVN Project +*& +*&---------------------------------------------------------------------* + +REPORT zake_svn_a2x. + +CONSTANTS cl_svn TYPE seoclsname VALUE 'ZCL_ZAKE_SVN'. +CONSTANTS cl_tortoise_svn TYPE seoclsname VALUE 'ZCL_ZAKE_TORTOISE_SVN'. + +DATA package TYPE devclass. +DATA zake TYPE REF TO zake. + +DATA zake_objects TYPE scts_tadir. + +DATA files TYPE string_table. +DATA file LIKE LINE OF files. + +DATA zake_build TYPE string. +DATA zake_nuggetname TYPE string. + +DATA comment_str TYPE string. +DATA loclpath_str TYPE string. +DATA svnpath_str TYPE string. +DATA username_str TYPE string. +DATA password_str TYPE string. +DATA class TYPE seoclsname. + +DATA: ex TYPE REF TO zcx_saplink, + message TYPE string. + +SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE a. +PARAMETERS: + checkout TYPE flag RADIOBUTTON GROUP act, + update TYPE flag RADIOBUTTON GROUP act DEFAULT 'X', + checkin TYPE flag RADIOBUTTON GROUP act. +SELECTION-SCREEN END OF BLOCK a. + +SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE b. +PARAMETERS: + svn TYPE flag RADIOBUTTON GROUP cl, + tortoise TYPE flag RADIOBUTTON GROUP cl. +SELECTION-SCREEN END OF BLOCK b. + +SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE c. +PARAMETERS: + loclpath TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx' LOWER CASE OBLIGATORY, + zakebuil TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx\build\NUGG_ABAP2XLSX_V_1_0.nugg' LOWER CASE OBLIGATORY, + zakenugg TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx\nuggs\NUGG_ABAP2XLSX_V_1_0.nugg' LOWER CASE OBLIGATORY, + svnpath TYPE char512 DEFAULT 'https://abap2xlsx.googlecode.com/svn/trunk/abap2xlsx' LOWER CASE OBLIGATORY, + comment TYPE char512 DEFAULT '' LOWER CASE, + username TYPE char512 LOWER CASE, + password TYPE char512 LOWER CASE, + testrun TYPE flag DEFAULT 'X'. +SELECTION-SCREEN END OF BLOCK c. + +INITIALIZATION. + a = 'Action'. + b = 'Version Controll Program'. + c = 'Parameters'. + +START-OF-SELECTION. + + svnpath_str = svnpath. + loclpath_str = loclpath. + zake_build = zakebuil. + zake_nuggetname = zakenugg. + comment_str = comment. + + SELECT * INTO TABLE zake_objects FROM tadir WHERE devclass = 'ZABAP2XLSX'. + DELETE zake_objects WHERE object = 'DEVC'. + + TRY. + IF svn = 'X'. + class = cl_svn. + ELSE. + class = cl_tortoise_svn. + ENDIF. + + CREATE OBJECT zake + TYPE + (class) + EXPORTING + i_svnpath = svnpath_str + i_localpath = loclpath_str. + zake->set_testrun( testrun ). + + IF checkin = 'X'. + zake->set_package( 'ZA2X' ). + zake->set_checkin_objects( zake_objects ). + zake->create_slinkees( zake_nuggetname ). + " Build a complete package for download +* zake->set_package( 'ZA2X' ). +* zake->set_checkin_objects( zake_objects ). +* " Let's add the CMD Scripts to the complete package +* CONCATENATE loclpath 'bin/svn-script.cmd' INTO file. +* APPEND file TO files. +* CONCATENATE loclpath 'bin/tortoise-svn-script.cmd' INTO file. +* APPEND file TO files. +* zake->add_files_to_zip( files ). +* " We don't want that for the complete Package Slinkees are created +* " in the ZAKE folder +* zake->download_slinkees_to_lm = space. +* zake->download_nugget_to_lm = space. +* zake->create_slinkees( zake_nuggetname ). + IF testrun IS INITIAL. + zake->checkin( comment_str ). + ENDIF. + ELSE. + IF update = 'X'. + zake->update( ). + ELSE. + zake->checkout( ). + ENDIF. + " zake->install_slinkees_from_lm( testrun ). + zake->install_objects( zake_objects ). + ENDIF. + CATCH zcx_saplink INTO ex. + message = ex->msg. + WRITE: / 'An Error occured: ', message. + ENDTRY. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/NUGG_ABAP2XLSX_V_1_1.nugg.zip b/build/NUGG_ABAP2XLSX_V_1_1.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..4c5ca39b473e66a66de87524487cca58b9833b96 GIT binary patch literal 54908 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%0DXi%AM?qzvUQsNb3>t`SAyu~L^ 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 aXHZK81^@s60096207n1-03X%>00001F*bt$ literal 0 HcmV?d00001 diff --git a/nuggs/ABAP2XLSX_V_2_0.zip b/nuggs/ABAP2XLSX_V_2_0.zip new file mode 100644 index 0000000000000000000000000000000000000000..f0560d2d724ce992313a35ee64914bc137d63e6d GIT binary patch literal 570430 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%0AX|ep{J%KN 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

JrOoJKmGGvv~?X-bzSY= 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�wQ!E+zVKM|9jz9 z0igq()4vP1N(deH_X8F@{>;&QUdOe+_h(k8#Ph7qEArZt4jUEDD%-I_Ab@4^aN<8i zHvgd>aDfJ!hxTSz{4pO2>^;=v+_=gnbnu)+t>@qQFY1B$a;RDI57!OvD75$A96K7E z8ywJJi~D~FZg~GCxB)}OxZ_l3$Xd-=b0zQ?So%y?ca?F#M*Gi%+cYpcJF4i|Kqz_y z`r~(EGtr&bF*RJTSb1V{KVZ*MQNcwegeX=UVFbjFkgi2u_EjdoxV21X)KF=>MoS(t zyX7t>x`2;JDI ztWx>U2eiu})rLSfoX?`RCUldW@$8Zf-N>oeh5Hkp+k0~F*JUtd=^EF2RF_-v9Ni@w z+Glt>dpJy)>5s@q%=TAwdrUX`K-}z8f+Ys+@})U!Cf-`8{^D!S0T?0{-Zlj6qu~?; zPj#n@5mqUfuoOi2AouXIj81(9y})zilvNNE>^nD?Ye2B2=PP~Rq$U-qIn$%@GD@^( z0z}BeinT4P+@X*>J5wdC9i`fcB?rqBo@TLZeud zPzjP2WO-$;d?(iXapA64d6zulETjLX`&+&B2=!zA2f9vywM&`t)||yz~~t zwT0k=hdxYq$3OJc?Zcb58=3gNVh72m<$V)&fF3f0xX3f*Uf*rbJT0CjtNxSf{d5pV z>NsMml78p?jDnH}s(2jnkbvK;QrBm#W)nN7ix>bCEy74sIMT{5y|Xbw9^p7H@i_BU zH?ctT#!M=D^y({(B$J|kH+1&X+K4D1Y=#nU(gh;dxxPO48V<7|Mi1l-$S+h#B%FqD&YXs5_IZm1faZ2LDtmJ8-z=9KF;vsdYM@nk2UoF0SCJj+ zMPRckAXxfC+j~PBLG$WR2uu|bhX=-M2nejn2X3E4=N7t>6dzHFfzdyM+h<=I5>*M{ z$I+bt-$*P84RpFAK6##i;@yTlGXq><3yBW|qtoZ;x53C4D8{0Mb#_Z0T!Jq=?|m3W zUBZ0?1#>-=2r{G3!mi60$8bI1PZ#x_6j+0$6P@8Xy?h=i9c%Z**xe$pBi4u*$2=#= zk8SXq0x6J@HCnki_B*oH9_vS1^p)JhN)=x=?LX81zkvHZxLytT_mt|~Y%~8?1!(UX z1v2;|xmVU@izW=OoW2X88zreDqlcjJ!~uivI`JB2AYd4Jzer&6c2Ka|+()myAn@OIdKIUI}X-4K0v z+k!h6kZ-eoA9}#f&lp)_`#tfAN3jLR@J^=`vyedA4P&|l^c^i{J8k~Lj{keyt0}QN zu59IuQ1;JSh%Nz`J|R}>>g^;4E8MN^&LjpNO%H}sq=*yJ`8H)dRmS(n1Na{aAK)Sy zb~=ng+xOYqt1#umXft$Zga~EnGJvXxal(jmA4_5HtnR!x%Rp+omv8AhtorQ_x47dP z^rPfsE4PE{Tv#cw-K&9vbOx@K`^R>was|Z<00QZug-=-n$Jto@g%%G8 zy=ER+)IwmRL0= z1pNFalZX^6aLVd| zi2!#AXaA&n=6nQTs5MYY2%9&;af_tL&Wl&$htv>RPunK?9d54BHF zZx6BgRp}9={9i>{ON{z7pgT8HJ$8??+dQ*knd|JUBy20EA&3ga4YnC1_zGwock6Q%dr`ckBdlfBPKc>KN zUQcfoLBO~DFynd#NWlO`Qwz>|WqSvjRzU2AwdlkAz;_TbO?u@|nb}AAy8t~3wcF8s zX6)lnV*?(E-9;tQT)!J#QW7MlvDH^&OEPiq97bPTfL!4EX(KWZ`z)h3+P1tIkoya} zlrCVM8Mi`N4{P(SR;H5T~?*lvESy^Zdh@2ot$&NDl_1;)I0x58=SA54CF@Dc!qzCDXX6G>t`ZnK$Iw5|w&8X$UMd5`~E`4k%s#1O1d};HNXUcu*S;*-{FRYvj9D z)?9U#6(q!u{g2^n=|{Xrhhlp1VcQC`)ko$>T0GV&V;kUYGgoYgmmZ(jOuRJOiOX>L zCv%jy&L-6OW4< zfe7xDaC8}lL-hcYG5PqhpqNmv2DrtkMO@>)y-}8Y+ta#9)C)Pzr`qL%`R+OZNMyik zSKBd$WDmVT7YaQYq1ZC;e={(8PNUX0?*=UBIseOuP!ENkvQX$*2!)YN)>P*pY5oAnQOf=%Hc{3`c{0ZTjQ5Bt^g`YItPFdav&M|J+QOiBlek)b0U zK^<$M;#XjAaVeogEHXmB5#Ij?o8|v?EMxxv*O_Vmq0H?1n^i*T539uU zy}*B1CC2}yu5A88ANG6;@_Z0;pjPOe!6Nj>1^)Zfnj0kFM29o;`+^m{~X=9v^aKZAnfW=0$=vokMv*C058Q^1_F+132<(Ri0SMX zF~lkRd*P4WdKE;BpS>S`+|TfB?h_y`k{Q6fH*fgC7UhOtOjB`y-&>ywnCg1p;Q5-q*#itKa|!l2wgv# zvZc|guaA9le~<=Hp~qOb+TrJ|<|wn}3p?MXE=5Ue@?>&e#K*o+l5w#Osr&7!SuU|Au_cMZY zsaH0?zr+>lUF{`E0c5l;BkQgfuOzz>MIPxwyzwB8Ka7?2;$?$ZatyHf%La|lm5UCb z*xjl^8QV&|U#?4A*QYhu#j>@#hLekGgxN6Q*Loa47f+fHz8TC$zg-V z8J-$u5ndc*@qyE7Blkxsp;n8rxpVVspeYqVjDI~_mnUljmd<;Glky_$j^-D=g51X| z#A{3+7x#G8s_lvU+B!3lk*?H3hpiae{-wb=wjoS8vh$X<+i6p#^SyRa(uKm03glqQW)KpPbVp&DsnZm^8^nh2 z4`?s2aDLcMu&23^IPKbQFrKQs;hoRlAA56)(Tr3jf-OZ5MvLngI##MqK?@@QkbwQT zLalT6x^<_$Lp%sk*G(H?x+Ms403uB!RZ%Q$xY!>`Fnz6I9u+|KfXI8^T55f2q?Cy@ z-{@DHn&gw1)y3eWEv4%EzS}nk(fez63BjQs1y3Paahqg^VmO9-K#GJt62klMe z1EZGl3dw~#+)^zcRjD_@g*4)ft?@HV$Tz0rWeVHXbB(WxjlAV6irq@Jsp{vd4Y1Ox zYdfR7PkHK)qVn6-H_$h>PbeR#rdT4ZhM8e4xPC(d%Qe#@Lm=A%c@)#4-F3(Lg2F%? zpLpX|Ej|Rl_36T`teCcyv_vsi)Y2JmrT5&r*g}U_q`yGq9(%}kgJF?JDl-rUtSV`eOP~9q-|MCmi?RNgwGn#0R6ED%wA(_o5Hw8&pS|yOU1k61Mf? zH>MnoSFT#*b4B-^N1(Y!=>{kDDbJ(@SOO}ecDh=7$`z&Nbzo*+nBcZBWdhLaC`^Gk zs0I4z{#=rI3(F3SbMg#vABFD52)5TCd8~qox8lnxM`2<|y@V#?qOswS~8sgqB?umAn-u!k5Nv&nBjW<9JQ|MYz7gz2m6AYT0Efy2Yu zp%nS+_L~bieRes)_U>#oIV&NMjg7U#Lh)7fxG z42-DyM|?AC`dZJ*kM~!J^(GOp;N4hZOQo2{&s7oA%C0pbv+$`C%&DK9#4!##SS=yV z8AN)1-c~#44L-?pwrRLymErTFdWd7JkDlIq#JCdRU(1R;@7N~3h#Pvd{UXZwiEN%9 zFvfd_RD9S`8F1^ZGt#z?u1-r76aL!&v?;V(-?KVvDC>SuCxjlr;>*9zF+z@#2T;?+B9 zT{A$2%plk)AffxIYr?Mk0GH`%n*`l%klUr0CB4>e+*L_MG11MCo^a#sf34Q z-504xY3PfBPPP9M)1`pB9C|HRVe&qhYD?#b{l{}+N0KFmux^!Pc+CpG37yitJM8J% zX4WQsrL!iVpD3~t;9&6&k986%rynMA+3&tKCNU%U^<2b76LnH>R-H+rwl86Saq8kQFhli7e+rnS9aWFI zh1+zbkH@(czqRF7GOXe`a5iogom-E%h3lBbUjD-sd48O!wAfgEt8hpSq!upva8orK zB6_Z9T{rI7KOW<<5(FyEn?W58u^d^~ zuA-oNZ4;pQg4$1LNAzbS3shgz2@PoS91G=H>VZm!&*6C^{pX*vBriYr`)*bI^I-nJ zxd_5Bv&ejSi;g+JcWnZ8Z~neXmgPg1 z+WDRSCi>!Y9yj<8(u?~8`u<`UgNitRGQ7`u=YhXbGa(cQDnhNJe^B!?uX@2BAT9GZ z1}uUC)^>%z0IS%3L)@ukEz@6&0{;J-3HLc2Z3_*m{@>|nUg$kRDip`cLxCza)cj0r z8wDK%3UPU%NZ%RS%Lb}~!rH5RLWg9i=hPAJe$85q%U_HH;>)+h&nL>Iz84Xh|5QpD zIdGW^$l&s+o9(I!ETcjds?NADdb`djhXOlCB_rHZ*T?gkI7@L77oM*-&9w(;k<7H` zktwa7p2btWKJ#=R;jNtWJv%v%ci$h1t_WTu1#8_>N-?}db#|9>MOB1KL8=mdVZ+udYFf@mYqCd9G3R=qWa^-@6aEF+^V@1dRPtXK7WM? zJRxAC5yB8?OqL7T1F zG#B)a8uM0N0T7&r;dd-+x{PSI#yZcaw{nM-l95Lob2GIdgz_8?4mr>~mA2VRoy&&0 zFXilQD@)TRs<7zP>G|xS$QQMtrO-%0wzQ#^;Q`lKRszZBsrOU4>oNTGDtyDJ-^=Ng>QE{a{r)__X3sgP5YqMNH@YxG1S6>x1is&BB+f<4 ztBEAy3BR@T4V&R??z^vqUbmLH1dx8Kuk_z$TzR{%J0rbGwnqCc^AWpkb`Nh~1i)DG z0fF^P=>GR=fwhL$_WsVy)Zgpow$-L@?oPz7+yC4DIdz{ zWl!t7wX8okDV*-@MlA`lN>9cV1r++66Zs-~-vpBfWLc+gtrd=o%c&>j?xB?m_7t%W zYE^n=?va=gt`yPhS8tQWT+joo?-5GqR$M*8FW;D<*tKYrX6`Y!o46f_c4Go) zGeZ`=q1O-GY$;hBx)Hp5DOmua2CU}2mRD}VbbL+-f8wk(PnWLafI496HI^LSQ&oE& zzZ^~|c!C6_Y)Uv>b6Np(<~D5gV!($n{`)lOMkXq?+I?zgUAICXCu|8$fT5FBgcG-I zm;Wb`L7ErkTPX}c4F6A#_BFu6a|#4bqo83#SQ&GwwTnwwj2p zfAUQzDQoUn{tj=B7+IF4&h&o$hG7qYBkPe93YoM^xKC@G%wATSC@(ELKjL~|JTIp; zs`i`1_^}d3@*;*{ag_Xu;HO=!zU z#?yIRR@xCxt3d0P?2h=|jo+~wjHlR1(OlDb@OC!AX;JJV$oyPlG@U!}B~#1{`!C0z zbPfkSzhCd4N)e2yKUK3fMNgA{)mJxfOeI|{p8gih*}HBuM&&5j8h9~y)E#yWzm958 z0UZ1#Xkt9bw5-^2Zl!*D&g_qP&;9geCM71lz@kY>Q|VGWu2_1Y=JNo19E4u7f`UQ8 zOE127!2_0AaXrdh*FM-T7pzcr+AEypb ztT@Y=vQMiiipRN|mA-PMLML`q(Gtk4a`v5#&)z(l4|c#w&EEV4^>iA|(wa`5tI$GQ zODo=?apV}QzMzFPITZKn^#ygd1||-Zzq{nZjH=7jb|dAJA$T zn>(i3=-WD@$Pdn+6z!q}Z(0JbRHAS=IGMh|m&|qmtXDBwE!CFS=zBq|8)Y&-@2Lpb zn2gw<-E*IK(Ad1kZKcW?Jz z+fe7hSgKlNgQ)Km#yKqt-I(x9>kpmus(A9{=f~H-2L$= zdeMGtu1|0J+Fj7T?nCJf%9TJj-EAjbgaUMb3zJKSF}TzG+UpA!tSOuB0uFZ<<$IhI zpOOeP_zx?V*(9vmwYO#%CR{XxXP0Zk)9^RE2X>rv*HeKS;nQPScqUA97n-;WXRTq) z5k2287zZbU+@1ccY_%Kv*9{Y*v6+X3hK*jh^y?+222SbG)7=_iN}NM zqg*WriB&>5@bv5k1X-^b(o79RCo+?Ru5^Nn9}*zJ!mx7;9ThdI!J2jKmJ6Ab7`62c z+Ic`}L^l zPV3@2J!H2+W?|AhCvohI*nw87HMGljTBY4Ks4X^dK%xq@x{1umTN{`KwN34C?bPM| zjrpmSt?#@H(qC*F=P4$M>>(z+e=}r#o?$5bCo{Ly(hNnV0e?{Gnl^=W*ta!zS{t}3 zobOOn>ZWo3$gIm;RM2lv_(LF0}7SC;cRt-1O4?1tihlb#-b&&tS!f?a6z;6IQw)EN?|ed9C_ zMm^NdDw(Gs*}Xb^PJ)6K|ElZrj7iyR=e)N)fX~PG6(dIId*pv6L;#x)a#2MMUI@%O zfdhZaz5fI-0m}6b&tTaZ8uhq*sjznhO^U_R_PsxxaQzsBWJGyF*MBKUj&90z<<>$l zPji_hA}Rn%!h-*rko2G+9cq1;-;z4FxO*(Zdo{i$6k0~F4r$?*ub_vp*gL;5^*AtZ zUDA@%6E&3Jtp;y#;wbDq*F;duAl$eL{hI{qnc~^Z$!|e^7rx$k2fqGr4Ao&C>U0$j z{Gpu;ZBR$;7-;i@w$wko(a)65hrH0v%+U7CAN>y6u%LlHK;OSZ{bc`eOKXdA_A+D> zZgBh}+`t`0bvTEPK@5%03)O8w-}fh=?OBG}bD_3+=zb7E!{|aA$0CP=iev3zFNPErJ5Aw>C;3VD2U6m-#O35 z@heew^~>-t8(K(P?)6${To}JEF-IKqF%{@p`#HzyZZpv}rEgN2u0M6Yo@0$tS+m*X z*QBm+5XUMjtKFd^Rqp)|P47LC!#$!If6T$Z6S&yXuB`pt1TKSD*9^03b-eZQ%JQrc ziFG4HdB12qFx@ox<;8uOI^PrhS>CL<%5v=^MREYaS){WUss4ybPPhBZb-Ab!E)sXqrA2fIU2hYl6<%$>71PE~~JyW^>8z z7Q(jz@sS!dK}(OGvkNQ$Cn3V_K%SZmr%mE&9FxCd-!GC`87diHU+Ms_^$rd%~iowynl91@KL$yu}%yxs%}bJT{1)!?2M&I?T*Xg~zO_TI#gmGreHv8c+J4_VXA#0jsS z>^;JHfn$^v#^@zaUsw`MQ$qzgmle2fo<3KNku)=gPruKHt!v5TJ+t^k9_+rDWo{pt zNgJ6U_-*r)_FL#3#kcb@+bI}Tj&3h>q|YKu^_R%H!j!-aOp*w6r?1N`lixX6k82p2 zSk>Qdy~BG-GDoamP29pJ+UrCD84a)DhW;EtPKi9b@g9CiIA>Fb;oFoIxBFCSw>avI zl7P2gua#X(`OUkb$5Y=gRA9;Dkyx06)I5m5=}VgL1Swq?+YsQ(UW&jvqIyt-Li$PU z*oD`)h$^SmKncBS)@yYVOS9iUrv*d$qr6;$6KhZDjGO(P;nS;))zD7ky%&--o4-yO zZ|f(X_jfg>0wv$!opPxc5SejJje= zoF(~)H8SlREH!rmn7%YhwPtn2ao@nZ?vgu_*olvVC=K68#HqrGEySRyzTxH*bz3FIPb{=#BsZnirgDBK zkY=_G<~B{Va{Kklej7v4sf2#dLKQw!RldYcoWy|iL25X75TW#y_yx6Cy_Od|6V$pI zwr6}b^L=|0kPp)b5cv(5YB2OZH|HqKyW*l%Q!?Yrdz~oZ<<(RkziqEt3AlJ;1HYD& zu?aILON2A2rZPycAW=3*+doUPb^fM@X#&t`v@c9ji1?Nyu(mwRP_^$;mCy*><9uJ+ zZYPMZYlL$-n=ihy&Ikkeh+Zm~PL(DO(8FmKrO+UlfRxCYo0CAteG^A}%|Y9o_nG1G z(^$1zFDzZL0I-#O$?9y*Su!QOMd#KIo<=dj+dM3ouNRUVb^MZ6_sDIak}jKDpF~%i z)mnW+Cifth3kC%DkuMx2dN%o%-s0F=3~bu)O;t|-N2FW{ zlQ)J6-3GRXywi^GG`h5-IfvLbxB!vZth3Z?eaZQ5$ZlD=`OaZS$j6eOTv z1A6J7AOC-s6@A7%dJo3LW zN&cVb+?@Ybc`AX5>i^@x_9SY(?tfQ#`jeikU1)c$m0KKbsZMGLU(W!N0=J>PSfRFc zPqRgVdiECA$3L?-U(tO$sbcx3%EIEEyEI|Y+Kb1giw)9KMw9RMJTE&*oBfUb&4tG) z#QG_V!NV6TGfL=t`p1~WI6-hNsk@VR-p_QNF~)+nmA?vkoF>So6WZ;)umTLTXhMd{ zZ8PgWl8<~J8umIfG6pJJ4WhRemZ|7X2jEF4{g_{OwG^GQoO5-o<-PTRtL0gIE?6l9 z6ny61grWzC{NEKTIH5{UC{%EP8V;d``CP({DJZ6?5&Khs>A7%Ju@q_9tjO1!$9iLZ5Uf1cJuhf3$|$Y$&oHBwK{XoLuyK`$dTYhVoXVS53jm+FH6ru=^pIueR8!)iJF`0n|Sy^ zrO|FhdbD3D9B4e(BxRB+$Qv_phCXOl4oc@R)E{C&LUO2$PP-(HBatBjm?KviLzOtK z0N2@rLJ;Fbp{bo9M{2FU9{U^DBNQXvsR~yX-WIQcT!F;?l-AkYboOV)PrpR}EBpwo zu1DiIsp#&Jr}Nq^$EVUVm68HRy{^{fK9&Kz@AkG=2iHnR#uA{tmMdLrOqYIrynRN! z0dR3!!IOxI_mQur-H_Ma&!S-SiCHuLan z(+T`2-ZK(!?nYhO8n`vbP+@p}$Ajrb_z0utP24fCd8I1dr9SgMTnk+pTvzdq(@F)$ z(rDFecJXy)((K->KdeWEZG&}Rd_Hg&AZmLdywmY6MHuhZjsbu7KH|-dCkny}_c)2m zOY~;`*5!R-)bdAvycc|K2M^;UHN4;7?OirXDD9Y)pN?BP`>ihr2S0hdxk6WH6e=Y} zp!Tuz`r)e`+w3(FAE(M$>e^tTGfTVJRG;49UO6GR-p{dX`eq6G&((8ju+W;NS`@uz z$raPam~d&(%mVTp3gK5Z8hqT5a5oPfw_J5>N37AhZN-iqPjEU_ME00HvYOLlJ|q_6 zo$z_V;MMAX0i$=#umr(q(Vx^RI_%nZ4G4|@@@~LK=z64FzB<#)velI5-R6_u5`5&U zrjfaV@MgwwN(aNjZ|p6U^AFPT6hv7?uYyk0uW~Cem_%3#-(@B-i()+bd`E1&UitR! zQt_Jjp70l={2PFARpn;E?OSU!c49!i@w8Y0{J>ag0$1T1Z|^VX=0QG^#p$2J9S?}%!R40S3V5DWw*+}8%bwg`>4;3{U$i5{=lMyWhyVgCcG}97 zF#L!gyg#4)AI9D~u8pm08$MO6lopC>ixw^JP~0Ur1S#&p-AaoTZ-GD|NQ*-tIKe6I z?(S0DUEZYaea^X`?|a_g`^TEuGi&yqB#`WD*1oQ_zOo6|<$qpY?aXLok3A&;L@3+6 zAhao|hh~26$PnXPXOL$TD9hIey6?n>x?e>HFAJ($tBq$fqJ(kbO*Z#u1Cg=CiNy|2O z|Nb@{72jO)4fig*(nx{x`e$*4E8fE8598|!jfSKU6HHa>cTy%X54iy;mlJRC$XRm# zJ&D&$*(7@fG0DgK;R|W^2 zNA&SW&%yExq%O{`gZ}BBu^|{A3W;!6EQ)2>tOsyKNS`-72G7B;zf~4gKyzk%25mIi z+UY0rJL^XPc+;9znx_|F9tkE%_>%;V%I?BMumKuypq&AZ;~_Zu#o9qFi;PQx1ovX$ z<-SvcLJDdY)iik54?|%NZ1tAxW8}wat7-z=eoPCpmEzDhLV(-mYnfFtTj{x~q4Y~6 zVtSZ1Aey)F?`jbW4@8_j7DG_G7>ei2}jDTD4`5g8q; zA{4-~!r;EtGZh)b1KPBmdFx2FouH@~LH z307yjeUFZ=^Oj|w@Ki}k2;~meSS*w;os)mC@1AFN&XomxRmgf9&5B6^wM(zB{R(~y zaytA#?y<;ETvWJ^d2z?;6{b%{^OaEEU1%sPK{@UU@hm5Lh2v7v{#PA)cv~q}v9In{ z>5WBsfBn00*o+jrMg5E3hYTOlSR|)7a9oS)BZOK%Fi(-1Y9wX24qbOdrzL!L;kSt> zv!t;xUQxbO0pCM0=C_zPkcVx#y7Lb8)stQhYLl(h6E1-h?_I1^gMu|FZ4=SBgs_S+ z+J)|=w6cC|?xwZC`u=@ZZXYBRNd@JUGLuO}+vZ+B8w@q(Xk9PFUYaqhlwKqV-g#1$(XU8!1O_m)XoniSWEX>RvBtO$i$f+ZFw%o@j^^I!VZebAu$;Wbu{Vha{9;*G52M|c7ZO|qTETdOs_O+ziZmV)ybJdN zYIy|NL*hDf>145?Htv?Z#povWGcn~X2j8y1yJHUdr;XlS9y*S<#R9}(;1+r;Z>En2 z_rp`*c@_z4>ewjW?*;;B$S{hDA`j?OiqH97hw@Cn4A6(BMQm`%IF>E->%;|UB$G?b zivUYNw7-})8{lz}e{u-Ubq_9!gJtsFr3PpAmR&_!U;!r zGLHdIn7?_`7l6X!=g?Ln?blZknlc43RCmY1Z%0;Uh~o~eSmX^2AAWvpWt>yC`P6{h z8XUUw-3NkEJ6y0&+RWZn6z2sqts(2DBPNFBbSnsHr>PvZro2w-J+95j&sM)PZB)8# zzMyT9^3M+{kqWFgKoFg+wdY&}I{cZ%Olo;EdVur?oRs7FODkrL7IfgiPuD2X>^B zSpT}fOp4{q5H${bqX$S1J(2X(R-*!OMoinx)S~=!F&wN^ST^IW5XfGGEy@?lgtkOj z&xp=wg%oOTZ+b0q$pZT;G=L%v^Ol$%XF2%C!2&!B(-rplLG}SZC(G%vP8$rpZQ0nW z`vu4S>?%)tj8nuV=g(NstE;B9F82KUjjW!|RJJLg!E3#(30xu|_vb+mK@Sr+>nzlq zy=xwVJT9^vh7We=FIy0OaFiyA|S&8gaQR=_k)1Oyut#Q~D7 zEU=u3wFizOJY&B$$P34i7giKHs5TW;S!7E9tKB|tX!XNrfd7@5zHN+wK|-hY=g_~KUIQH5d+mAE+s|utUx>t z%Kdj>JO$y7`nMqO$j`y+mtLJYp%C-!-_OgDq#T);;tqfL)wyp5yT`ME#b}=mR=_{! zKU0uS43MsBaTtLZO9|$r&e8IzP~f=_(_7x!(cW{7qq@2Z4)lkBUIh6{iUVyv32{{J znJC6*I?^7n`xY>Evx`vdrKi!Iwxyt@H-+osl;O84GPo>BIu+NbP^;c{__f>OgXrN; zXVgIa_NrBr2rFOAaT*z|lMmUL^6jtL9&N$@$hr;UV z1H=df2t!5KJ;cQ?5r*6cBSs@dT(H)xusRkD=_)|s22Tqi9FIZt+*k-h-kKS4{B&l_ zaoHTMmbt7mo=)ut`RVD;?q7_qKHBpxKEK?(T-!GCO7^GSrdd&y z4?d1yv{DT_-C%H#DWxf(hA4#CBy1Z`zSqwMLYNbo)Gi&s@AU`ycnSYDE zz~-@%PwDb0t@%l(Hcyk*<&-1!(G3*tyas+vdK71ST59(ACdccITY6orY2cSL_jo{( zc*ETq9KZe6fLaywhNU6wt~NTeX&nV%ce|m)sofblHd=5=f2zf{y1ZK5y|;QeCeGY7 z^+|WACAlVlJ#lU6@z!E;e1)XkACZBfBonJidlOHrO0so|BE*Fd-7IDAKB+v8RP|`|Ps|@Sn ze5)h~(93)W8Bw1zL3yf7%|PX!_2>h3Gr(8c&qnwpLGS81k;g70>magd+snr{#mJ(fS-%e85M{&6FW=|FC^Xs9GS6hv5%m8{mw zu*$Yun!*89zh!wu=hI4ik0Haj1~TMIRbZ|{JytJeDqs+F{po1;Nq=4NsCoh8^qik> z)=oKrN~t?m{p~#$m_iM{&z=dd>GEBKMLN?|XGE;14qA(1>aK+}rDJB_`rEkYuJ6Gj zT#<_wU6)IyRQc+@RCjniQ7`b4)V(pxtQ+(JI@+I3@YVnrgZ%|cBM;`dj zb7~#zj1+6odbG*53yieQ-_wB^qnbtxWU(*UJS#1_H?|r_!#byT{50x#HWrW;-6Csw zBI9_S%8@nCYBX)`vZWr3T;@aph?hvn4S5Ta zIJt!+RF84SIgZYtE{zcnNRh;%}Mz%3U&tW%?#nf(kLI^Uc5MH%?D&%EOa++ z-ZO9wv0Jk1A$$2_^EqneC-uO#ZN~UmDh*jE#wCW`M)!F`JJ4*gu2Cg1fLeipI{>^# z9CI05UP3*GX|%#b5?CuFuF>ZPiN ze-9;{_;61ui*+f}q=n(#7L0=ntieTi=o5+|+j6BKR7==H7eY#@RMBey?P}uyo_VGjvPd^M-YVDcB zCdKK`AWs*EpapBe)h4BP~OmHQ7WHeuIyz1O_`&YjjHbaP=a zd)n1-WA~yi9R3`3jZVTa^IT>fGHSTM(9)#wsnZs2CRnGj7)7vSV^z!5q2LvSef;^_ z%J!fJwJZZBp{Bwu%GRgIFToD=X0PzApOwZ&Z1F`tP4053pmr*!=Vdc+`V2kbEUf9L zN@Zg4e{|7ceG97bwAPqkkI6A`V0J;1S$>Cm?`Y?Wk=|c}CLdXv*sW6{%ZcUUP>1a& z*rex;M(Lg;6T;a@)SNP9Op1L5eUGxl|4xL4V4f0qQ!lFqt^G6 znk9f$p-lRNOU(YVx{0Gwu=+Hc9)o`Qe5OU_+T!{Vt-<|*!|pVzN24-tHavONtiZPn zRj#Ygra~(+AsRq=x8H}6GdtHZE$R=Da;rApWtT4;;Hi^|tC8*gJb&6Zn=wm-Vn?CHA& zrvnq9z%~ z?k>DaTU(WHuxId8^clRSoo~pl^(^*4R5%>sKaDIWc+Vj0AbRT`__Zg1_R)|a2m!yM z&hdz;B>@8bV3o`%bWsr#O995)J7Eecnt=aF0q90j0CawSV?45AwF_nptymgR%FC#! zO{Gb%MHkMT-8GdcKF1$*@p-dny85lp%u>UdYaSM@*ydn;bdF@Dp1O#EybuUR2?20| z5r|0-0dTSq00)7K^nU)oto;Atho=4Jhav;5M1RCx3bKE%{OcjLV$+2)P4H@KDrti-`&-4f*`_ zVW@6exl5Z^w&JwdN#U6Ye?dU_4>uB&l`GehfYsG@-#P3zW-(&o`UzR7Ee={6w{pf3 z`W*7}47Iz*M_=LtB~HF&+b8{y{6a=+s_hGT$fYRDe`>qJye1^In;EgTw6D=>;9T?V zPeh#ePb55Y<8c+~(C=0F)5w2nXK}~>!vKJY{aN*={IlxM{-;VavT`(%Mv(No*z?YV z-ywCN={J9>wH*VMW|ypHN$#h(jS&B$i; z_o^YM{-<79gux%b^d6pF!LHU0Z?8^zlP^4-d`$W5NS&^hPj?Tk?2=oYmd&wc>9ZZF zBFi$VQ5@;AvUp3!h6*SXDpf2}H{+z0Xs|zlwa(;xNW%(!GCXt+Qrm!>HM@DxvT8zs z@ZNROei%_G+&(BIviw9bZy5^r-c2s(y@Ovunayz;y4 zGupkw%>Hz*t5Du(g(Bn!TEsdlk?IpMCEZ4kc>!~luE^k!1SNB`!C!$x;1Y{eE! zA$m`mi=-$XGg?Qu6b(BQ-*Y zlbds4SnVg2I64)osCuV9+UU4vtqS7KF9Q^%MreX<_%hhpIx=Vuh5BeSmM6XmV#~=s z5*vt5OPlV^T77v}^(I7U`gwy@iiSDqOqQ({ES=UxHCKnTr;T`5To}ZEx|m?dWjil0 z*xROmxl5-$Bms;QohFH|c&$4{GhLRPZ9!ZiX9-Emv@MCaqT=nHMOS37Eftv_DX%cL z3No&+5vw1!6K(}+N8CdR;SI{wdNrP6Y-dn&kRnlFVHbs@|3sXt9W zL%T{kP-?%m#3oV$_fNB$wR(o{@6< z0Yi)~$?_n_R*2@8N{!YpOTZ!?6&-thG$tP4Rd47}mq}kGQT4tqiteUKyJ%2(B!`qoSb?MN2*RH(u~SS{Q9UxKy>!wAF--9i-H!4s~Z_ z6szdW%0=FVNgm?~p5CwMkG?4H+T@(3t!V$?=AI|FNjVM~Or&nwyhjl3FOdq`hH$wIw_{1hyS>%STNkP;+>9+-D*E)q@&8%!Vp)`3Tl z!;hT&Ww&?li|T`*?fdNcB6osc^G503N-R24r`AW6e`X;(MJMsXjKk!FE#r@20sP2E zwtX4v9@Nj!d&*)hpP0@-m$f2UsLY>Im$nLqTp5tus6>A_c1Z%{{CHC8&gk|Azv1mq zOxfLWf>v3Lu+>>wf^Gq}D2E5o*uh%RWR_Nn&%7CR_-ZGv0$E}B!hx0kfJn+RZQYz# z#8ow&$6Mck<-^jz$unDxSPiSTzTzI~9MVBn*rPGdTG-aN?VDKrF(z3C($bTl885+a zl=+G7Fp%Ne+^g1lK2C?@pW-km$w>Jd>yy>IS(I@Em?>4HrY&Ip^2o!0XNFcKz0c~( zo$aUQ`ogXpDv;G9JM?|)*hRN&2KW&JE)K(-0>N^@nPR;NA=X^u!WobRdf`SM2bP9f zaQ{f2GQx>IhJHec<|jjk<_mr~>Az1?P9I8F@Ks`V!IrIR&0|KZ8z*zr8Bb6=;gJ_1 zoyW(L$9+VwvF5MZ*xE%Mj9qhN7e}b;SjE~cX6`R@)pIc07f%ADaucc*ua3QJ)Y(L@ z1KHzTrr3c{*8R%f0ol4>^8QrOkTQDaFnwhyHe=6z_ZSlT^2E!Xh;@Rv<&dPZ^E1-v zyU_?)_Z7bYt+O*O8i6?8Ai@TzzP`CE50B4V)64O|$-YH7aGl zLm2%4cg{>kJX@O^e}@7)ViUy4{cKdzK7y7gq|_b?uFOqJI zzX))|Lk9EC1;G`f<+vHYsRMU+_gDcTY@gh8<#)~bc-L#Y!EQcH`|H0FKgA#uKV8?7 znTZsQpRPP@UgS=7^0dod_vj@um zQFOz9R}Mvz8<84#@NXi)zvbKYzY!0TNMMRMRQn&5L-#hC_lsy*FSu~|G2!`ZJ; zljHnF^A0W&=MbUJIL80Obeugd!+dD?7a6nQiPU!H^N?pe2CK_!6LLmH#^YQsSC;T( zGs&Le+W+P2L;F2V!HBbyA>f6(`AT^y;q+uX1RS9~|LjXt)>oR~B{FL*O4u-)gn82fQKT4+VZo^~a6;@V&0rCkBehY30B>t=cX1CiD1=(U4o^tKkY2KM# zRd)e5IW1>mOTTI_VTt6(V6G{l&7w+{8FR6gqgUuGS8xu?WS~4~mCa}m+zno`B(_Qx zI*?js2I{$vo0ix-RPq^i3680Gyws;>nBjwYLtT2)ZO(Pl88=pIrg%4Q(}3?5X+|^U z#H0A)YFV2`hUo69Z$72a2l!nKMo{XGcjrgl9m|5cyt_S`YE%-P49lz8g--A|cOYp5 zDc!5uULX5cxsj+Q9>X2K`0xJ=Sov;_t@z@w@C`s+o!qcYCB}7Be4B;}3RXcYnykJb zZsS^7lPBKEECZMfdtb+aHAK6udaT*NZrt9+{e-~i!#b*$05<}LnYMil)RKCYCLCZ9 zBSAwt$ZMIQigUr-m#x-ZEMkg{(Zw8;ZPyCwwc(0*diaaANV_yHo2{~XHLak^ZUe=8 zznY;UGfZsf@i}p@q9@%+!7fqnrYwuQYjI3}3KQQ}tBKM89YFaJeRhS(HWm~KSLJRG z1UbfY$#T<9=R#scxvS(L8IX$dh-$;S7uB7>DXQ5CAmQ+K#3#!@&{z({D%18SZtu`^ z7HQC0h6>tAc+8O1s+`QbpTt6F7B3U0>pqoKkEDoz-(CoT2kIYsL>%ddx}qF6b%ISM zyOnJD6hjbGlGpx;+zM~J8n@59JFn^L-2=OH+G9rUk}Wan1%99EOk$!zaU&s=(jI$! z-Jd4Q8)sSCO10tVfK{o(!p3Xq?~P?kR`y(%C!wOIjpNf_rI_4><9##a#6uXwLzw%b zoc))dv2Pu<6qm#ZIAt1=Z7#TdiZ*=zU7ON*mJ7OY1FY(6WuWO zn(TMa&#bpBM8l~B#e3pcbTU!&RwEV}4moWb2i%7~D=f;6m~zD5Y$%Qd$%Bu+B?{(= z5(aLP`OKwLpPi12hXro}=3D|&#*Yo3`UFxx9px7oewcF}vTGmDK}5nB*unzHp%H>r zS8m=j*7Xyn2YSkfO}H^4QIL^OV|mudE`btn%Y<<*yzZ+OjwBcbkYhEZ!r(~Ss-&Jd z{~6l(l_>nh)~5`QH7k@VN?Q7pA81?G`ko8h?&au!oF&S2V)U(j!khd3dvb;Q!eS$+ z!fAI(PS%3`MDpbQg1b$%Z-NDntHgIWWyy@%59S#{6>2};YAQv9?(vJNVM_Y6RZl!Q zdQ7SRZH%-$jBnJDG1XbmI(r8vWA8?vt$|wJS~jAjmRde)DignDE0D}=;H)IlyasDO z08M8b|MZK00Fz;gbZeYFgQhe0VaJZgi;95Cla5zx!t~=GCOl!QNzKpg|0=TzNSWyc zP(FF?2O9|8Yw1WedUVKv7e*U9sEZ@Xc|Q-u07G(hXMkGnGzVnD+%d9___Lt1Wh#>@ zSC@-v1iiMkM&XDk)GLv#^NVr!(u51f#V{(MC;ElSR)Ol zrhA{}PJZ=JzKgXF$ICbs7}~)#eT}XjK|k{Ou50AyR~<*YMhYC>3UuOe1(F(PdN*Ch zk@EexSunr3US5~=oIkG|XLm22(#PwlFEt4N}=ASO4 zEq!PEmg()-dKHc%4(2EP{uN8#R`FTGwQlBoysnyn+MLk$@ujo?)Ru4lJ+cW z4!GsO#93ef1N!LGa{vG+?Q`I9!bQr0uI^aNCz^22j3c&ILi@owI;iuHwU4|LQaHZsFQUdwRB;Y{4RO?@3O?qK+{CP4))dmT;Qx-6>nEM!r^CRQK5wCR z{nUrpU$)mBT1u-apmq_V8LvWIr<|{2R~DUv-Qc&Sm1yW9E}wWu4DG!;RG=0(Y!EfM z>4iKE+vz4nJ&P+qqd3FhmZvA^E>0ZcMn;-h;T~J6cvP@-mI3h4f`}~!9z>( zQbNI6_4VLU+1P%gXL7ifxh57%&Qx8kVS0A_eUS`7{%FjB3S;crLYO65VRlO%U(~va zJCD4{I;nbB8DqQV=PncM(`NflkMBb34pTM)ETdc6BHaS>cW4mP>gW#SX`Azd%P~|q zR*A*Y0N?ez?}7&0&UyLnG~UNL95N|T))!x2rQn&A!P4&G)$w1$}sf4haekw*UC(`Tf#>az`7nCtPSDIHE*hnTt0D?~o#@(RPm1%fQDZ^|MO}R)%#*$6<2y?9E1BeDq5162oE$$aAKJ*$T1I>% zI-L~ghKj`W57lnNZuMxA!x4`>UIm9yztr8xu$S{y4DfulqJVe`o>MT*L%3PtjKqn0 z|3jqnhXs2ILjc!d%&IzsTOZ->N4PQmJGB!sb*Uo4)sAo>Nv#Mh%7lQry?;2f|4K)M zOzl+uTc|_)^LKns>~~>%*Fs`P=aFHv(}==QlA{XP$rSw7KA`drlpLZz#moyCYdgpqj4}n!BeJ=m$Lv=g*-$T zkWMX98Z@{uYYW*65lb3*DI|4ZDq!q)l-%7jVaO=+X@kEaL%Te2vgLrghr*M)UkIvD z-c(4QQ!yFNwHcDOAz2>kx>5~V)#A2_vnH{UbfMHA$CtA0VQCG^mUUcFVDcai91NVQM*yyCwRA62+PNf?Ub$%m?)Z50AX|4$MEIP+fEge(zw8B%^ z^k>8vpTfYwt zwr$ljiNvoH5^uNOuqQmY?8z&~ud8|SrL+EN_imXvEAz&o-N#AN?e5NMwW(FG3Th2c z1)l$Eh#h`!5>xlL?)7j>qZN8vRmKGR>Fxe3+f%ve7m8V3TqvcMkdH%LfiadP3e71J z(;RK*lIdl=)~1Oz%RMHFPFb(A!4(PLZ0W6f6OgQ79CF5~vJ zHi5@3deNT)ctYTq(i)T&h1{RnKfd$W; z`%z9=qzJu`jK80A4*!HVJIFMvD)mn2acPnvzAoX)JL2#x5kWGEk2#^~t?+jaWo7R) zc699DTz2M(n^KMu6G+*L3$yrqcQOgFHbKL`qUCEoMW@_yocCJImROT*=NW0SL!s7u z9`tzjyNuLAf}huF_+BV>7|*=91!?WDlFu&o7>_3QsKKlDI~m){2W~bVlR`43>9W<< zY(rFPQ5Jq8@jO=46==|?O*Eygh1_^&u?DP0dEH^<3-QX0V8U6)4PUv=qt2g}WGS?_>)WJW*D2@tlW;JzR`B@0jEyWQptgtuW;w z@D=?BAL;65uQCIYsZEKBcSM>=;EMLpm7lW5x7bHs_%3#Xl804u41zetckhdD+G;A^ zS88wQ`8{m7_Ux{q*AyoS>$lX;;gS@`Z3E-y^*&d&MU@xX>&6%zL(NG$?Zz5Cg#v7; zE=Ozp+??K?u(Ic29K>3WRNk)#VFsV(26}FkTsx zAtIbAN+!WnwD0kGCFFDy;Au|h(d0lp4d;^VK{IH0F3`cvPnvYZl*(%caahmA1_$x# zsMktNNyv}3KIv`oE>L9a<7i2E03`|aV7QaAA$7vl%oo<}**xb>Z6^ykC)V@9IONuy z#Vz#S{8q6%Tx5{^idgS$6=^!B>BA=ofK+gqBd?YFRrg?22PNTJBpf{nt6p^bT@R`w z*vI8e=LB#8Wy-b-ld%{nJioknsDC0qh?}`WZ`qr0_lXwJ>rb9go=}88A2pvnte&=+ zT6n5#_JNR;+5n)@s^6+DRP|cM2Lq4Sz@gz#FgxM~<6`;5e3&i zm$({F`|jerNqdcR+lMvolbQXA#bplf+`?`blu;E27uXXfGT8c0JmR&e#qgn)Bv)YBnWp2jXc zm%z`LIwn_ot~EJ&Dk38;65!7gy(m>}kQg@ImJ$-oiPI*?uLihH);3$>!--lxhi@oy z({Br0S7(71kQl{w3f{3hfVnZPUukLr^0jzAX9ujbo#L)O@V)A<--&>9Vlf@2+Xebu z0`3NOf_}>?r;!>2RRkWOMPLD0goPrk4Pp9!@B=1dUpIj1Sd)doBoYYx5&e%A^Ot~= z=#Pj~9bvc#dw?)xB;yicDTo11{-_iP{}qv-{Jp{hfB#Pe0;#_gMBWF1eX&O(q9<#@d@hdKgICez@Pu`Oib@gHk})pm%*p9&KU3i%b~R?T$)y-n z%`}V5P!s>Zw9*hD#@QwD#W1pT>f>o%L;PoFX|l z4@X0ay?p+~&#kkh1e|Yo3+100`ZZZ(DiD zOts1zHC8L8egazDF!ciccAgSOsHgrYQFUf=u8vRt{J2ck&Szt-aa?-^Rm9C&t zJTU;>HXY$OHXhfRK0CYdqn7s&`*fi%z#pCPtx#h;s%~nBigI$gavSFPVmaXT9e?WV zMLh{);0!aGD$TYLQ69<|9j`0Eddrkh{z3&+U8u@&+JvDX)^;vG+jefHqElDr^>h*} z+g8zO+Jw0v+BUI`Zz`+m2TsHcm&`EzWSegHS2LKne79|>__SJV*7w)yV%D2klAkwX=wEZuS z=%&0jlwa}lDyW-~_>NeE*mhvJN4haEv_ZmoBhGUq`+JM`Q?mp^3|&i;S8jz_9_+s1 zl>k$z61&E2X;5PhTg8I+aW^h8*uQ+P#cAZn=K55ja|oS71fAjHT?+GOx91V5y(8ch zlLRPziWt*%N_y6op+!m%UfqNK>m4wma5N_$>pVWe&e-wU6Q<#%^)AU1iMI1Qi?^xY zirGU?MX*WLKaai3FwA*OaPZy{Wffy&=EpEh*^Ro}7C+cQxp&+u{fVecFe~{$j8qNq zL#v1j%idIb2k|9Av%W8y*a?{v(S6+h4fb8^)(@IdqDyfUYGU}Bc(AD-1YC0wU9k*n z0q#2l9f7s5cYcip)n&VXm2Qiky`3s}fo*-AQ$oQ-ukM-m>I@(NMXwW;0ke)0zm9t@ zQ`$3{N=F)%rb3)l)VsHWo89o*m>u>vIyA!DY&s47(O2*Vp7;a8kn>=6SNC zM#gPs)4+c?CFVhOGGYJ% z-y4+MhxIPL19ZfjLOmt`kr-3C8SG_RQLXh)s2Ik57h>1NzEfUy{&=!VQkH^aBy(j0 zUenFfURdyTG|VUVfy^*g2`rr5nwcnvur^VY8J!Sg8Sfhq$6bBLk@X3Wx3ue7B z2Y+)F`hFaQq%)UZ6H19&HMM^FuwO;9Fpp7l72W+fdzRp^ueuh_x_3alcaHs%vsJZr z5wLNT(SP=`{NqJOPkVDj(_EU1$8Piy-pSp&wW`}UgVU{2yGr)qsOlt$2m zN(-8mg3p)I1x)f4E|#_&*vQkbXM}Kc!p0QX7ayerTixUS{E@6ho; zy&d%ptA-+|MkE8gY5pM89?vVlNixyVDOE3@F47rGP~WL&SuCD7;|@m$!cU^#}f*UneCux24ikxZq?_D!tdZ&t5RsP<{yfIKc+Z3jq`qsyJo4Pi|}C~CPO z+?q$ni75_Koh})z4RnuTh+zyM;XEPp+ZE++ z_!67`F?8ZqUz7{;%0gt-VqS4mXJ9ooJGO3v^lJ3Il6b7S;<6f43fy*nrcQ}C%-jI38!mE3 z&-HlQ?1&;xD*2Y4N(f|+1_P7^(+BSh+e?-rrit~rU<`(fxYm2LI-CYM|5bQGVa)X6Ky|cohww{7|X}7vnj?nE{cbKqt{BdN1Dke0sPXk`n zESWH+c=)|!pdr<#(rwa*eXHSkeJv=B8hXWX^~D!!|53YpSfR4pvT@P^`>Dn0=eEsD z(-KAXH`{sOfkuoKw@ENGzFg0R*!d){0;>NJra$gFYBw6!&Q_kPmI=3r-uh`9mMpIuySZ<2b+PewW4s=hAVa@m#{@!n%r3d{p|y(A*w-=}-rrtXi7O`#N_y(fZu-z1?9Q@PVk< zw%IP}34LQ0w;Rl}TyOGttq=E37^@GgV7IG#aNS!~^0POYA*F#=ldFzUvvV+u4#Hpv z_ikt2K5YopD4BkwMqB^6+McckJ789Ao+!>!=8;rC(X={b0`U?8X7l(NQf7PlaNRVz zi>AGZc9z7Yo(DO-bT{ILVP6*$uXmBxIKcjH1k47^ibF994B=lTDRUHe!uyDaE;C00 z#U{ZN+jvVqaH7h-%zCfNP83v^BHrV+u7kOH8%T8WeWYf}he46Y8E>y7-dUE;`AQ&3w3^BV}XV;TE3ZOJma)8{+6rVZ1+=+rh zZzh@ymNjh>?EPXD;xaEQ#ky5pcagV8-%9}&rgux5*-d{Ho@@R^Tx*Z#XUdVt9!K}nr_ryrP1@nY_JL`dIMFPJvWI-M^nv<(et9NJV<%Gx`x?W z7X$RKy_}QSNb~b>48AjLD?y=lVox_&TQMJ(6N0c){I7_sKne$@Erzh?gOooawq_7y<6`GfyH__Xp>tR}sRfBnQ zw@|-H*JRK2P-(l(^uvF>hhL2%ND(Bbet^g|X0N779r@`D?P+PE{Tgv?`}CIxbm#J3 z|NcLC3{+!FEJBbnbDT$ai5m8oi*33KbrpyR|20LJv+Ub!73ai$ zufXTsZAYg`hsKJ>#9{6|?P-p#NxU(0bq&S~IE;Gs0Yv|xnkpVmi#k77bkZ&#y+b#>^w1!$n5$hKIXW8w_g|G}bB^fnROHBzvUN7z z+?!Nu1qW8Imz+4Z>1g1`7Ovj_F3ibN_MJ5vV6?Hh;)eX|nd%a!NeWO|e;qKpb-BSe z4RDXnjn+4ftAuhs>4C0>8V0uh(D7s?0*QIzy-$5_s$bupC$?v|#Yt9#ahbdGiS`D! z_^$bdO-e0qUlSGUGThFhO<+;qyww`-w`gt{&yGqd*Zg@v=(#OpS9v-|>~2TjKL`~C zh!%4i=_#QCWltQPlu*yQyaL_!BbWtDLKD$8%av9b9F(+ZRf=hKo0xUkzw`@r>W?I* zrWTBicb$Dhvywaxx^#kKoqhABuUMFaZ{K*tvr4Hsx6JG>3u9;ZAW3GZMQ;Mo)m=vJBh^CG$vzy$ol~WZk zQR9rs%`1vE$(XTu67@yHyKHEs%K^=vLUpB?)d6X7!}QIkEe4WO@qwD2P1al=LZ^kB z@Xt_A@*3yOgBk^Z&S(*6^yP=h;vmlAk^^pO{n-gs{z|)rjUhP_(tO*^tBkNMyhy3T z6wP`~h8?#!xpyKs4U=t!6QzY|-BWn9h7EkJ-h#nJr0I5fgwIlNC1k#VA2G}-Xc!kI zz8cc&uIv=x+57q`udkF(Vz;TvMyX!-m9Sf%()|LG^R4Fsa{*E;*6L;AH&zr*Bdt6NQyE+pDUV?gmR_ z-Zj>c6iyW0@2_gQV1KlAveWY;N28u=`vCuCs!B};5$RAW1@GOCwOs{&M}Jya`BLHQ zc#JX?27QOy6}fMtvk{u+MI`OtEb^;oEvU;cRkp`;B7#;IE-?(T1*fnZ)RQ-#m*Ga* zYE@8T%jTLuY$rRdn{CQ;k4$^>g+m(fV`tq*>lg_R8$@d*y*Y~g7H&w|i-;m!Jfmd= z6wV>2?F5k&>uh1zFSZZk;r*J}KFc{%6}@@)rr{*)eUji4AId#P8?Jn-+UoreFYl;Y zG_`uu#E0`C($kO-$y^oLq)*>$zn)w^NDk?)1ardOWmeXDLCfl;vmx9^p(|rUGk8u; z^&xOo38yee_RYAY?D7~Z!6_QLXvo0K3vRv_HJH$grZWCul+}+rbM9AZ_V_EV(yV|O*&ff3nF?_|cQQ&{_8MtDHi>2e z*5X2@t8d40D>&g#ZciyHS=lJ3EHs?GYwp2aZWNq`4|ce2b{g%0)TNK$1;HEurrso{NVLNW4Rg3?x9 zQ>!bbRg_ue%B6YrOStOqijDuy1@zQK41|Jk`5;^w#EuYTjg>z|Zjyf&xq)m1&Cvg& zF-3+EgZ>Ch)Bh2c>L3o0VMxTqm%oFfJ1W2H-ux+WgIsnsnyp{OtFN)$3_2|s9kC_B zasgH&Qw8uZWD>PE0BAoBJ;mRr4dL$>B`vo+=X9d-Thy3hKHZv|A=*sQF>(_ z7!te}W=Xkz?)9aZB*n;JL$B{%!;wq-NUZ|*zeEhkbb?#R{Q#z;6XIMiGJKv*yuyVP94K;k z6nsOpGl^H?{w&vLBKpoD`p6;Lt%x=a!d_L2fL{L5IAkM^?<4lce>i~1Fg@ce1$XKn zMu0STM{nk|B4}-J$8>nsd2j3XM_Kwil?e_nuaT{~>hsIh&C4Ek6BsUgfquP%D@b_ZB-+@%qD5pR1@YDT;4?p|Fo z;2XOvUhLPUV@S)_!Y{sR|-2^}xNmRg8OW@T@I;G+lUPNzt_)3Yy(BI?GhO zEz)*7(t&|&*Y1z$uS93gb(so|sWR&iVY38c}X6<>>sn~QREzP#nMh>Gl_3bX3)njlkobf-Q=!&`XwoH-5 z$(Wdk-oMyMk$WVQ43lcj_)Yf{uZ6Bx_;;5UiLR|-UnA*-_%)H|!!dRJ|i6Sr`4K$FbuzIN!{C5$4PUSs~@mWq~1BxNR-Fdxjtgg>99 zH;t5rJ@&e24TmDkkPq>dv=>uBQ+R*uMy)h=7SRJzomMv_Ac9SQ@X|UqemD7cUz;Ac z#7j=mnbEJ1tS5rh$k7d8aEDSCtaw-IQ6#u>J~)MM2Afhka-2gisXRt2nJGSf zj`rblP2x_Nnlu9O5r5sqDg27T@aj%q(anQ*$15i5Yj=9(M)K?c*|44B9gs388*_Ij zQE}Q77 z5!ja>6%jBb+7-MKoj)&MbSv#lXZFRA=0<9tW)53)3Z{@j4MpUVt=hsRnFOG`-7d+) zri=(kpz;e=zQD$dsK`K&w0RjKQV&3MxWVa)Nb_7-qpJx^<%vf%Qw@esyvpwa$Fd^gkG?`a<^B|Lzd55` z)+Tv>;Vk~FdN^B`>S`PJK2{IlJ*T@l$(LHK5<^&jxd1sp#=l$Rc5rdqqFsOoeDag{ z5qNA+yKXsDw969PQdhR%o2J9*rn(n(i;F$nN-3Q1icGP5(Wk;7t@LWb2?sSY(xE56 zjS1+HB8A2opCIjhhyoJ&0DcFe4QaZ@+uzV6{kb??g87*eI-344@d)VUelegT%-DJx zA^t%+@Hn$YN940Jd*tET4;G0Mi69s`cX-W5anW^_Wj3VcEUL(wwOzJ|Jt_8i^Mp^9 zVLxk}meu$~777$ku(yXG^EN3;S7D~LQolY~X01w{ihR?}Hk?7D?OB?eUvybMx^me$ z^xoB2vU7zQYkJ>M4PXU=O#x~S+4S{!o~t(@)&_RVm4wHwRtK{>#9y*^oK3_^4jT4l z(r$8oq?G7OV;bV0$C|N5_; zuw%luiOhubHdHBW)Zmi{lw^@!X0Y z{0?OdN6Ely{0}E1nT?p4nURatL4Lq=%Q8F{^)K`rVnR>1m1Ohwv#8Q^a|gz4rkB8p zFZjZ82VrgmU4BF^Z00;vNg;z$)K#}f>{wiz_6q0gUl470p7bHTYF!tLi-(~tB()~L zM$#_cEBqDX@Df$=5>fHOC0#AR-g}7l43@N>fsx1f-#(OAKL19J{uNnK^1{~mqWO%v z%$_@$J)<-5#NP-l>_3qd1TV_Df0IQ!yf836qqexQza1%GLN(%^`-D7~FP{(L=kWxe z(OAIq8TDEJ?ep2?KOv-7&+V$uZO_P%J>vNq0-lkYL{04CVAH}*#8GZhiN(}pRt8_G zNp;PHIVk1v-qqUK!b3|lCHau9N8_=jp7&cxvAmOMqv9K}P1*VNA3}TOG;~Z9eMK0GI_Y*^K@;#a`!{6(;Zw_eRvT6 z3!W{_fmgcpDZXg}u8T@^H%3W4wIB^n^zlZAQ{3_DF96F~gT`j%zb?GRRhKXEq7(5v z$gZ<8@6Sd-ZE76*babPyt07Lr2eZFYSy14N>#CTybG;99Ogwr$4$|(3#=qKU(#O#O zG&|9z{m2Srb_hLkgz>r!Dah^y81M8IBGl|8rONX|^x*Hwzm^@2(tQ1@OE5Hn)?Gcf z@30_5=xL<#9gP^jWhUSfZpCx-kaYoO0eLhjPp!zre%XfHu)*?Ltw##HU<)Ci*lR?L zS2FpQQl*0s;ReE`tSUH@nj06n-Cp&$+s-(X`twpgc`lc}lqqj>EmuTWO0}q0V(2WQ zEa9%@C*TM&O=2w(FQl@UYl>VZs_&Wv66U$5Olya^sfv`J7!Z{1(j4I$GinaQDJ^B3 zN~A9NpGp*kZt+hr?(?Yn53^#p3xgVQLcVr5hf^fHH9NUwCOns0WQDqCTXzmaahk%2 z$2Z2c7dra+SL!lo?!IFtAq@AF(yGsT7t!Kt?;lEu$uuH1Li&BqTuZt0xf8I9;iKnp zkox*Xw2t)%tH$m*ufvBkF-S5oP_Jt2{10)-_oHX4rvtt&6b4xv2d53>V`UD;k+<<0MJ%(X3Y@3z{xhT~uT}o!FNbUO4|A8^x zGj%RQrkOHrT*^{O&3;1W3jmc8O&F&!w@*oEAq|uUTLPG-%IXD*uD@_f>rgR()twCC zTtj_%#zp0D3_s(2Ts4F!q^-Hz=HOFKnd`T(z~9n=n;r*dG;|YRl=6&?{2hk1 z7tBt?F%Pq24>tV5rv^6!L_6CGs*8PfS>NxK%Rrdfs{J`EwduQ+UCFj{oy5cQ3IcOe z-vLo8s9`?QC|r;z$=@oX+`))ap59<8PLYYEeqAs{5~Yhm^mvn8I%4Td|H;gi_!ne6 z{Hx`cgR!2AWLdK#^5xItRo9q%&=fMbb=6a%TYBcG;C=|PbMf&iZ3M@8xj6BCmbv{K z01u9ftGCg4b<8xE$FAyWD!ug;Q>*N}cVICQUlr)vFP?2$g-=+v=4*BUDhW;|lqDdseh5@R-7 zJn^xp@W*HbGdNVE4>HMz;z<&xR?{5V-``*2D8IjFMxa%2ftalf?^x-0nA7bt6LO@& zIv$GOAADqQY2FWp89Vb!a6U_!KZ#j$iJjkkJx(oYcWVh_sWr^NJ2ZO(A%}{8&nF1m z-(ww7)}DHgNbdF zE`~?Du4)+~3zf$ozaEpx}FeZf=tzEl#E(=u|VtvS5n(l{Em z-^XB@CY%O~Q{mwFN7zi)Me9eJcqu3M@zmtzT)wq$w?~)1+ATHHX}1xwZEw9e=(Uzb&wFKGMVr5TSXf7>_eUlEJ*p6%vwrW@y zYNj4ee!CdA)Yv+*KY7T}c9tT%34*OjOg5Ecy;uNRL@8x2&*B+I_Zf5iKCL;P(-)uP zB)aE1!5}i8xsyvSZ&Pk=c6BvkfuGI+_S`te-Rc@iPFytaf<6~;JKvN`0z1N1DQ(o* zS1>;NCx2Y2Za+*KR8O-D&9F#sP6#Net-v6*IzN7+#`Hur*!QX@^Jpa3Gv8qrV z3(a1=_W#qi81c8?kjnb3h@Ok*%wTB{x=N7V#dv5p*oXeSkqx%=N`>YwG2*3U?6<& zLPVl+$p4N>%ppai5$g~YCisIC>eACi>ea;n8;LMLDd}VNW#GH&j0oZ8Yl_R?dU54J zZ_D({e$Xk%?paeIbhu~tIT;?ewQWBGWwbrsF(B30Djd340*;Zil?=cx{o zgbnJYsQVZ*tIxmui>b^Me`w(qJ_QqA)Q4~?9eu%1b)+efKqOJI=}+D*>s7uL3QlOT z&>7u(dHW_~Q+sl%;er{dHG19@qxsK^t(*i$;UhJcrX|jYtTJw!7#f-YK9|c{?q5WTnhNI+{-HG@_E>_56%|c5%U<1 z=9n?v-2HcANhRN!y-1<@sqRjm(4G5{8b?d`lPC58wYm@OnHdvaw;DZX{E(&r`D6-m zy!ydklAWj$Y`t?#rE`3QcC=`n;fT}y$KR|nMvC==UW**u((jLMI;swD)$>CX%AM0K z_R1!4yy0TKXW6+1l<*bdbbIgz;{1&v?#TKbBR{8D=qkO_hR7{U*8_W2( zcCxMt?6#VYih|0htT8eek)VgrrfJi^>s7}O9cDb~1ePU&j@Wj@NDeu|#iTq38?5%ZLeS4;mT1Cawc0!2XIAxp^6a>rdksYxOlAT?+w)=FRg!ze=a< zU5KWTKC}s`wF_5UoM>+w`N5I<0lRbqb=)s_knFPiE8O4Ox4nBAc)NkS8D0w8TKlk9b8FL$e zqAq+Xxvk$oI{Wc7lc~`5+b9QJ{dT24`(Pt=0RG44W4GdRxr9JPUpSl)m5ZC&&6%O* z!eJ%*-WUte z7S=(%6l`%ml-I88=qFUg4N-mc$L{EbZl9U%_x^$swKdbHn#p3}iafC|0IKP+u3F|g zjd>`_phFHEA=USD&x6GSEypWQqFl&1S^DalBDuLp5cE7wS1trZqS^pI2V1}2wdyO$ zzb}cLt>$O)is87OYyX9c-`8XOL8ReuU}6P&sunwTxLc0(MoSl8+%kME9YJDy?E&irJKOW z{reL&mNpLscI=8GkMIn^R=i7*ngTXFe&HjEND#KTZUw_9`e+5hhEOzXUPh8w1s4%> ze3tUJ?IMhih@|z~Vo4q{VX$xBP;;yb!53-|%EE-232x)*v57aOnx9yd&f&wiwzW{! zbsoH;)u?CmeW!I=A2LVjF+5M{$JXwLMEK{O^z`nh2fsS&l;DH<3Jol{VFwRdh8F0M z4*Mcj;Kl%cs_#KDX5`cnHGab?JxTql08C=0m0DoBaqfb?BT)#%L3!*;NdtbnX!S{q z&#|hWLGMxFKhj)fb?4MB(grYP`8-fKd+;c@q&nCtp6ah!<4Y~+rvI364tP3P*$^z^ zyu|u`CG7SdJK&(0{I4lXcIcfXsFhZorQv5*-urvF%D64qfn-^VKzq| zSU2EsY&quGxL=+;?j1R}DRqsIAmFLMbsJ?15%6BlewFg=Wc{oWZ;LWf4ctq2{Nqdw zT%X3iHcMbBZ15IdG9X3^Qct&XZ{raFMfi=qbms}K^F6LH#jjq{f%*NwcnzQ_DWRWh z)jeXwUmqu8`Q4#c86_FRYt`@Br?!+vcVUhsa)K$Kjf{2@XqGJrlJmMK9?x>pJyFfl zqMw)Cs@f@RF`LKaHFD&+yuF6;g9`^3ugb6nCOztm=sf0jXsGl4dW%xtV?nRRa-o4; zAX#4KH8?y>lLcJoA;n$Tw;&ks(% z^fUjkJo4*q;+6I{_nhenQ87aA%IHLYWj>?tk z{N$_TLJ;Yt>rt4ZAorQPN>@_Pgd=Usu{tvMm-N2 zV>dAu5V8N-TQ&)vV}GYpiFmvQ3=V_nUvA+ZSsgl5MC`qLR*#Lb%YK>x3Qut*<8x2a zSy}d~Ox1$%Un-+SS;Ok+<0`cJy>2YW+bwB|hN^`ND*qhiu>p&QreBJOd2Bo{#l%XJ zfctzYSDzM;v4v9DR};)b1DO!kT7((OON43)fWy(LaLTy=`94Cm zFY#YSURYF^kNPwJ8hPmkEZSu+3?~45f?(+lVfY^Dbq6D#gHc`W))M^<2TBw6p`2)^ zu`8H+IpC%E&FeRKNC)9e^+v7S#q{GmqUDjV-{q`%mHDF3hrS2y8r&4qrBebN2;0iAc)5X8FVq}-b-nWYDWA2K?%5eSEGfFXm#bks1m+JZX9P& zNl3=r@h*SFXK^f1EY+E#r;53zJ{z=Hg1*9u&_Vln82wG(0FJVlC_yOj8RA{hZkood zoB4$0ArO0nM`|hWrTQkzhL&w|sV09tozh+fu-lvL+$qD4C5&p;gk7>!x+;1=x@bxs zoaVHdc3lQmXJ$+4x!;w3|8glUs5nExS1$!LeO7F(Q2}z*JxvJ&BEvEM*yJiIZv5h` z&4ij)%)8?em>p8l#fK^flxvABkl<;?udMI)?&3(Pf1~e7eL3(mznGGbS|Q%Wjdjqe!V6XX1BH=twRUM)E8Hs$M^0>;%*R|KpwXsWb&XGQPg z4kAGA_>{@b)m$SR-U{LF@#%+|mc;Nno?Pj(cJnm_dI*==genPVNj9=>VtDTVxBnC`+kaTOc%NaxTlL#w8VR75cA5H5kqlF40?b88BrU`f8RGXStV@1M0?R zO$gNijV4WW=l*6$GdnpB!5cpl z%-IG4WKM`@F=3=?;|3ePJC;j5v538*<4rHC?-5&}x@4kWs5mjU%iHvVhiTlLvmB?> zw+zH$?E|& z(0$hvZMV=*z*Z;p10A>%>X0C-p2WsGF9kSvN8BK0yS0sU+u2Xe%ygzQ7HyNjO%SY# zt6uA>-0wm@fg(!|Hg9jwLgW`i_xpxaY;En7s6dpLn}%6+oLpcGb`M!m&;!h{wJ|7I zEw&cHj5F6S7I%V$9U75*b8aebNo-hdV-o?^Ngi=gm7zTx?lEaTpKluh4|0f@w;<@_ zY!x(}ClxeCV-hQ9Zl4b{&_p!R>}HYBC|@mw?6!cvh4$@5LMEuM+}wrP6!gw5lo}e% zwmQ6GtH1jJh+c0Oq4iC-38ZPE{z@IP?*|VEP6JQMV9%vfp)WxmutrLpIsc6cTyCyn zsX>5Q8~UC1^e&Yv3=Qw07tD@qBN>7MQ+-}LT50|D@RQW%zRW|kgNVHXnzdO$I3#3~ zFr60fRu|PAOFkBU*!MrW-&ejvt()<+edv0NM!4%8b`Q4s0FQ#4Nk?bk=B&+6Vz+5K z)D5if-i=sCxov>)ZIqDm!Ohs zm_zIrIdLL|Lh%RB@_Zo0rCH8j*<#T9-cQ+kg-|zh|C*YDqZ0u(RpDxRZGBM#(%-p< z60fam@5hlxk%GZPO$X+{`1}s^RfU%5ic4CFKCubNxXWIbf(Kz|Hw17>r;t85`>umu+nC z=P0(ngwnrfYV$nFCD5I4d}%7+8c2G-molKu8LS-7e9yxT3aw}SxWv;8Db_m*tEN0C z3Ud`Gwk^nP3mc8Is0Uw1lB0n?+cZJw0oYh7sH(t|Bo<^N#!`{m$6(pX1%h#Q3$Vnf zq=H%4k0_HQQDA$N#wfGTyf?`Ot!c79@3_T|KC$SfzttoguEQ;RpFKc+ZGNu}C!w8A zqs^$+_p=6QjkrpB6(7p`s==RO4bvsBcByOE5_e#lohfmGyx>lyS@lwMhyHSFc!bvC zvZmHs(sTi+;m_=x~2{(Q|zt@Y&|k%2Slf72o;c_J*ZtVF=?U7MGZJqW0u^{3U?8x?043czEZEFU=DtF zCjP5NMv0$A)Z?Eu(W~<2L^|RzvvAaV>FcIXwRI-*txSK$S$CX1dk5fbU=uhvNBp`l zRSGr#kxhXri@rg=V4@UPqZ8Ue?D zo>%S7o5#f#vTc}78*0oLZa@^P5)~`hqU+fRj0_6H_5o#V2luJy)$aWRGb0>PGb;w}_1C?3@gQ;-fEnX7;_?MDYEob%5+_{ajb^U*0YkIJZv?p;T zd#|98HziI_I4n-nagfr3-K=(?er^clhS`ARV|u8bgS$(HZLv_=FW}Tic!)vV{XZ%hpwr3B4m8@7K6Eo9T zoztoQj&l!n5;Zbw!4VYnE^1gbLQD>2_6PG9l8-L+uRE&EkM!T@6+QlG^;e%{S*||9 zh*fH$5hxN;(M20yURHN4?3g1)M_mKHcJYhg72E+xPBoMh|K3UMMjj^@CUEEBq_4!@ zdfznAnLhkv_t6!nOMa?heplM#hrQh)kYIo^Qsk=GT%WtAxY)YB%uG*}Pj~BA(|(i| z&$DDq>)_{c7}B>3clNH0V`TWp!y@Z%=Zgj225fqUrZHIEx}U%1M~UvVIWz*w5jVQ1 z9U8Mz^?)B3Qry}oJz3RwV#80&{Z4Qm5M@r_AK;*?Pj9c&PY1nf_?rcK7@QuB7V&4H zEg6sTRb9+S(C+LNYpAag0IDD&b__3gyz&D`71MYPKJ-^E?c>A68A;bn<9)on9SA^A zgX-g=v2}daDPTpRU6C_s{Gn0No7xc0PGcakC=odzNrUH_X%TDZ+euVX_j+gfdQd7)D@f~XLI$_LECK#$FOR?;N~{P^7c9GL~iO|QpFdG71)T8!IEskX9=pOc1(aD z$z;(C!e5hb`p5#Y#&df&t-a0RG6@#B${N&}W_b=K5xJ*2hDYIu#`lKY8+3ZwslEqC zqv+N;U6hU22fDS2TT`DAf2NY6ys?Y0Et-15eT@?PnmW4%3!UE;U;#>YHx9g!Z$myq z!^Z{<#D5b8n3%<>DXqyC&X1N9I{u>bJle>ERh^=t)5G!K1y^1)JNuoGs%sXP<7A4w z%H7Jx%__7#Dq!1NZ*L~?QUoM-dXW~2lY|;Rbo{`E!O;KJttf;QA*&d>zPEK{dCBx0 zz*DL6%3U_eHcra~=nL6<_Xrq?D(n0<%bqnOkY0GlojaZq93yqZyVb1T)t_;)r>I=VARtuQsm3svgi_w4T23^SF&IGE?z(;SryQBc^gdzUfu2ctMYX?-L!s_W-O4tQ3(j5q0tKf1Vpm z&7uWtBfp-xGyUMsD*TikSB4}6V0|00Z>mEyP0ak-zH;8N(G`U-pzt!56RZX&2e|9T zFgbX>JT}(`F4{ZUOJYD6HC?})Mnx82KPWDHUDmp4C@GeWYMYv=U!0UGw;km4Hk^ja zFm)EAtC+;k;PIn1yBL!chUv5zQy7LRq8QWcG9$fIo?NZGJhDyvu&7@pJ%+MmFkWJ( z)c7ol_=JSRmdT_Gc5@qdnCF7Z!8D7@MWZO;gx8a`*E3vyR3n?`4lQOQB5x z1*Wyet2>R;U&mWLnbsJ#zKh#E5nTI57Bfv_6eZ~&meE4-Z)~^H*Iyb81{W11EpR5( zzr$q)C^mc?Xn}juxXt5;#7On@3#N-wUb`nzo9f#uDSt3q9f|b}#-tj%ojDCI`M%fQ zd+$WJPW#K0wg0Tdn@{EJ&Wd&n>-^FB)JpBy@4dW#wX9DWcxM{7LLXG0SWjvm z2F^USw>;BcMytsO>a1kDSnMB5nyiknLS<8a1O-6XY!@>6^LxJL3_`3l0AnV$tX0RLiD!^UhYkc3~HPDBWT!DW2c>ASv@7d z70RZ{7rUhe<5~Qm@H~1n^ug0j<@q{x`k_#lGfwg6hI@v;Zta@M65j1vSvDTRGu^wm zO``gA^&t8@`Ge5&T-vxB*4C?qQvw5Eu_LT;lF6vpLP~3@GNV<{lx2hfc&90LQweo58Ms1&AL^kQd$jn`y>= zz~qhG&1SB0(=Pb|AkUgB6-!FjHlUQ6?k9|~ImrC0Sh8kL-}k(UE6zJf_k7Ju+8Y?8 zd@n=As}yvDxrzq2m7ex~(oHLrSDKOiLzkO-cc(gTnq7}IzR0Y>4&ppjCIvujv~#II zKvo%@Poj%y<$Lwy?j-Iw>UvP2QbS2KrjOsOORZL6K4__ubt<&S8dFy$w=9lip>_7P z?V?kHrQm_ddkLo&fZtwykH03Zv8mvJDo3@)yuneFHst;%qgVD!PIj_Lbo?JKiyQ}$ zFZL=CJ#7>Orh|la&tNWskTOF)=!n>hRNV7j9W0#CsFhj!JB^3gRepjNqLxtF)7QA8 z>T2Xmcq;sP9yR3-s)UCW1;!3FW==YEV2&oM;gkN`Nj(!~U}6=rArqbYsyCt(q$(Ju z#-0fu_n}N$JQwp&l#T3%nsQS|P7qHI@t$cvop~lZ1QdtRfU+v`2}D(EZzmdx zB)M1g3M6l7Qp*XU>wZglsq~7ypoV2pLugN`6lIn2lC2A+h6@xS_S;P5!87VSTJ3P? zaHJ<758?Lg!b)cE_zNBsUj}p>QK9%Cz|x~-@9BG8YonBbXfzrK(KjT96oGf`HK3DL z?i+(M9H+5SNJQM-Gh+2EJ!S;8)TVlQqAfvcIes}~L1}hM0;-joNDIfhb@*m$7y};& zqg9%l8zOn)RCYLdTppRgdhC4f){_Z-1J#Yn_D2r$Q71%;cW{;ZV;heB^W3C=@EVjP zoW7UusEi+S!cj%%^Q}XZxwYl(R5nZF7e0%caQKNcGv=!!WziO57!!iWy+t6%(y3-s zVOFiYcrnl?rDaoL`&>ls?;GNODatHfqx>NS4Wq-4LES~{9-nov)Kt3r6RO8h~5rqvZ{K(4&E`BYNIGTP{-Y;xV$bNjS!?K1vxuJ+g+8xwS0I z3$q$-Msl=zD`SPk?xc^5`S6I+oIT%DRx9O#e_vtGzm0r5zIYnVyg6g!8G?7VwU+S( zWH5DPvv{W88~^H`m&#!1SA6Z(!2kQ_+WIfXCz#0lI%%ta*ZSKgi+0(Y%kl{iUzv%d zj!jCl8L5d+_$j_a?|n_iui7b#k|~SKrmjY>;EzNPE8)Fi0})`8zId%DymtsKYdJng zqLjJz-N&8&-NLX)Jwc;-_IgR9T(GU{-Q(?_c?m_)4rVR9Xch~cV}zccUNf-wN1@rmMgM0*G`U} z&Q&ea9q{9ht*;20TU|3o{a~End-y*|!|?I*!NR+&u8+M%k@o6%%gEuwOU&u?@n;0m zj*6~8U#A0G{cCLG(`r|l@8IbGb6>IeAv2|TbN1FJDacHmOKodCeK-|RYf(6>GsmL( zPajq zn*fC;HSBY@CC3j86c(SI(53lUA*0xh7hw)eJ_=9LKS&~#77vo9f|Dm4Y-|f_=QzPw z?9mQ3%yNqdDN{iN3nt|3S8yw~UqJn8skP`up(a__Oj6brJRmy|?BXuh;n_v&wn#yT zxo1jg5>}C_Cs78ec%TdxuhUI#I^0SuS6U(6wvr$d%O=;}SjX8||9<)mm2N3+ zAKP)GiQ}&ps_!&LY~S8_psnvB>1%wvGPu3C*FI-n0fWuPoQ(a!X=|3cVAxc z8@e(r%cB;qPb(c3cMpw7PgI3ww2Z1h4Y#Py^1y(;uf=&U{BRtf8It@{^adnusanfv zetW5}EpCZrrQkBqZed?tGp^3L7_%(6sI8!SCSy>(88O`-bzO?mzH+%} zClk}S1z+!z?QsPX!93{=A^0BYk9vE*&0F;f+d=i^x2c5r!XVaTWwC&G3Plopjj96^Ug+Cdid6iVp`WVnH5s`k67Bb9ClR)6h&VH?e*&Kb z17GW1l%v92JW$-ZA;J;k>7oZ}y~A<3TAX$AASgR+Rh~UaVL?dFh-IQP{w}F7YmP<` zt@?&wVlq6zd{&-iD37=XGfhO;k{35BBYu<*aH5?-H;FMr7FzL(y3jh+fTgLLbRLu) zR&RIsuEbtA9CLS#&tthq3yrmi*kY>@Dd*j}%T!{GW9P=;{WnNwBYG_djykTChIQDE z^m=TO^iQTF{-__;Cg&WAO04G0)j8?fDic%uF?Qdnj)+KrAGdt~$31o7;#a9N0`X9m zF%f{nsj*>PC(v+4Ju;~>SNt)#z`uxhejJ#~u9c0K*Kj}(F~5HhY`ZlRU)&g8KZo^k z!(C?%Pt)4kp&ap?-*Bev2a&ETS9QE{JqQ>EbaUH@HxBME3yDazcL1E;zYomM208d; znFm%k=xQP}F{G1E6#Xb1EZ(L6Vj`shg(xB==LZ8Da2mQ3wvjr+!j9@{`wxQG{pybk z)stOUSOr||PU4s-o3`v?=caH9ObsFG>6V6rT3f2zjCnuCj4bLM2e@aq_@7{NY@HgC09&oQh_t+Ho5#I4mt{u$UJ zlXC;FvUk??~;-|6`T4vO%0z;JgK1yDXDPY zz0k!r(I6LzF_r~ZlkQ!D+Ga6kkOV%%>=veA{|VRU`BR3agnPxxWb?ga_dwU#Eg6G{ z)Dg$xw=MjNwU9pPReAl-Kd0#RwaYNu?ksKd+H)Z+h{@*;y0*oobDSn0*i62mt9eO{ zrM^QrCOHB&n-V@^=$ zRTxumRO7rmH-9;TGZBoJnV?&O&?~M`uQn`M6)$gfIMSOj8ZQa%tXjS|@Z5~nD=_ki zL=T8gGF<-5sq?RoTF5`F?!qJ{3=&(DNGj|zjg?isSdfoCYmE5`sO|=MSoIlm*ltj^0ppGmio{X|IAdmz1Z|xgOIGj z*`^(RLxsmL)m&| zK=WWr*7e+*I2`sBB{xin_j3!~hQB&yO-~MUm67e!i8WB0Pwtq;SxxmJDd3Z4eyx7PYP0fDpu$_Cr#|HpCrT4`U%$Vtc z7I9KmWb5W;^!vlo$16Qw*6F!}m_g9Ld$8K`9-O&*m<#ssRZ8s+LG`E)t4ygZ-zlq%ckR80nlH9xgP?>33wawrN5yusTy=95&WM9S(Q&;bT zwJ_{)ZST{ZAM9E z73qQzb`OI*Znf8W#P^s#4EcgNPKum4D*h~%7wDZ~1?@zpU~XlA7Nr3Vx7NunN9~go zsUC$j>#73|T_7}Ta%xaiZJ1;P15Wbz%TjCVTi+g|Y1S|oe_3i5lp)EMG)>mk0naT( z>;5a09_f+8vuT6*JDyH6$1Qb_w^q;_A2;{L7IL2&eCNB%i;b%z^Y~D-&J!y_WT4N$oWXNdnDoz9wxjtI`e^l09Jr}pOHJ|XPyBG{~9S%jYVL{kZcOcGzmP_85(!04G4B-;-T!Kb`YC z^WtEcY1tZ>1y}ld$%7m2*-($vT6KOh5*98A?rCM^sU>dY#`@vxzh2MD@HA77BO)H> zz4B6#4db^b@=-#ln!tED(}#<&`!biCzieKUVNHnC|0561|NXt3$b6mc5XC3Z#L4N^ zH);B#%s&Mt&!F4FQ`=Kf28dv;mniD=Nss?Nj7J1AJ?=qLjx6C7$gLz7Ddx&E>9mDSnEC-&KTSfUjR6@gYQQjHDtt`SP72iFNb zH75}v8KnC>SN#sD!7!apb*a$YHet}nj@M7-_dVk%yNq3-cR_O~3X_1($CU4hvrX*l zILJPSt6^u=4?FKu;*jH#2kWu~q}F#oa50=&qFqg4ZC%O&?azmGS&E9iB7&9VXPfKU zLW8q83Hu7CYYa*298$aV{=jusnZb$|*T=L6nrJg6DaUtR{_EJ_<1CF`SUIV4Fo9>G_)0js`;FG~EgVdCT5?e*` z&ti!^wKY)hhQ%Kqhxb$V-Rk>KPs)Caj;t-mKWFqaT*LMJZf>zM^K01kO=qWlGw}Ss zB8tUP1= z+tQn}Y`Q76M@M7nO>s%70^=O*5_0Z;4A-0<<*iqTvy>WMSR2jOFw0lr|jZD8rUfO^mbn~8X4h#J;n&`|GlQ;jt<93@*`iYMMXM1%O zN&!FXEB*Ao$OT#%NknELEw|8|j&M+y>6iVUd{KMhUC*a#KBBf|bg4^cu>&pl$yAr< zk)IdUxnIJKMnl0Pso!#=%TPc~YcV4T1zGz)r%*9X=QNj19RX}BK$UB&eyzgI29;xE zm_7;NZ-|<2v~c{f7Q%6s_HdY6)A4q#Q!_TV6Ci-a!TY`;4I5j#X=)Jm4@ zB%rBCDP-@QJRI$@Uk9@SaXi~#slsT4!hdmtaPo%pEtnLr5p2Q~9>qcY#yR+G@~(eB zN# z3lF)`2>X|72E1>9>7V7u;5r|1GEup$Lq@VxZ^8g8*$?;WO;n}3&S8>tbez5E*MbGK z#fbR{`u88b5MZOIVOPMf*si*GcUF775D<`GJz?0q{Xoy(UId4#vOMB1At}errj5+? z<)*?rCuQAPXAAD(C+A`-GV#eE(c*>&>P)Hr|+He_YAIkC3=UJ&;re5v7jPpzWZPP?y4qt2CRAkjr6uN*pJ`T_ml-hqZ zskt}3x;cN+5j!G2+R3?A`xvqkvSsd3F4ZPVmYC80j<@YwN}fXoisc$DTQtIAdS7+Z zS4ul;4?Ta|lnY5J4xuKNuF9|(CT%aO$u<%)rI0pLoki8hv-9<>51|mf=7eA?KW8Fy zg|98OJqu!q25I9PjvrZv10Ev~Zv80V-O1(_d>fUL?a8Vx!uNrEhQDMxID;4LH~nTb zDI^Q9s5O~P28G-*g?i3zjTkVE%(#b~%a5b}#2JXe7*bR149Q^&!8aKC0zhC!_O;BI3lST>Z==OB%Gw|k?-SA|B zmgkl=FAwD1YMK{3?TWgVN3gCMr(ayup`lzK{pq{PKNYiaDr7WqyO+UVMXN?@X|}81 z(Z@}N_r>p?_C|Qx-8CnD-!s1DL%@BM!7VaQF);?sT&)iofF@xAH>|vY=y`DDeevL9 zsJVf}j=Y;&^8&jYd5qo&7Q%Ki$xJm_f?_Y&&&5j6<}dTGWyPewY)VA&RtvR)A+s4$G+QwU3Q=3!Uwod>5>O0?ak|!6z+S$q7PF7YVKHu2C zvXZ`J?tAc_E|+%=YwnLe(5}X)Php!sN{0PW7AYs1=B%|7{q6*6WkYSpBD1wHPgp2A zozF0+mgZg5+CV7z9d2Yr#T4+t*1lY1@3E~YItGc7$5KfF(=L+gEKr( zb#+3y_#Y$*Z#)d;?>bO9V6Wz;c)>nJ{4hC{gjscQClwbaV9=#NggLxLx!xVgGf-hZ zU*8bk9hv7lBWlTjHsG4fSqXE)Idyw1VC8uZo&V>@vgg)YWT zY$P~$YU}v0vs9}cSyA1fno)J0`OI1Wsmud9%Bl==n2C2i1cBPM(-C7QG|8zycC_90 zX(=Xo3OEeAoQ(}uiZ1bO_}TLXf#V>6Ej9nTNPzi<0Hvyc4@yu`v zxi=rRmkZRy0i_L$H9-i!&97p<9ud-jW8iwC)^X$!v;7V(!AHW0087vdFK?px%`8P< z6WQX-zIKy}*%Qh=QJ%@(Vg6IlJqAYZwBG>F!Soi?aJfHLNjS2bW=sKeQYnv-@NR9g zNJ2BfeEQ7i>uqpL-Xovnk-8w}mV$rL!YVU|xgDu@BoE(|P+rTP;V)a}nuKNA8)Mr> zRi-*;RSF0K-MYWS((fccJid7H+L^uAb6vGI62k|{ArG>rBF4N(Jq;x+NjREAn{ zd$vC5ErV!;L=OWdkUxSpe|vr-AS{plBWcU@}*g2VyF?+EY8y|jh#JQsu8*juKSJ3f%`S2-29?g)gfi64hH_vyE;;&z!t zE-90;MFht=Du;sf*%qe%>Gk|>t*{q^Ug|5<^}_Y7W#{FVq$58de8g2(NgP zoXK^2>pE@s$RwY22|eaNb+Tqc^D9YV>eziS-Uq!bZZ_3@=R@!#ZH3=RwXe0^eai)Mt)GLca}D~{r&yeO9>-88aD<9pm6n!4q=WXuB*f|?u_)#@#Y0KZ^G6eICo)bVHucI(LnB(*m~ zX<&vAxayRwWWI*3q&rWS&e$%OUGP|*u_j~ATr@ab1zbzh>}2*m^~2(CPfqiGqN^9} zEZ&noo!-}xR>2KWRC#ZvsPUYihuRZp)l_TfFf{Aq2B=}&7cEaT*ts!7mnXo3EZz%F zmN|iSj6kyMkiVpAWKYa>y5qc52*_x8gEIJrFxIqf2WSe>H} zSOhmHBn1h)-*2DyV&2%+2QGIlbr*qxp5Rg=ifS|}A5tTU#W5I2#E!8w=(Y6dOjNLs z)u)UQtf0%Ef&B_aTN&BXPdQai92|{o8GVNcIzBw8BE>(lJ|3v%C10pt2FF+W)`Mpg zd?J*5uGd%hABi%o$pG^5JWZp5_-O?BaXr`at<1Ewj zts>||m)Kp61~x&E0g8}jx)&4$gZi!}SScMC6So)G$Ze=CrV%&-D4*}Lf8jNE6{T_^ z?yjy3FYC3Z-*Jr!&4`%$W(|Q-+QFpcp=FFhmk~bEj9JNf?-AXs=jiKP@4tFvSf6d$ z9=L6ekkh3Ejl+eQ)By|G(AD^ZsCAdyZ{koR6~m;lyiiwZj{io}_SHgLRdml~j&8Ly zB4Pp&K6aio@0PhxiSegmn__TvjAY^iCB7ZfV_Nne9%TB*5Mj`npBZj4v-YFO!L+*s~_zTa%v;O*7XW)yda3?UjUXRo>4ykX@xiY8mR#Q|N@u8;R9oj<)=LOFNNL%|lCzWWh5N zG3Y<2ZTBVOlgR{}EKc+^SXmW~PPQ=^GctTcvpRh99b=<=ed%WE-88P@Yk z^cu&r?F*nA4?NuTX>LyoHa%4833AO+5)Vmn5YnVYZ}88|*@wuVCQtJ!VX7dSGHp^D zyYA$CC3Thy8DwCVD+fY+^NeuBWydEh|B7$$bi00Ob@kf*8P7lTst~^(-}>J2mcsG+ zw!M7nk$zZQfd7n+JxD2nU~Xnb6?SwD_8UY#%}bg~&DIQTbJ@olfJjXO*AI}8x8Uo5 zCp4s`E%>e^7N>HAECE}8e#qZ2I{YA=sDW)Rr4L`vbkDpZ)Y!y3;1MS9Nek5cqR|}B z2jj_71Ntc%ZNl?KYGeA=U;$mnPgcK<3G*prR5c0HwE{d_gOJL~>;S&%Vn2MIa%9y~ z>b0NIs&178Se^pMH{vbXt@l?3D07s)0>zaP(WUYvt9eMBZgn=QZ@~#kIUph~N15n) z9tRJnK+Pk00`5&3|Al0V*i9<$d%VIu5|kZyjP#8@W1l_Df;@|ZI!cFn>4++f#h#FL zZDh!gn(jVql95lI1-w6mCqtuCrFkipCf*NQ*dRl60O?r^+#sJQU89tvy#TwDj~WQ= zf|6wCtd^CL-c3IKWmWYKVl^1(eqDTxCODE9dl$n5QbYs<-XY1-{=4FR=h=4>*@+Rl zC1j}MWgoB#FLL~yo$qr|p*jvOA*jY;!p}q!L&R^@%pJ>36`^dGw8HX@(!BN^A*g3@ zQg*=~rk>D#?zJ`$egI!KHd`6Bc|FL3>flLFL<$mQ>S75}h{KfxnGOynPu6s-#(2o{ z32#4iWoBLcD-CWwo%FpK*31SATmKS)k(jF5$ZuBjdBr8_c2iJsN4!qzAS@PCv+#W7 z6B6yK;ACOuMdfbtcMvL>XJ9I3;*jXX@V8M*D>bd3-V{PX8;MVh9@VtH5c0uR>CeUl z{pj=7tn)N0L1IbW^{(TMyFCL`SOd<)+E8ZdK; zZSD9@YKl6UD*VF)mFqR-o5;}CvMQN2M77?kvvA39S`lf>ckQwEA%V5CpHnNzFPu%u zOiB5;KJYCe7hnZ8UtP1!L3dP?IbrQ5+Z%up(4NncT&L8FXw*3x@d0!I%XSvCU?xaYkZkRriD<{1W$^uymj*ekg7^A1wmEFdAsh_$#r>u&N7sv;mg@A7xQSNq0h z`PL7xsADoO5munX)9jYEvt;HFWK^TMY(GTfHhRG>A-FTdLh7OUs)(q3W5JJ3i3t znPm=i_8~~(_!;FyT~LDGoJf{%4q1w|B`PNDD4U&N9$< zlX85Ja8#|HlOU#AiD(@Tmdx+Op@swkJn^L%u?V3@$$rUwALFgln$ZEQdaS9Ie}jHR zTSg1I`NVb&{{BqO91XzT;E7m*$m%Kn-k5+C6IZV0Y>z+kJ~WA{sm~3CrS?bWjy8CU z6Jn7OWmCPs<>_R|(8zlq87me7j5fZleuH@Y)(*)aWhkJYV6mUvpI`cu9hZ2ByE|xu z##hac*I!}i@>I{fuu9K#%918*G{DYhuiNI9$v#d5S6JV`qhP`Y$ZRv>b@$YO6$fq*DW#jGy_&&dp%IDA5@=5g_#y><3>!B@Q^>ok*+^j3dME`F<0*Dp(W`6pdY>eF)GMWrp@ z<%ZAoiG?)?&gwTzpdLS%hiBa*XxM1i_?kib2R$N(e}Lom6&TO`QbwbuI~6tZwMqF5 z;of80y1otpP*sn5Nr_*`V8;oS!CsOqX(!YkD%F9&O;%oKxk*g~Q@`|$V0RGh)l~ij z-7=CNRNl+bNyq|;iuN;HCKr1BMP8wtxYafA)}q^Tec<%@!W-hVKMhtd6*PE0i&G1I zUr@if^D6_7ZKm0H;1LhE+(Vlx)$iyD5M|t-ssKOT@w99Mr@ZbO1qb@FX~ro}GP>73 zR&<%=`^6y>$NE8NR=*AO21vwP3u=kenav%}Ew@EFWnj;EdTur2o1Yt(M8A&r(?qPs zS=#8(*T_H@qeiFq%fe~=(eElUl`}2co<8PL`-)61Li{tCYaRl-WIz{CkY89(S(#qZ zZn|{!#<90IK(l_@Q-|T&;O!9@OGhTe_bLs7bwLAHE5%(T0RZU^B>X9>z$Lr)tH#=Z zWPew9rn(>{zG~3a(rkveUgaG~NqGf_Pr2ZhSKM)lDoWpZV1a-&O#h-qRswyL;poG+ z>l&GBf6l@TV|r{?@8q$S_dFf(GAC$@N;!Y+~=<)0Oms^IMLPToS$^ zk#1TuVED*o_tyuV+3-GbIJ=O$34IB+V}&_y)pJM*ztOMZ7HM

&m(ySxg~*e05^o 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 literal 0 HcmV?d00001 diff --git a/nuggs/NUGG_ABAP2XLSX_V_1_0.nugg b/nuggs/NUGG_ABAP2XLSX_V_1_0.nugg new file mode 100644 index 0000000..6029fad --- /dev/null +++ b/nuggs/NUGG_ABAP2XLSX_V_1_0.nugg @@ -0,0 +1,875 @@ + + + + class ZCL_EXCEL_WORKSHEET definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + class-data C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT . + class-data C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT . + class-data C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT . + class-data C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT . + data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . + data SHEET_CONTENT_MERGE type ZEXCEL_T_CELL_DATA . + data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . + data SHEET_STATE type ZEXCEL_SHEET_STATE . + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + + methods ADD_NEW_CONDITIONAL_STYLE + returning + value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods ADD_NEW_DATA_VALIDATION + returning + value(EO_DATA_VALIDATION) type ref to ZCL_EXCEL_DATA_VALIDATION . + methods BIND_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IT_FIELD_CATALOG type ZEXCEL_T_FIELDCATALOG optional + !IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional . + methods CONSTRUCTOR + importing + !IP_EXCEL type ref to ZCL_EXCEL + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods DELETE_MERGE . + methods GET_ACTIVE_CELL + returning + value(EP_ACTIVE_CELL) type STRING . + methods GET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + exporting + !EP_VALUE type ZEXCEL_CELL_VALUE + !EP_RC type SYSUBRC . + methods GET_COLUMN_DIMENSION + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(R_COLUMN_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods GET_COLUMN_DIMENSIONS + returning + value(R_COLUMN_DIMENSION) type ZEXCEL_T_WORKSHEET_COLUMNDIME . + methods GET_COND_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DATA_VALIDATIONS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DATA_VALIDATIONS_SIZE + returning + value(EP_SIZE) type I . + methods GET_DEFAULT_COLUMN_DIMENSION + returning + value(R_COLUMN_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + methods GET_DEFAULT_ROW_DIMENSION + returning + value(R_ROW_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods GET_GUID + returning + value(EP_GUID) type OLTPGUID16 . + methods GET_HIGHEST_COLUMN + returning + value(R_HIGHEST_COLUMN) type ZEXCEL_CELL_COLUMN . + methods GET_HIGHEST_ROW + returning + value(R_HIGHEST_ROW) type INT4 . + methods GET_MERGE + returning + value(MERGE_RANGE) type STRING_TABLE . + methods GET_ROW_DIMENSION + importing + !IP_ROW type INT4 + returning + value(R_ROW_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . + methods GET_ROW_DIMENSIONS + returning + value(R_ROW_DIMENSION) type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . + methods SET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_VALUE type SIMPLE optional + !IP_FORMULA type ZEXCEL_CELL_FORMULA optional + !IP_STYLE type ZEXCEL_CELL_STYLE optional . + methods SET_CELL_STYLE + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_STYLE type ZEXCEL_CELL_STYLE + raising + ZCX_EXCEL . + methods SET_MERGE + importing + !IP_COLUMN_START type ZEXCEL_CELL_COLUMN_ALPHA optional + !IP_COLUMN_END type ZEXCEL_CELL_COLUMN_ALPHA optional + !IP_ROW type ZEXCEL_CELL_ROW optional . + methods SET_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional + !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional + !IP_TABLE_TITLE type STRING + !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' + !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . + methods GET_TABLES_SIZE + returning + value(EP_SIZE) type I . + methods GET_TABLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + *"* protected components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + + data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . + data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . + data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS . + data GUID type OLTPGUID16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + data COLUMN_DIMENSIONS type ZEXCEL_T_WORKSHEET_COLUMNDIME . + data ROW_DIMENSIONS type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . + data DEFAULT_COLUMN_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . + data DEFAULT_ROW_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . + data EXCEL type ref to ZCL_EXCEL . + data TABLES type ref to CL_OBJECT_COLLECTION . + + methods UPDATE_DIMENSION_RANGE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + method ADD_NEW_CONDITIONAL_STYLE. + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). +endmethod. + + + + method ADD_NEW_DATA_VALIDATION. + + CREATE OBJECT eo_data_validation. + data_validations->add( eo_data_validation ). +endmethod. + + + + + + METHOD bind_table. + + DATA: + lv_row_int TYPE zexcel_cell_row, + lv_first_row TYPE zexcel_cell_row, + lv_last_row TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + lv_id TYPE i, + lv_rows TYPE i, + lv_formula TYPE string, + ls_settings TYPE zexcel_s_table_settings, + lo_table TYPE REF TO zcl_excel_table, + lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line, + lv_value TYPE string, + lv_syindex TYPE char3. + + CONSTANTS: + lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'B', + lc_top_left_row TYPE zexcel_cell_row VALUE '3'. + + FIELD-SYMBOLS: <ls_field_catalog> TYPE zexcel_s_fieldcatalog, + <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY. + + ls_settings = is_table_settings. + + IF ls_settings-top_left_column IS INITIAL. + ls_settings-top_left_column = lc_top_left_column. + ENDIF. + + IF ls_settings-table_style IS INITIAL. + ls_settings-table_style = zcl_excel_table=>builtinstyle_medium2. + ENDIF. + + IF ls_settings-top_left_row IS INITIAL. + ls_settings-top_left_row = lc_top_left_row. + ENDIF. + + IF it_field_catalog IS NOT SUPPLIED. + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table ). + ELSE. + lt_field_catalog = it_field_catalog. + ENDIF. + + CREATE OBJECT lo_table. + lo_table->settings = ls_settings. + lo_table->set_data( ir_data = ip_table ). + lv_id = me->excel->get_next_table_id( ). + lo_table->set_id( iv_id = lv_id ). +* lo_table->fieldcat = lt_field_catalog[]. + + me->tables->add( lo_table ). + + lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). + lv_row_int = ls_settings-top_left_row. + + " get the row number + DESCRIBE TABLE ip_table LINES lv_rows. + +* It is better to loop column by column (only visible column) + LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true. + + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + + " Due restrinction of new table object we cannot have two column with the same name + " Check if a column with the same name exists, if exists add a counter + lv_value = <ls_field_catalog>-scrtext_m. + WHILE 1 = 1. + READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value BINARY SEARCH. + IF sy-subrc <> 0. + <ls_field_catalog>-scrtext_m = lv_value. + INSERT lv_value INTO TABLE lt_column_name_buffer. + EXIT. + ELSE. + lv_syindex = sy-index. + CONCATENATE <ls_field_catalog>-scrtext_m lv_syindex INTO lv_value. + ENDIF. + ENDWHILE. + " First of all write column header + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_value ). + + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <ls_field_catalog>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> + ). + ADD 1 TO lv_row_int. + ENDLOOP. + + " totals + IF <ls_field_catalog>-totals_function IS NOT INITIAL. + lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-scrtext_m ip_function = <ls_field_catalog>-totals_function ). + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = lv_formula ). + ENDIF. + + lv_row_int = ls_settings-top_left_row. + ADD 1 TO lv_column_int. + + " conditional formatting + IF <ls_field_catalog>-cond_style IS NOT INITIAL. + lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header + lv_last_row = ls_settings-top_left_row + lv_rows. + <ls_field_catalog>-cond_style->set_range( ip_start_column = lv_column_alpha + ip_start_row = lv_first_row + ip_stop_column = lv_column_alpha + ip_stop_row = lv_last_row ). + ENDIF. + ENDLOOP. + + " Set field catalog + lo_table->fieldcat = lt_field_catalog[]. + +ENDMETHOD. + + + + + method CONSTRUCTOR. + + me->excel = ip_excel. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + sheet_state = me->c_sheet_state_visible. + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + CREATE OBJECT data_validations. + CREATE OBJECT tables. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +endmethod. + + + method DELETE_MERGE. + + DELETE sheet_content_merge INDEX 1. + DELETE sheet_content_merge INDEX 1. + +endmethod. + + + + method GET_ACTIVE_CELL. + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + +endmethod. + + + + + + + method GET_CELL. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. +endmethod. + + + + + method GET_COLUMN_DIMENSION. + FIELD-SYMBOLS: <fs_column_dimension> LIKE LINE OF column_dimensions. + + READ TABLE me->column_dimensions ASSIGNING <fs_column_dimension> + WITH KEY column = ip_column. + + IF NOT <fs_column_dimension> IS ASSIGNED. + CREATE OBJECT r_column_dimension + EXPORTING + ip_index = ip_column. + APPEND INITIAL LINE TO me->column_dimensions ASSIGNING <fs_column_dimension>. + <fs_column_dimension>-column = ip_column. + <fs_column_dimension>-column_dimension = r_column_dimension. + ELSE. + r_column_dimension = <fs_column_dimension>-column_dimension. + ENDIF. + +endmethod. + + + + method GET_COLUMN_DIMENSIONS. + r_column_dimension[] = me->column_dimensions[]. +endmethod. + + + + method GET_COND_STYLES_ITERATOR. + + eo_iterator = me->conditional_styles->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_ITERATOR. + + eo_iterator = me->data_validations->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_SIZE. + ep_size = me->data_validations->size( ). +endmethod. + + + + method GET_DEFAULT_COLUMN_DIMENSION. + r_column_dimension = me->default_column_dimension. +endmethod. + + + + method GET_DEFAULT_ROW_DIMENSION. + r_row_dimension = me->default_row_dimension. +endmethod. + + + + method GET_DIMENSION_RANGE. + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + ep_dimension_range = upper_cell-cell_coords. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + +endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + method GET_HIGHEST_COLUMN. + me->update_dimension_range( ). + r_highest_column = me->lower_cell-cell_column. +endmethod. + + + + method GET_HIGHEST_ROW. + me->update_dimension_range( ). + r_highest_row = me->lower_cell-cell_row. +endmethod. + + + + method GET_MERGE. + + DATA: lv_column_start TYPE string, + lv_column_end TYPE string, + lv_row TYPE string, + lv_index TYPE sy-tabix, + ls_sheet_content TYPE zexcel_s_cell_data, + range_from TYPE string, + range_to TYPE string, + lv_merge_range TYPE string, + lv_count TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + DESCRIBE TABLE sheet_content_merge LINES lv_count. + + WHILE lv_count GT lv_index. +* LOOP AT sheet_content_merge ASSIGNING <fs_sheet_content>. + lv_index = lv_index + 1. + READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. + lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). + lv_row = <fs_sheet_content>-cell_row. + SHIFT lv_column_start RIGHT DELETING TRAILING space. + SHIFT lv_column_start LEFT DELETING LEADING space. + SHIFT lv_row RIGHT DELETING TRAILING space. + SHIFT lv_row LEFT DELETING LEADING space. + CONCATENATE lv_column_start lv_row + INTO range_from. + + lv_index = lv_index + 1. + READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. + lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). + SHIFT lv_column_end RIGHT DELETING TRAILING space. + SHIFT lv_column_end LEFT DELETING LEADING space. + CONCATENATE lv_column_end lv_row + INTO range_to. + + CONCATENATE range_from range_to INTO lv_merge_range + SEPARATED BY ':'. + APPEND lv_merge_range TO merge_range. + ENDWHILE. +* ENDLOOP. + +* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 1. +* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. +* lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). +* lv_row = <fs_sheet_content>-cell_row. +* SHIFT lv_column_start RIGHT DELETING TRAILING space. +* SHIFT lv_column_start LEFT DELETING LEADING space. +* SHIFT lv_row RIGHT DELETING TRAILING space. +* SHIFT lv_row LEFT DELETING LEADING space. +* CONCATENATE lv_column_start lv_row +* INTO range_from. +* ENDIF. +* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 2. +* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. +* lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). +* SHIFT lv_column_end RIGHT DELETING TRAILING space. +* SHIFT lv_column_end LEFT DELETING LEADING space. +* CONCATENATE lv_column_end lv_row +* INTO range_to. +* ENDIF. + +* IF range_from NE space AND range_to NE space. +* CONCATENATE range_from range_to INTO ep_merge_range +* SEPARATED BY ':'. +* ENDIF. + +endmethod. + + + + + method GET_ROW_DIMENSION. + FIELD-SYMBOLS: <fs_row_dimension> LIKE LINE OF row_dimensions. + + READ TABLE me->row_dimensions ASSIGNING <fs_row_dimension> + WITH KEY row = ip_row. + + IF NOT <fs_row_dimension> IS ASSIGNED. + CREATE OBJECT r_row_dimension + EXPORTING + ip_index = ip_row. + APPEND INITIAL LINE TO me->row_dimensions ASSIGNING <fs_row_dimension>. + <fs_row_dimension>-row = ip_row. + <fs_row_dimension>-row_dimension = r_row_dimension. + ELSE. + r_row_dimension = <fs_row_dimension>-row_dimension. + ENDIF. + +endmethod. + + + + method GET_ROW_DIMENSIONS. + r_row_dimension[] = me->row_dimensions[]. +endmethod. + + + + method GET_TABLES_ITERATOR. + eo_iterator = tables->get_iterator( ). +endmethod. + + + + method GET_TABLES_SIZE. + ep_size = tables->size( ). +endmethod. + + + + + + + + method SET_CELL. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string, + lv_value TYPE zexcel_cell_value, + lv_data_type TYPE zexcel_cell_data_type, + lv_value_type TYPE abap_typekind, + lo_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Pleas provide the vaue or formula'. + ENDIF. + + lv_style_guid = ip_style. + + IF ip_value IS SUPPLIED. + DESCRIBE FIELD ip_value TYPE lv_value_type. + CASE lv_value_type. + WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2 OR + cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = ip_value ). + + WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string OR cl_abap_typedescr=>typekind_num. + lv_value = ip_value. + lv_data_type = 's'. + + WHEN cl_abap_typedescr=>typekind_date. + lv_value = zcl_excel_common=>date_to_excel_string( ip_value = ip_value ). + + IF ip_style IS NOT SUPPLIED. "get default date format for user in case parameter is initial + lo_style = excel->add_new_style( ). + cl_abap_datfm=>get_date_format_des( IMPORTING ex_dateformat = lo_style->number_format->format_code ). + lv_style_guid = lo_style->get_guid( ). + ENDIF. + + WHEN cl_abap_typedescr=>typekind_time. + lv_value = zcl_excel_common=>time_to_excel_string( ip_value = ip_value ). + + IF ip_style IS NOT SUPPLIED. "get default time format for user in case parameter is initial + lo_style = excel->add_new_style( ). + lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_date_time6. + lv_style_guid = lo_style->get_guid( ). + ENDIF. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid data type of input value'. + ENDCASE. + ENDIF. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_value = lv_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = lv_style_guid. + <fs_sheet_content>-data_type = lv_data_type. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = lv_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = lv_style_guid. + ls_sheet_content-data_type = lv_data_type. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content. + SORT sheet_content BY cell_row cell_column. + " me->update_dimension_range( ). + + ENDIF. + +endmethod. + + + + + + + method SET_CELL_STYLE. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string, + lo_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_style_guid = ip_style. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_style = lv_style_guid. + ELSE. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'No Data in this cell'. + ENDIF. + +endmethod. + + + + + + method SET_MERGE. + + DATA: lv_column_start TYPE zexcel_cell_column, + lv_column_end TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). + lv_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). + + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column_start. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column_start lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content_merge. + + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column_end. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column_end lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content_merge. + +endmethod. + + + + + + + + + method SET_TABLE. + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE '2', + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_body_style ). + ADD 1 TO lv_row_int. + ENDLOOP. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDLOOP. + +endmethod. + + + method UPDATE_DIMENSION_RANGE. + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +endmethod. + + + diff --git a/nuggs/NUGG_ABAP2XLSX_V_1_0.nugg.zip b/nuggs/NUGG_ABAP2XLSX_V_1_0.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..c9c763e4455ed803f030a74fe5ee60dfe72ded55 GIT binary patch literal 8393 zcmZ{qQ&=Sqw8gVMxsz?{WYX|ioM*_>=lnrwUS|GwRqyZ6KX*82A2 zdRpHPtOyH-3k3y*1f|wQE>gXsnaoQ81!evM1x56qtD+?*XCfgf0p`+G($F>0HsLhk zU~~FrZG9mUzCE(<<+;D;~2lt~xIZK#iXovU|qWY>#8#`9g) z;Wk$;8PE3R$Lq~-ES|S?PIoKb&N^jv^92BT*$$Av#{Ja(^ zzN)OxvaT2Xwpncqwn_-#?IRTj_caH)caG2(Ddq-09uJ!Ph}@0h*Q2+8x(d4&Au;NH zr`ul4dm}^w%}HLvZg+4$2LXJY&KsVNuZLrG{`|Y*iVE^c?IK3>iZ#8Q-baGh&|Fp0 zcEZW`!J-Zl&1I!0L)kN6msYDs8zpN7-ciA^cU|?oUBcT_78(h_IqXG-d(|U_=!IS9 z4?a_@ANCK$8!dXOeD~=Uya@F2n4{h~#*9IJ`QFpsR1%qhi9LMS8^?G0;J8088+rQE z_aj$LcP2SdWbpH7z>XNWgvA83gc3TkDzk{%+81ro@AV>(xSy;M%k*}C{bk2Zk)?z8 z69)dyv-=_VCQY`@k^!bYa2>m4yuK>)iHh} znjcSoUje_2YhN@pCM5xN0Q0FkibGZ_gy&vF^{1vq8Wy5m_ubxxDU93ViGavH_oe&j zkX;G9)`pG|tSQz#jd6r~2L0HVLiBE)SD)*T!rJ{rVS$sBO(0$QUBwcwkaSCG8!I$H z3rjHaMQ%oSf<>E(E`PwRnOQdPLylm+iS1HftZ^Cdd44rqL_?0o!m%e{cB;ndpAs>{ zfx#`Kt|^`@4->2X-0Mw7{q%MwZKL*Q1}?!X6i>_fZn@)AWOxq6L&eFUSBr-WBgs`C z96XmIZP-5-gunWZ8}F7_YK;2_-w`)e)SMw>H^c!fX!74iat{Q@vRp(u)QbNl)~|>R2H-6 zHrr0V7imIcBEi|uPpw#Ix5{pXP`0J2rI#f@{LqP{)Fu6>73oWiZ|m^=J>BF!2tv{Y;bVLB$}{8gB{Q^YJ-`}rW&1uRcAQ2P zvR6d;>m(&97rA|VF)L6Ht0)~|aJ0Qf;!QmRY89c#r1LHl=r^?r)~R7R(KSuQLi2aH ziUO+tFKiLn%}1TEZ!co?Ko8#ls-WnzZNFBGk0##gPW)ZzsA z_9Hz7UzvOxuVm{qx*f35V_vRxrM!2ty&`-qzB9YeUm0q#Nuyi*HZ8G>h&;y3u64Du zM<+f1a7k~sGksx_hHB zvHSK>98a@NF0L*cy>}AiYM~lT>tn*6&>X!emRh~kp%vd;ts#KvhH6{oKa7sYtl%fSg_qSftJOBCd;&8F|7DD3oWOLJ z2T7xi<1<%biR%{ZezRt?eenkLcd5y_1BwCTX?vX z$tC;k*R1aL|H8E%{Ir?f92E6)og5{LTV+F7t2p`TnBoxGMW-w-cDdy;Kkj{pt#h;6 zvIiUCwJ&gAmwv{QeS0tZL*vgM`bWlLPqzW=@?jT=zKEjrG2x8@0 zqxG{lOMvCf?IW%etZARhX%2SO%9$%QKWX)$f>6eE`5x7RABVyA^xRNnaGV~VZNuS* z-FBDr;%|}%hqf#S2y5Dsf8!pa128`HWym@<$#nuq%0_yIl=LZDLzl8$ti;4Q=n0V< zkhKYS^z^{-y)+5mI0VRTS09dT?B^}-AqCL24)4h?R*sVn7Er3_Dw82G!qbv&@$UQ@Uo2PpEn8!h zKcjgxLO-t|)D?4>U7hl^Q8DXwgPzFxI9sBabym*cvh^$MTkMsgh*)Waxv$r~h2!r= z2QNEWP2b2My1u zj61Qa)y-;mu8)3G+wy5h?zNIaZq9Wz@KWmrD5T&4uD!CMo({akSl#k`UIEFzw2=RJTMxD zSeF%{*_yAiiKyi7;*XF@bw2DiWsjk=cBZ$7Hf2wVE;qQp;ZAjWN3(K)~3V=UKE-`?aT4FRegV- z_9GTp^f8Q#-?Zn>jfQT@3`v%Qu_YgO05I5L7V? zEA8RW%IA!lU}>MDa*+9EOmCK|MtW>AApS5$Jz`rdb4?5% zq#SY-olhgUP)~rcvq2f)g+vtPJIeIW+VdKtV2ywt?UI!I9CV4vAM^Rh0Zm#h$T@}S zpIJdJ%Nb};Fg2ALTg@gVwFiIi_LU*7GDFBf!1JO0fqqf=B^7+BkAcQXC(HElOW{EO1hoa2EBu ztM<4S*5GuL`tH6Wb-ugUQ<;z%z>Nt1?Z>cm%fjdKt1q_yhG`;CEr7V8d5xORWvb>~ z=@3^arR`pV?&_lKlfm!$RG0pVW{Mo;ex&^Vcgxjh;ay<%lm@|JLW*G}g1w5S{MSlb zGA}V&XX%_7`WV>1Zlr(9h=YEs^F|u}5$6T96#nPhOhAat3Kt4Gk zbEElA1dbd99-*ElR4wI8vQ#S5AG*#Wc=cc*}XjS+!f=eAu zUziJ_?CHPW&uNTm9P!hR8Eu)0(ycOenkfhPY+}SacH@k=SBvlddQ8m7l;*|?j-u<1>(0P0^*v0KB_r1dI z{D7|Q#c3+rxU)q(!2yh%ws~6PHp_Z@3zL@Wpis8@tOy*&_K_FaIT4S=oc+7!wo3xc z;U@{nct5coTAoDHM;ao0nLd*c94U2=P$@OP;p&BfgP{O_!l|+pS;t0V7RaM9% zjT(GKEw+~U?|cP$ss8Uf1fhYLN8>Cs{612}i0A4*16+7`P^M`6IIO?WDvLsr@Z=eB zxFeGq;R@X)7#qy6%zR_@SuwtAWBb5{=*r8Y94e(NJ#mIgb9jfzC~0KN-V|pqN>EC} z*hQg!FPl!sP2$`NqC#*B8!K6?)nMvt7m+hIjq`EsdgA^vYlU01@Le;}r(JMr5Ed7&P|K`lH5x1zy=Qah1slUYrBz>?U zV>o3VETaRgtFn#f`1EU&D&hH>WM`F#xe_~bn?MC7cdGX_4oT~%*xxI1!{ZoHjO!F= z2j0>p>ti5iP4$gnJgu8mnS@7%N$mEm3~rA46H1ZEZYNDkfz#pi8dCg0P;YIKhV`*M zv+Yba^hord07O!8+t+YiIm8Nrlo}NGKk5q=$voHm_7o!F;?(V9{;pTy>fIh(b^s<( zYi^#GE<=_H&}3ftJjtK%!-XjOFhXx`FuNsDZ(J90T=KOn+7-*>I9SF}I|}$`2fvx& zM%eLqRlH($`ETPiT90xZK6Of! z8%9_ZH=e0IR|Mct4dqTL%wHZ@r}kBt>~<}YHH9Bztws$UImarM86Iu43vNn(T>Z?W z<@BoCAyrNCdGu^w8!k%Soci*YJACXE;Uf;$I+TZr{oKyYCeQcC=LSgqWWrs3uUDg? zZ6tuho@)O3vMozz+inl+f@>9nkL?p!h!yxN$goL0aSq!^6hpCokBhDg0L-QUrPN{5uS(SA6r=(4%i3E!HX?&|Fq@!WD-mXCS65~ zv5b-NWzv*NP;irJ%}I$MczhMyI>4>l-A7EB`xDvpO~yt?`Tm>3g64^$z^92?)fZKL zK4*C4J z2D{qwCA-*)hLPaJWj?2Rc>XW5I9v_hAhm@eh}sese>Yu2Rn9z^u9PVkNCP3ouk>p5 zSNfW3^IZFqB?04g-P(qRJq`rA8cn#oTzG3)@I=u>zsu7ndZ@@7HmrW=M>N?sJVK!O z=dy?nLA0(o>4l0J=f1RR!~pzfMSG4uokb3IjuNaX`9x}{*a-#%0Wh{qozf!?=tzOW zxBBi+6BJAhpZC8 zek~Jl)T(ry4k+1{3^!Z_!lCg}eK5HLCBw?3AUY;!KFP^euXg`6>r9 z7Hc&uGR)|RB~R^~ecT_wUpXwm!mYX_apBkJd$U^9s0n`S7t5VS9K7_2V4NmZ0RV zF<>+9x*Ofn7{}{7!x<*u+tOo^F&tD7Ro!|b;1V*+ z3EuGj3U*9YV3VR(h^xga_>#)}HJ!0ksOGk&N5d+1^%!1e&ey;D=W{}X zU`A+I?7SlEw}ZcH+~KgsQO~xdqy-i=f^0`nkFA^_-p03+TTE&UgU^0A8{g$rF8!rh zEnYW;h4@+ghDAF^2x|#pUb4}6Gi9^GOXYf4BPbm<8JLl!7|156^e}j>i)K3>oSnL( zCRqn#Dpa!%uQ&@qBIg_|^PQ?iW|sED*2 zI|yq5JuH9M(s}GyK3)=O=+)Jvn>CzU!^e-?~XDeWa zx*x=UwNBMHcc6gV*HD$pCk#H71>aC6YbF_0uEzWaV(9mAs9DOqeGzK%lK7V-#|>nv z!au%X?@@yx$q#`|VB=IE>XxCx>{V zku8mksB%+hcSrT|EO_-rD}Vlkg7H*bn3yK?Y{}q_&SuG=ZbcNs!?4JBvx0HNH!jy7 zk|N&X%!RkbSzE@+Dl>)|ge1QR-I4=UNHC!-Je!2@Q+1bI87Z=3!n>N5AFl{GhCL_1 zj&U6O+IEH&_luok87_@)lDxyN4UAV=zo!ZnM_ls^xipWIXacD!yJ{`4tIBG9<6+n6 z!UfvPnhfkpAKCGH4yN{MFBrxNX~iqBZ(ar7N=pUa)6fE?v<%QdH0{apG14>vUs`$) z!`CO>mz{nYB45y$BF3!+ob_(I4pib=<*bZ}%m(kW9dq}w-<-8Df9Ob*5~_lu{@-7g?VPF z#nnT$A2fY?0SO0{A~-pQF?iT^ zeS+RzsLtfK$D{sranMXMcQ$Zm_&9~(n_Um*&1&wN7-o|tv#fDqtkr%?^EECuO4+_k zo{hR9-(la&jrfBFvie?(IUr!#qgfBFb>%9bFelZw>EWT&WdndX4p>$v**m^Up_fOH zt#W?9X*N_d2cjC1!r@;&vpc(Gqz{HTf{86pha`ZF4S?RM^0lczx^&YMY_va?mBAdp z%)aqbm{y)^hin(NqGjm0FC?J0-V94 z3BFizt6U+1b9qG#Bt8sTKR*~c7=lSGD$?u=&mjt4FvSm-C+X>Hv>NXjVX|djC+OM5 zdARV1QIA}|#$hUHO^5=gn}=bY%I6aA2T1kD1v0$N2OHI~PWuIRo?sf^Wi)-K;y-?& zObySra1-!1@*ZmMC~M@t0-$q8G>WA{qM+{&E=B~`+h+O=r^NYyewpr&(%{lhic0DX zm>h!1j81{)B<4Q!8M=Jk4YVon~tLrJ!a^O45iD7MyrtDD@$66$w#u#{6)BX4uk z|CTgv9CK~RmKmD=;THMmjsiULvVSrGjbZmfTEG@$8!MU_}U9vcV zrzb&cdqaT}ny6y|g;!*yR{;vn%3MYM#*hM>9QAC9QuN`44-Y3m(*cV>IPzS$m;f78 zp~=QNZLbbWIV9`jof>{Qx$U9jrgLtHI@6eUR@7_HI}O(U5efUWPmkGy$fRDgGKS&x zLi<$Ob9dvU!yAPMbbw(d7^hKsouW;#ZTiu%7{@mFXi^^*y?-_)r`yW5H1V=SucKZd zfQe_#q`Jf(zys(bvDswiH|mShhi{2W!@p|o${KEv!+#lA(FYx-C-31j669kTiwr^Hfzi0|pbk`c%Yms6#GZ$* z9a>lED^{!>58q*mujE#*Ad2%gMQ!%Nf7LoI>C&dMQNUi03uK0ft3%`YRmQ$Gm@g<+ zyJR7waJoN+j^7Q1$Dm5o@W(pmYaqX49m#OoZl$L|&3<#`WurQ zR-C41O@k1K?PvxpdVV^oA z4g9^nRlc8&ik2$c&T*a2F)L1ChVSdFE`1)9{UU2HQ9j>NuE}*VSw}g8cbCDGdb?4~ z^x9y3M;U<-tHT))^f7~(9B)dKqm?3lIc^L(PrCdJ>VhrgK;A6r4q9VWJW8ljEZ!SV`VV}L3PjMv*pN8Y<4Gk zHmgUeN_FMcL74x=ZUL)te2APoibj+wwGDzJ{cH-5=45?9$>dCE`1NRBJ-rVVgAjWF z_woSy_CPhcl->&25LS3$FOyQl@4<8X5pQmcp$fOx4yL_}*7R9nJRCB6(_yL&$%RJ6%bOlV>4Fw`6LA_G&Izgje;z4zX#d7$3@V7EE6Q{qZtX zr#e)DXFXDbns89x(SAull<|saU$U=e+Ei&s#b4=Pg0}sPJU*0wkF}u!BSatXSsP46iRHY2`B@=9o0mghwFPfV~PG|U&M|DQJa4> + + + class ZCL_EXCEL_PROPERTIES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +public section. + + data CREATOR type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data LASTMODIFIEDBY type ZEXCEL_CREATOR value 'Unknown Creator'. "#EC NOTEXT . + data CREATED type TIMESTAMPL . + data MODIFIED type TIMESTAMPL . + data TITLE type ZEXCEL_TITLE value 'Untitled Spreadsheet'. "#EC NOTEXT . + data SUBJECT type ZEXCEL_SUBJECT . + data DESCRIPTION type ZEXCEL_DESCRIPTION . + data KEYWORDS type ZEXCEL_KEYWORDS . + data CATEGORY type ZEXCEL_CATEGORY . + data COMPANY type ZEXCEL_COMPANY value 'Microsoft Corporation'. "#EC NOTEXT . + data APPLICATION type ZEXCEL_APPLICATION value 'Microsoft Excel'. "#EC NOTEXT . + data DOCSECURITY type ZEXCEL_DOCSECURITY value '0'. "#EC NOTEXT . + data SCALECROP type ZEXCEL_SCALECROP value ''. "#EC NOTEXT . + data LINKSUPTODATE type FLAG . + data SHAREDDOC type FLAG . + data HYPERLINKSCHANGED type FLAG . + data APPVERSION type ZEXCEL_APPVERSION value '12.0000'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_PROPERTIES +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_PROPERTIES +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + + DATA: lv_timestamp TYPE timestampl. + + GET TIME STAMP FIELD lv_timestamp. + created = lv_timestamp. + modified = lv_timestamp. + +endmethod. + + + + class ZCL_EXCEL_STYLE_COLOR definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +public section. + + class-data C_BLACK type ZEXCEL_STYLE_COLOR_ARGB value 'FF000000'. "#EC NOTEXT . + class-data C_BLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF0000FF'. "#EC NOTEXT . + class-data C_DARKBLUE type ZEXCEL_STYLE_COLOR_ARGB value 'FF000080'. "#EC NOTEXT . + class-data C_DARKGREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF008000'. "#EC NOTEXT . + class-data C_DARKRED type ZEXCEL_STYLE_COLOR_ARGB value 'FF800000'. "#EC NOTEXT . + class-data C_DARKYELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FF808000'. "#EC NOTEXT . + class-data C_GRAY type ZEXCEL_STYLE_COLOR_ARGB value 'FFCCCCCC'. "#EC NOTEXT . + class-data C_GREEN type ZEXCEL_STYLE_COLOR_ARGB value 'FF00FF00'. "#EC NOTEXT . + class-data C_RED type ZEXCEL_STYLE_COLOR_ARGB value 'FFFF0000'. "#EC NOTEXT . + class-data C_WHITE type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFFFF'. "#EC NOTEXT . + class-data C_YELLOW type ZEXCEL_STYLE_COLOR_ARGB value 'FFFFFF00'. "#EC NOTEXT . + + methods CONSTRUCTOR . + class-methods CREATE_NEW_ARGB + importing + !IP_RED type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_GREEN type ZEXCEL_STYLE_COLOR_COMPONENT + !IP_BLU type ZEXCEL_STYLE_COLOR_COMPONENT + returning + value(EP_COLOR_ARGB) type ZEXCEL_STYLE_COLOR_ARGB . + *"* protected components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_COLOR +*"* do not include other source files here!!! +private section. + + class-data C_ALPHA type CHAR2 value 'FF'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +endmethod. + + + + + + + method CREATE_NEW_ARGB. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. + +endmethod. + + + + class ZCL_EXCEL_DRAWINGS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWINGS +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->add( ip_drawing ). +endmethod. + + + method CLEAR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->clear( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT drawings. + +endmethod. + + + + + method GET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_drawing ?= drawings->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= drawings->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = drawings->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + drawings->remove( ip_drawing ). +endmethod. + + + + method SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = drawings->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_DRAWING definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + data X_REFERENCES type CHAR1 . + data Y_REFERENCES type CHAR1 . + data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_GUID + returning + value(EP_GUID) type GUID_16 . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DRAWING +*"* do not include other source files here!!! +private section. + + data GUID type GUID_16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + + methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + method CONSTRUCTOR. + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +endmethod. + + + + + method CONVERT_COLUMN2ALPHA. + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +endmethod. + + + + + method CONVERT_COLUMN2INT. + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( me->c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( me->c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - me->c_excel_col_module. + ENDIF. + +endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + +endmethod. + + + + class ZCL_EXCEL_STYLES_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_STYLE_CONDITIONAL) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data STYLES_CONDITIONAL type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + styles_conditional->add( ip_style_conditional ). +endmethod. + + + method CLEAR. + styles_conditional->clear( ). +endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT styles_conditional. + +endmethod. + + + + + method GET. + DATA lv_index TYPE i. + lv_index = ip_index. + eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = styles_conditional->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + styles_conditional->remove( ip_style_conditional ). +endmethod. + + + + method SIZE. + ep_size = styles_conditional->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_COMMON definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +public section. + + class-methods CONVERT_COLUMN2ALPHA + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN_ALPHA . + class-methods CONVERT_COLUMN2INT + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + returning + value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . + *"* protected components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_COMMON +*"* do not include other source files here!!! +private section. + + class-data C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method CONVERT_COLUMN2ALPHA. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, + lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + + lv_column = ip_column. + WHILE lv_column GT 0. + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + ENDWHILE. + +endmethod. + + + + + method CONVERT_COLUMN2INT. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_uccpi TYPE i, + lv_char TYPE c, + lv_column(2) TYPE c. + +* Calculate most significant letter + lv_char = ip_column+1(1). + IF lv_char IS NOT INITIAL. "To avoid the first 26 column that have only a char in first position + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + + ep_column = ep_column MOD ( zcl_excel_common=>c_excel_col_module ). + + lv_char = ip_column(1). + lv_uccpi = cl_abap_conv_out_ce=>uccpi( lv_char ). + + lv_uccpi = ( lv_uccpi MOD ( zcl_excel_common=>c_excel_col_module ) ) * 26. + + ep_column = ep_column + lv_uccpi. + ELSE. + lv_char = ip_column(1). + ep_column = cl_abap_conv_out_ce=>uccpi( lv_char ). + ep_column = ep_column - zcl_excel_common=>c_excel_col_module. + ENDIF. + +endmethod. + + + + class ZCL_EXCEL_SECURITY definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SECURITY +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data LOCKREVISION type FLAG . + data LOCKSTRUCTURE type FLAG . + data LOCKWINDOWS type FLAG . + data REVISIONSPASSWORD type ZEXCEL_REVISIONSPASSWORD . + data WORKBOOKPASSWORD type ZEXCEL_WORKBOOKPASSWORD . + + methods CONSTRUCTOR . + methods IS_SECURITY_ENABLED + returning + value(EP_SECURITY_ENABLED) type FLAG . + *"* protected components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_SECURITY +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + method CONSTRUCTOR. +endmethod. + + + + method IS_SECURITY_ENABLED. + IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. + ep_security_enabled = abap_true. + ENDIF. +endmethod. + + + + class ZCL_EXCEL_WORKSHEETS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +public section. + + data ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET value 1. "#EC NOTEXT . + data NAME type ZEXCEL_WORKSHEETS_NAME value 'Worksheets'. "#EC NOTEXT . + + methods ADD + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +private section. + + data WORKSHEETS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->add( ip_worksheet ). +endmethod. + + + method CLEAR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->clear( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT worksheets. + +endmethod. + + + + + method GET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). +endmethod. + + + + method GET_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= worksheets->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = worksheets->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + worksheets->remove( ip_worksheet ). +endmethod. + + + + method SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = worksheets->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_RANGES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_RANGE type ref to ZCL_EXCEL_RANGE . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZABAP_EXCEL_RANGES +*"* do not include other source files here!!! +private section. + + data RANGES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + ranges->add( ip_range ). +endmethod. + + + method CLEAR. + ranges->clear( ). +endmethod. + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT ranges. + +ENDMETHOD. + + + + + method GET. + eo_range ?= ranges->if_object_collection~get( ip_index ). +endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= ranges->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. + is_empty = ranges->if_object_collection~is_empty( ). +endmethod. + + + + method REMOVE. + ranges->remove( ip_range ). +endmethod. + + + + method SIZE. + ep_size = ranges->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_STYLES definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +public section. + + methods ADD + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods CLEAR . + methods CONSTRUCTOR . + methods GET + importing + !IP_INDEX type I + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_STYLE type ref to ZCL_EXCEL_STYLE . + methods SIZE + returning + value(EP_SIZE) type I . + methods REGISTER_NEW_STYLE + importing + !IO_STYLE type ref to ZCL_EXCEL_STYLE + returning + value(EP_STYLE_CODE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLES +*"* do not include other source files here!!! +private section. + + data STYLES type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->add( ip_style ). +endmethod. + + + method CLEAR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->clear( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT styles. +endmethod. + + + + + method GET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_style ?= styles->if_object_collection~get( ip_index ). +endmethod. + + + + method GET_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator ?= styles->if_object_collection~get_iterator( ). +endmethod. + + + + method IS_EMPTY. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + is_empty = styles->if_object_collection~is_empty( ). +endmethod. + + + + + method REGISTER_NEW_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->add( io_style ). + ep_style_code = me->size( ) - 1. "style count starts from 0 +endmethod. + + + + method REMOVE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + styles->remove( ip_style ). +endmethod. + + + + method SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = styles->if_object_collection~size( ). +endmethod. + + + + class ZCL_EXCEL_RANGE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +public section. + + data NAME type ZEXCEL_RANGE_NAME . + data GUID type ZEXCEL_RANGE_GUID . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_RANGE_GUID . + methods SET_VALUE + importing + !IP_SHEET_NAME type ZEXCEL_SHEET_TITLE + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + methods GET_VALUE + returning + value(EP_VALUE) type ZEXCEL_RANGE_VALUE . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_RANGE +*"* do not include other source files here!!! +private section. + + data VALUE type ZEXCEL_RANGE_VALUE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method CONSTRUCTOR. +endmethod. + + + + METHOD get_guid. + + ep_guid = me->guid. + +ENDMETHOD. + + + + METHOD get_value. + + ep_value = me->value. + +ENDMETHOD. + + + + + + + + METHOD set_value. + DATA: lv_start_row_c TYPE char7, + lv_stop_row_c TYPE char7. + lv_stop_row_c = ip_stop_row. + SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. + SHIFT lv_stop_row_c LEFT DELETING LEADING space. + lv_start_row_c = ip_start_row. + SHIFT lv_start_row_c RIGHT DELETING TRAILING space. + SHIFT lv_start_row_c LEFT DELETING LEADING space. + CONCATENATE ip_sheet_name '!$' ip_start_column '$' lv_start_row_c ':$' ip_stop_column '$' lv_stop_row_c INTO me->value. +ENDMETHOD. + + + + class ZCL_EXCEL_STYLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +public section. + + data FONT type ref to ZCL_EXCEL_STYLE_FONT . + data FILL type ref to ZCL_EXCEL_STYLE_FILL . + data BORDERS type ref to ZCL_EXCEL_STYLE_BORDERS . + data NUMBER_FORMAT type ref to ZCL_EXCEL_STYLE_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_GUID + returning + value(EP_GUID) type ZEXCEL_CELL_STYLE . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE +*"* do not include other source files here!!! +private section. + + data ALIGNMENT type ref to ZCL_EXCEL_STYLE_ALIGNMENT . + data PROTECTION type ref to ZCL_EXCEL_STYLE_PROTECTION . + data GUID type ZEXCEL_CELL_STYLE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT font. + CREATE OBJECT fill. + CREATE OBJECT borders. + CREATE OBJECT alignment. + CREATE OBJECT number_format. + CREATE OBJECT protection. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + +endmethod. + + + + method GET_GUID. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. +endmethod. + + + + class ZCL_EXCEL_STYLE_BORDER definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +public section. + + data BORDER_STYLE type ZEXCEL_BORDER . + data BORDER_COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_BORDER_NONE type ZEXCEL_BORDER value 'none'. "#EC NOTEXT . + class-data C_BORDER_DASHDOT type ZEXCEL_BORDER value 'dashDot'. "#EC NOTEXT . + class-data C_BORDER_DASHDOTDOT type ZEXCEL_BORDER value 'dashDotDot'. "#EC NOTEXT . + class-data C_BORDER_DASHED type ZEXCEL_BORDER value 'dashed'. "#EC NOTEXT . + class-data C_BORDER_DOTTED type ZEXCEL_BORDER value 'dotted'. "#EC NOTEXT . + class-data C_BORDER_DOUBLE type ZEXCEL_BORDER value 'double'. "#EC NOTEXT . + class-data C_BORDER_HAIR type ZEXCEL_BORDER value 'hair'. "#EC NOTEXT . + class-data C_BORDER_MEDIUM type ZEXCEL_BORDER value 'medium'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOT type ZEXCEL_BORDER value 'mediumDashDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHDOTDOT type ZEXCEL_BORDER value 'mediumDashDotDot'. "#EC NOTEXT . + class-data C_BORDER_MEDIUMDASHED type ZEXCEL_BORDER value 'mediumDashed'. "#EC NOTEXT . + class-data C_BORDER_SLANTDASHDOT type ZEXCEL_BORDER value 'slantDashDot'. "#EC NOTEXT . + class-data C_BORDER_THICK type ZEXCEL_BORDER value 'thick'. "#EC NOTEXT . + class-data C_BORDER_THIN type ZEXCEL_BORDER value 'thin'. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDER +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + border_style = zcl_excel_style_border=>c_border_none. +endmethod. + + + + class ZCL_EXCEL_SHEET_SETUP definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants C_PAPERSIZE_LETTER type ZEXCEL_SHEET_PAPER_SIZE value 1. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 2. "#EC NOTEXT + constants C_PAPERSIZE_TABLOID type ZEXCEL_SHEET_PAPER_SIZE value 3. "#EC NOTEXT + constants C_PAPERSIZE_LEDGER type ZEXCEL_SHEET_PAPER_SIZE value 4. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL type ZEXCEL_SHEET_PAPER_SIZE value 5. "#EC NOTEXT + constants C_PAPERSIZE_STATEMENT type ZEXCEL_SHEET_PAPER_SIZE value 6. "#EC NOTEXT + constants C_PAPERSIZE_EXECUTIVE type ZEXCEL_SHEET_PAPER_SIZE value 7. "#EC NOTEXT + constants C_PAPERSIZE_A3 type ZEXCEL_SHEET_PAPER_SIZE value 8. "#EC NOTEXT + constants C_PAPERSIZE_A4 type ZEXCEL_SHEET_PAPER_SIZE value 9. "#EC NOTEXT + constants C_PAPERSIZE_A4_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 10. "#EC NOTEXT + constants C_PAPERSIZE_A5 type ZEXCEL_SHEET_PAPER_SIZE value 11. "#EC NOTEXT + constants C_PAPERSIZE_B4 type ZEXCEL_SHEET_PAPER_SIZE value 12. "#EC NOTEXT + constants C_PAPERSIZE_B5 type ZEXCEL_SHEET_PAPER_SIZE value 13. "#EC NOTEXT + constants C_PAPERSIZE_FOLIO type ZEXCEL_SHEET_PAPER_SIZE value 14. "#EC NOTEXT + constants C_PAPERSIZE_QUARTO type ZEXCEL_SHEET_PAPER_SIZE value 15. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_1 type ZEXCEL_SHEET_PAPER_SIZE value 16. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_2 type ZEXCEL_SHEET_PAPER_SIZE value 17. "#EC NOTEXT + constants C_PAPERSIZE_NOTE type ZEXCEL_SHEET_PAPER_SIZE value 18. "#EC NOTEXT + constants C_PAPERSIZE_NO9_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 19. "#EC NOTEXT + constants C_PAPERSIZE_NO10_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 20. "#EC NOTEXT + constants C_PAPERSIZE_NO11_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 21. "#EC NOTEXT + constants C_PAPERSIZE_NO12_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 22. "#EC NOTEXT + constants C_PAPERSIZE_NO14_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 23. "#EC NOTEXT + constants C_PAPERSIZE_C type ZEXCEL_SHEET_PAPER_SIZE value 24. "#EC NOTEXT + constants C_PAPERSIZE_D type ZEXCEL_SHEET_PAPER_SIZE value 25. "#EC NOTEXT + constants C_PAPERSIZE_E type ZEXCEL_SHEET_PAPER_SIZE value 26. "#EC NOTEXT + constants C_PAPERSIZE_DL_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 27. "#EC NOTEXT + constants C_PAPERSIZE_C5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 28. "#EC NOTEXT + constants C_PAPERSIZE_C3_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 29. "#EC NOTEXT + constants C_PAPERSIZE_C4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 30. "#EC NOTEXT + constants C_PAPERSIZE_C6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 31. "#EC NOTEXT + constants C_PAPERSIZE_C65_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 32. "#EC NOTEXT + constants C_PAPERSIZE_B4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 33. "#EC NOTEXT + constants C_PAPERSIZE_B5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 34. "#EC NOTEXT + constants C_PAPERSIZE_B6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 35. "#EC NOTEXT + constants C_PAPERSIZE_ITALY_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 36. "#EC NOTEXT + constants C_PAPERSIZE_MONARCH_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 37. "#EC NOTEXT + constants C_PAPERSIZE_6_3_4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 38. "#EC NOTEXT + constants C_PAPERSIZE_US_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 39. "#EC NOTEXT + constants C_PAPERSIZE_DE_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 40. "#EC NOTEXT + constants C_PAPERSIZE_DE_LEG_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 41. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B4 type ZEXCEL_SHEET_PAPER_SIZE value 42. "#EC NOTEXT + constants C_PAPERSIZE_JPN_DBL_POSTCARD type ZEXCEL_SHEET_PAPER_SIZE value 43. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_1 type ZEXCEL_SHEET_PAPER_SIZE value 44. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_2 type ZEXCEL_SHEET_PAPER_SIZE value 45. "#EC NOTEXT + constants C_PAPERSIZE_STANDARD_PAPER_3 type ZEXCEL_SHEET_PAPER_SIZE value 46. "#EC NOTEXT + constants C_PAPERSIZE_INVITE_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 47. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 48. "#EC NOTEXT + constants C_PAPERSIZE_LEGAL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 49. "#EC NOTEXT + constants C_PAPERSIZE_TABL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 50. "#EC NOTEXT + constants C_PAPERSIZE_A4_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 51. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 52. "#EC NOTEXT + constants C_PAPERSIZE_A4_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 53. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_EXTV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 54. "#EC NOTEXT + constants C_PAPERSIZE_SUPERA_A4_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 55. "#EC NOTEXT + constants C_PAPERSIZE_SUPERB_A3_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 56. "#EC NOTEXT + constants C_PAPERSIZE_LETTER_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 57. "#EC NOTEXT + constants C_PAPERSIZE_A4_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 58. "#EC NOTEXT + constants C_PAPERSIZE_A5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 59. "#EC NOTEXT + constants C_PAPERSIZE_JIS_B5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 60. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 61. "#EC NOTEXT + constants C_PAPERSIZE_A5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 62. "#EC NOTEXT + constants C_PAPERSIZE_ISO_B5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 63. "#EC NOTEXT + constants C_PAPERSIZE_A2_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 64. "#EC NOTEXT + constants C_PAPERSIZE_A3_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 65. "#EC NOTEXT + constants C_PAPERSIZE_A3_EXTRA_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 66. "#EC NOTEXT + constants C_ORIENTATION_DEFAULT type ZEXCEL_SHEET_ORIENATATION value 'default'. "#EC NOTEXT + constants C_ORIENTATION_LANDSCAPE type ZEXCEL_SHEET_ORIENATATION value 'landscape'. "#EC NOTEXT + constants C_ORIENTATION_PORTRAIT type ZEXCEL_SHEET_ORIENATATION value 'portrait'. "#EC NOTEXT + data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_SHEET_SETUP +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + orientation = me->c_orientation_default. +endmethod. + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + methods CONSTRUCTOR + importing + !IO_EXCEL type ref to ZCL_EXCEL . + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_CALCCHAIN type STRING value 'xl/calcChain.xml'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_CALCCHAIN + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->excel = io_excel. +endmethod. + + + + method CREATE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sharedStrings.xml to zip + lv_content = me->create_xl_calcchain( ). + lo_zip->add( name = me->c_xl_calcchain + content = lv_content ). + +********************************************************************** +* STEP 11: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +endmethod. + + + + method CREATE_CONTENT_TYPES. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lv_xml_node_worksheet_pn ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_APP. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_CORE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_RELATIONSHIPS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_CALCCHAIN. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_calcchain TYPE string VALUE 'calcChain', + lc_xml_node_c TYPE string VALUE 'c', + " Node attributes + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_i TYPE string VALUE 'i', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string, + lv_value_i TYPE string, + lv_sheets_count TYPE i. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create xl/calcChain.xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node calcChain + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_calcchain + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_sheets_count. + MOVE lv_sheets_count TO lv_value_i. + SHIFT lv_value_i RIGHT DELETING TRAILING space. + SHIFT lv_value_i LEFT DELETING LEADING space. + LOOP AT lo_worksheet->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_formula IS NOT INITIAL. + " formula chain node + lo_element = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_i + value = lv_value_i ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_RELATIONSHIPS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + lc_xml_node_rid_calcchain_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml', + lc_xml_node_rid_calcchain_tg TYPE string VALUE 'calcChain.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 1 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_calcchain_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_calcchain_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_SHAREDSTRINGS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + + METHOD create_xl_sheet. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', + lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', + lc_xml_node_formula1 TYPE string VALUE 'formula1', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', + lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', + lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_data_validation TYPE REF TO zcl_excel_data_validation. + + DATA: lv_value TYPE string, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + lv_value = io_worksheet->defaultrowheight. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + lo_element_root->append_child( lo_element ). " sheetFormatPr node + + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = '1:1' ). " <******************************* + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + IF ls_style_mapping-cell_format IS INITIAL. " to avoid errors if no style has been created + IF <ls_sheet_content>-cell_formula IS INITIAL. + ls_style_mapping-cell_format = 'S'. + ELSE. + ls_style_mapping-cell_format = 'F'. + ENDIF. + ENDIF. + " is a shared string and is not a formula + IF ls_style_mapping-cell_format EQ 'S'. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = 's' ). + ENDIF. + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ENDIF. + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF ls_style_mapping-cell_format EQ 'S'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + + + IF io_worksheet->get_data_validations_size( ) GT 0. + " dataValidations node + lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations + parent = lo_document ). + " Conditional formatting node + lo_iterator = io_worksheet->get_data_validations_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_data_validation ?= lo_iterator->get_next( ). + " dataValidation node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation + parent = lo_document ). + lv_value = lo_data_validation->type. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + IF lo_data_validation->allowblank EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank + value = lv_value ). + IF lo_data_validation->showinputmessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage + value = lv_value ). + IF lo_data_validation->showerrormessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage + value = lv_value ). + lv_cell_row_s = lo_data_validation->cell_row. + SHIFT lv_cell_row_s RIGHT DELETING TRAILING space. + SHIFT lv_cell_row_s LEFT DELETING LEADING space. + CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + " formula1 node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 + parent = lo_document ). + lv_value = lo_data_validation->value. + lo_element_3->set_value( lv_value ). + + lo_element_2->append_child( lo_element_3 ). " formula1 node + + lo_element->append_child( lo_element_2 ). " dataValidation node + ENDWHILE. + lo_element_root->append_child( lo_element ). " dataValidations node + ENDIF. + + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + method CREATE_XL_SHEET_RELS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + lc_xml_node_rid_print_id TYPE string VALUE 'rId1', + " Node type + lc_xml_node_rid_print_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', + " Node target + lc_xml_node_rid_print_tg TYPE string VALUE '../printerSettings/printerSettings1.bin'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rid_print_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_print_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_print_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_STYLES. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + ls_format TYPE zexcel_number_format, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_format = lo_style->number_format->get_structure( ). + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + + IF ls_format IS INITIAL. + ls_cellxfs-numfmtid = 0. " number format + ELSE. + ls_cellxfs-numfmtid = ls_format. " number format + ENDIF. + ls_cellxfs-xfid = 0. + + IF ls_format IS NOT INITIAL. + ls_cellxfs-applynumberformat = 1. + ls_styles_mapping-cell_format = 'I'. + ELSE. + ls_cellxfs-applynumberformat = 0. + ls_styles_mapping-cell_format = 'S'. + ENDIF. + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + " Collect color + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = 'TableStyleMedium9' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = 'PivotStyleLight16' ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_THEME. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +endmethod. + + + + METHOD create_xl_workbook. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + + " ranges node + lo_element = lo_document->create_simple_element( name = lc_xml_node_definedNames + parent = lo_document ). + lo_iterator = excel->get_ranges_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedName + parent = lo_document ). + lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( lv_value ). + lo_element->append_child( lo_sub_element ). " range node + ENDWHILE. + lo_element_root->append_child( lo_element )." ranges node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + method FLAG2BOOL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +endmethod. + + + + + method GET_SHARED_STRING_INDEX. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +endmethod. + + + + class ZCL_EXCEL_DATA_VALIDATIONS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + methods ADD + importing + !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . + methods CLEAR . + methods CONSTRUCTOR . + methods GET_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods IS_EMPTY + returning + value(IS_EMPTY) type FLAG . + methods REMOVE + importing + !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . + methods SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEETS +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DATA_VALIDATIONS +*"* do not include other source files here!!! +private section. + + data DATA_VALIDATIONS type ref to CL_OBJECT_COLLECTION . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + METHOD add. + data_validations->add( ip_data_validation ). +ENDMETHOD. + + + METHOD clear. + data_validations->clear( ). +ENDMETHOD. + + + METHOD constructor. + + CREATE OBJECT data_validations. + +ENDMETHOD. + + + + METHOD get_iterator. + eo_iterator ?= data_validations->if_object_collection~get_iterator( ). +ENDMETHOD. + + + + METHOD is_empty. + is_empty = data_validations->if_object_collection~is_empty( ). +ENDMETHOD. + + + + METHOD remove. + data_validations->remove( ip_data_validation ). +ENDMETHOD. + + + + METHOD size. + ep_size = data_validations->if_object_collection~size( ). +ENDMETHOD. + + + + class ZCL_EXCEL_DATA_VALIDATION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data ALLOWBLANK type FLAG value 'X'. "#EC NOTEXT . + data CELL_ROW type ZEXCEL_CELL_ROW . + class-data C_TYPE_LIST type ZEXCEL_DATA_VAL_TYPE value 'list'. "#EC NOTEXT . + data SHOWERRORMESSAGE type FLAG value 'X'. "#EC NOTEXT . + data SHOWINPUTMESSAGE type FLAG value 'X'. "#EC NOTEXT . + data TYPE type ZEXCEL_DATA_VAL_TYPE . + data VALUE type ZEXCEL_VALIDATION_FORMULA1 . + data CELL_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_DATA_VALIDATION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + METHOD constructor. + type = me->c_type_list. +* inizialize dimension range + cell_row = 1. + cell_column = 'A'. +ENDMETHOD. + + + + class ZCL_EXCEL_WORKSHEET definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + class-data C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT . + class-data C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT . + class-data C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT . + class-data C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT . + class-data C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT . + data DEFAULTROWHEIGHT type INT1 value 15. "#EC NOTEXT . + data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . + data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . + data SHEET_STATE type ZEXCEL_SHEET_STATE . + data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + + methods ADD_NEW_CONDITIONAL_STYLE + returning + value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . + methods ADD_NEW_DATA_VALIDATION + returning + value(EO_DATA_VALIDATION) type ref to ZCL_EXCEL_DATA_VALIDATION . + methods CONSTRUCTOR + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods GET_ACTIVE_CELL + returning + value(EP_ACTIVE_CELL) type STRING . + methods GET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + exporting + !EP_VALUE type ZEXCEL_CELL_VALUE + !EP_RC type SYSUBRC . + methods GET_COND_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DATA_VALIDATIONS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods GET_GUID + returning + value(EP_GUID) type OLTPGUID16 . + methods SET_CELL + importing + !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_ROW type ZEXCEL_CELL_ROW + !IP_VALUE type ZEXCEL_CELL_VALUE + !IP_FORMULA type ZEXCEL_CELL_FORMULA optional + !IP_STYLE type ZEXCEL_CELL_STYLE optional . + methods SET_TABLE + importing + !IP_TABLE type STANDARD TABLE + !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional + !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional + !IP_TABLE_TITLE type STRING optional + !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' + !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . + methods GET_DATA_VALIDATIONS_SIZE + returning + value(EP_SIZE) type I . + *"* protected components of class ZABAP_EXCEL_WORKSHEET +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WORKSHEET +*"* do not include other source files here!!! +private section. + + data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . + data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . + data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS . + data GUID type OLTPGUID16 . + data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data UPPER_CELL type ZEXCEL_S_CELL_DATA . + + methods UPDATE_DIMENSION_RANGE . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + method ADD_NEW_CONDITIONAL_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). +endmethod. + + + + method ADD_NEW_DATA_VALIDATION. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CREATE OBJECT eo_data_validation. + data_validations->add( eo_data_validation ). +endmethod. + + + + METHOD constructor. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + sheet_state = me->c_sheet_state_visible. + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + CREATE OBJECT data_validations. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. +ENDMETHOD. + + + + method GET_ACTIVE_CELL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + +endmethod. + + + + + + + method GET_CELL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. +endmethod. + + + + method GET_COND_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->conditional_styles->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->data_validations->get_iterator( ). +endmethod. + + + + method GET_DATA_VALIDATIONS_SIZE. + ep_size = me->data_validations->size( ). +endmethod. + + + + method GET_DIMENSION_RANGE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + ep_dimension_range = upper_cell-cell_coords. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + +endmethod. + + + + method GET_GUID. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_guid = me->guid. + +endmethod. + + + + + + + + method SET_CELL. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = ZCL_EXCEL_COMMON=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_value = ip_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = ip_style. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = ip_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = ip_style. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. + APPEND ls_sheet_content TO sheet_content. + SORT sheet_content BY cell_row cell_column. +* me->update_dimension_range( ). + + ENDIF. + +endmethod. + + + + + + + + + method SET_TABLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE '2', + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_body_style ). + ADD 1 TO lv_row_int. + ENDLOOP. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDLOOP. + +endmethod. + + + method UPDATE_DIMENSION_RANGE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +endmethod. + + + + class ZCL_EXCEL_STYLE_ALIGNMENT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data HORIZONTAL type ZEXCEL_ALIGNMENT . + data VERTICAL type ZEXCEL_ALIGNMENT . + data TEXTROTATION type ZEXCEL_TEXT_ROTATION value 0. "#EC NOTEXT . + data WRAPTEXT type FLAG . + data SHRINKTOFIT type FLAG . + data INDENT type ZEXCEL_INDENT value 0. "#EC NOTEXT . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_ALIGNMENT +*"* do not include other source files here!!! +private section. + + constants C_HORIZONTAL_GENERAL type ZEXCEL_ALIGNMENT value 'general'. "#EC NOTEXT + constants C_HORIZONTAL_LEFT type ZEXCEL_ALIGNMENT value 'left'. "#EC NOTEXT + constants C_HORIZONTAL_RIGHT type ZEXCEL_ALIGNMENT value 'right'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_HORIZONTAL_CENTER_CONTINUOUS type ZEXCEL_ALIGNMENT value 'centerContinuous'. "#EC NOTEXT + constants C_HORIZONTAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + constants C_VERTICAL_BOTTOM type ZEXCEL_ALIGNMENT value 'bottom'. "#EC NOTEXT + constants C_VERTICAL_TOP type ZEXCEL_ALIGNMENT value 'top'. "#EC NOTEXT + constants C_VERTICAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT + constants C_VERTICAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + horizontal = me->c_horizontal_general. + vertical = me->c_vertical_bottom. + wrapText = abap_false. + shrinkToFit = abap_false. +endmethod. + + + + class ZCL_EXCEL_STYLE_BORDERS definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +public section. + + data LEFT type ref to ZCL_EXCEL_STYLE_BORDER . + data RIGHT type ref to ZCL_EXCEL_STYLE_BORDER . + data TOP type ref to ZCL_EXCEL_STYLE_BORDER . + data DOWN type ref to ZCL_EXCEL_STYLE_BORDER . + data DIAGONAL type ref to ZCL_EXCEL_STYLE_BORDER . + data ALLBORDERS type ref to ZCL_EXCEL_STYLE_BORDER . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_BORDER . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_BORDERS +*"* do not include other source files here!!! +private section. + + constants C_DIAGONAL_NONE type ZEXCEL_DIAGONAL value 0. "#EC NOTEXT + constants C_DIAGONAL_UP type ZEXCEL_DIAGONAL value 1. "#EC NOTEXT + constants C_DIAGONAL_DOWN type ZEXCEL_DIAGONAL value 2. "#EC NOTEXT + constants C_DIAGONAL_BOTH type ZEXCEL_DIAGONAL value 3. "#EC NOTEXT + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method CONSTRUCTOR. +endmethod. + + + + method GET_STRUCTURE. + +* Check if all borders is set otherwise check single border + IF me->allborders IS BOUND. + es_fill-left_color = me->allborders->border_color. + es_fill-left_style = me->allborders->border_style. + es_fill-right_color = me->allborders->border_color. + es_fill-right_style = me->allborders->border_style. + es_fill-top_color = me->allborders->border_color. + es_fill-top_style = me->allborders->border_style. + es_fill-bottom_color = me->allborders->border_color. + es_fill-bottom_style = me->allborders->border_style. + ELSE. + IF me->left IS BOUND. + es_fill-left_color = me->left->border_color. + es_fill-left_style = me->left->border_style. + ENDIF. + IF me->right IS BOUND. + es_fill-right_color = me->right->border_color. + es_fill-right_style = me->right->border_style. + ENDIF. + IF me->top IS BOUND. + es_fill-top_color = me->top->border_color. + es_fill-top_style = me->top->border_style. + ENDIF. + IF me->down IS BOUND. + es_fill-bottom_color = me->down->border_color. + es_fill-bottom_style = me->down->border_style. + ENDIF. + ENDIF. + +* Check if diagonal is set + IF me->diagonal IS BOUND. + es_fill-diagonal_color = me->diagonal->border_color. + es_fill-diagonal_style = me->diagonal->border_style. + ENDIF. + +endmethod. + + + + class ZCL_EXCEL_STYLE_CONDITIONAL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +public section. + + class-data C_ICONSET_3ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '3Arrows'. "#EC NOTEXT . + class-data C_ICONSET_3ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '3ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_3FLAGS type ZEXCEL_CONDITION_RULE_ICONSET value '3Flags'. "#EC NOTEXT . + class-data C_ICONSET_3SIGNS type ZEXCEL_CONDITION_RULE_ICONSET value '3Signs'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols'. "#EC NOTEXT . + class-data C_ICONSET_3SYMBOLS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3Symbols2'. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value ''. "#EC NOTEXT . + class-data C_ICONSET_3TRAFFICLIGHTS2 type ZEXCEL_CONDITION_RULE_ICONSET value '3TrafficLights2'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '4Arrows'. "#EC NOTEXT . + class-data C_ICONSET_4ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '4ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_4RATING type ZEXCEL_CONDITION_RULE_ICONSET value '4Rating'. "#EC NOTEXT . + class-data C_ICONSET_4REDTOBLACK type ZEXCEL_CONDITION_RULE_ICONSET value '4RedToBlack'. "#EC NOTEXT . + class-data C_ICONSET_4TRAFFICLIGHTS type ZEXCEL_CONDITION_RULE_ICONSET value '4TrafficLights'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWS type ZEXCEL_CONDITION_RULE_ICONSET value '5Arrows'. "#EC NOTEXT . + class-data C_ICONSET_5ARROWSGRAY type ZEXCEL_CONDITION_RULE_ICONSET value '5ArrowsGray'. "#EC NOTEXT . + class-data C_ICONSET_5QUARTERS type ZEXCEL_CONDITION_RULE_ICONSET value '5Quarters'. "#EC NOTEXT . + class-data C_ICONSET_5RATING type ZEXCEL_CONDITION_RULE_ICONSET value '5Rating'. "#EC NOTEXT . + class-data C_OPERATOR_BEGINSWITH type ZEXCEL_CONDITION_OPERATOR value 'beginsWith'. "#EC NOTEXT . + class-data C_OPERATOR_BETWEEN type ZEXCEL_CONDITION_OPERATOR value 'between'. "#EC NOTEXT . + class-data C_OPERATOR_CONTAINSTEXT type ZEXCEL_CONDITION_OPERATOR value 'containsText'. "#EC NOTEXT . + class-data C_OPERATOR_ENDSWITH type ZEXCEL_CONDITION_OPERATOR value 'endsWith'. "#EC NOTEXT . + class-data C_OPERATOR_EQUAL type ZEXCEL_CONDITION_OPERATOR value 'equal'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHAN type ZEXCEL_CONDITION_OPERATOR value 'greaterThan'. "#EC NOTEXT . + class-data C_OPERATOR_GREATERTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'greaterThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHAN type ZEXCEL_CONDITION_OPERATOR value 'lessThan'. "#EC NOTEXT . + class-data C_OPERATOR_LESSTHANOREQUAL type ZEXCEL_CONDITION_OPERATOR value 'lessThanOrEqual'. "#EC NOTEXT . + class-data C_OPERATOR_NONE type ZEXCEL_CONDITION_OPERATOR value ''. "#EC NOTEXT . + class-data C_OPERATOR_NOTCONTAINS type ZEXCEL_CONDITION_OPERATOR value 'notContains'. "#EC NOTEXT . + class-data C_OPERATOR_NOTEQUAL type ZEXCEL_CONDITION_OPERATOR value 'notEqual'. "#EC NOTEXT . + class-data C_RULE_CELLIS type ZEXCEL_CONDITION_RULE value 'cellIs'. "#EC NOTEXT . + class-data C_RULE_CONTAINSTEXT type ZEXCEL_CONDITION_RULE value 'containsText'. "#EC NOTEXT . + class-data C_RULE_EXPRESSION type ZEXCEL_CONDITION_RULE value 'expression'. "#EC NOTEXT . + class-data C_RULE_ICONSET type ZEXCEL_CONDITION_RULE value 'iconSet'. "#EC NOTEXT . + class-data C_RULE_NONE type ZEXCEL_CONDITION_RULE value 'none'. "#EC NOTEXT . + data FORMULA type ZEXCEL_STYLE_FORMULA . + data ICONSET type ZEXCEL_CONDITION_RULE_ICONSET . + data OPERATOR type ZEXCEL_CONDITION_OPERATOR . + data PRIORITY type ZEXCEL_STYLE_PRIORITY value 1. "#EC NOTEXT . + data RULE type ZEXCEL_CONDITION_RULE . + + methods CONSTRUCTOR . + methods GET_DIMENSION_RANGE + returning + value(EP_DIMENSION_RANGE) type STRING . + methods SET_RANGE + importing + !IP_START_ROW type ZEXCEL_CELL_ROW + !IP_START_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !IP_STOP_ROW type ZEXCEL_CELL_ROW + !IP_STOP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_CONDITIONAL +*"* do not include other source files here!!! +private section. + + data START_CELL type ZEXCEL_S_CELL_DATA . + data STOP_CELL type ZEXCEL_S_CELL_DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + rule = me->c_rule_none. + operator = me->c_operator_none. +* inizialize dimension range + stop_cell-cell_row = 1. + stop_cell-cell_column = 1. + start_cell-cell_row = 1. + start_cell-cell_column = 1. +endmethod. + + + + method GET_DIMENSION_RANGE. + IF stop_cell EQ start_cell. "only one cell + ep_dimension_range = start_cell-cell_coords. + ELSE. + CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. + ENDIF. +endmethod. + + + + + + + method SET_RANGE. + DATA: lv_column TYPE zexcel_cell_column, + lv_row_alpha TYPE string. + + lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). + stop_cell-cell_row = 1. + stop_cell-cell_column = lv_column. + lv_row_alpha = ip_stop_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. + + lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). + start_cell-cell_row = 1. + start_cell-cell_column = lv_column. + lv_row_alpha = ip_start_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. +endmethod. + + + + class ZCL_EXCEL_STYLE_FILL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +public section. + + class-data C_FILL_NONE type ZEXCEL_FILL_TYPE value 'none'. "#EC NOTEXT . + class-data C_FILL_SOLID type ZEXCEL_FILL_TYPE value 'solid'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_LINEAR type ZEXCEL_FILL_TYPE value 'linear'. "#EC NOTEXT . + class-data C_FILL_GRADIENT_PATH type ZEXCEL_FILL_TYPE value 'path'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKDOWN type ZEXCEL_FILL_TYPE value 'darkDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRAY type ZEXCEL_FILL_TYPE value 'darkGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKGRID type ZEXCEL_FILL_TYPE value 'darkGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKHORIZONTAL type ZEXCEL_FILL_TYPE value 'darkHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKTRELLIS type ZEXCEL_FILL_TYPE value 'darkTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKUP type ZEXCEL_FILL_TYPE value 'darkUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_DARKVERTICAL type ZEXCEL_FILL_TYPE value 'darkVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY0625 type ZEXCEL_FILL_TYPE value 'gray0625'. "#EC NOTEXT . + class-data C_FILL_PATTERN_GRAY125 type ZEXCEL_FILL_TYPE value 'gray125'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTDOWN type ZEXCEL_FILL_TYPE value 'lightDown'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRAY type ZEXCEL_FILL_TYPE value 'lightGray'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTGRID type ZEXCEL_FILL_TYPE value 'lightGrid'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTHORIZONTAL type ZEXCEL_FILL_TYPE value 'lightHorizontal'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTTRELLIS type ZEXCEL_FILL_TYPE value 'lightTrellis'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTUP type ZEXCEL_FILL_TYPE value 'lightUp'. "#EC NOTEXT . + class-data C_FILL_PATTERN_LIGHTVERTICAL type ZEXCEL_FILL_TYPE value 'lightVertical'. "#EC NOTEXT . + class-data C_FILL_PATTERN_MEDIUMGRAY type ZEXCEL_FILL_TYPE value 'mediumGray'. "#EC NOTEXT . + data FILLTYPE type ZEXCEL_FILL_TYPE . + data ROTATION type ZEXCEL_ROTATION . + data FGCOLOR type ZEXCEL_STYLE_COLOR_ARGB . + data BGCOLOR type ZEXCEL_STYLE_COLOR_ARGB value '64'. "#EC NOTEXT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FILL) type ZEXCEL_S_STYLE_FILL . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FILL +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + filltype = zcl_excel_style_fill=>c_fill_none. + rotation = 0. +endmethod. + + + + method GET_STRUCTURE. + es_fill-rotation = me->rotation. + es_fill-filltype = me->filltype. + es_fill-fgColor = me->fgColor. + es_fill-bgColor = me->bgColor. +endmethod. + + + + class ZCL_EXCEL_STYLE_FONT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + data BOLD type FLAG . + data COLOR type ZEXCEL_STYLE_COLOR_ARGB . + class-data C_SCHEME_MAJOR type ZEXCEL_STYLE_FONT_SCHEME value 'major'. "#EC NOTEXT . + class-data C_SCHEME_MINOR type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLE type CHAR20 value 'double'. "#EC NOTEXT . + class-data C_UNDERLINE_DOUBLEACCOUNTING type CHAR20 value 'doubleAccounting'. "#EC NOTEXT . + class-data C_UNDERLINE_NONE type CHAR20 value 'none'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLE type CHAR20 value 'single'. "#EC NOTEXT . + class-data C_UNDERLINE_SINGLEACCOUNTING type CHAR20 value 'singleAccounting'. "#EC NOTEXT . + data FAMILY type INT1 value 2. "#EC NOTEXT . + data ITALIC type FLAG . + data NAME type CHAR255 value 'Calibri'. "#EC NOTEXT . + data SCHEME type ZEXCEL_STYLE_FONT_SCHEME . + data SIZE type INT1 value 11. "#EC NOTEXT . + data STRIKETHROUGH type FLAG . + data UNDERLINE type FLAG . + data UNDERLINE_MODE type CHAR20 . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(ES_FONT) type ZEXCEL_S_STYLE_FONT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + me->color = zcl_excel_style_color=>c_black. + me->scheme = zcl_excel_style_font=>c_scheme_minor. + me->underline_mode = zcl_excel_style_font=>c_underline_single. +endmethod. + + + + method GET_STRUCTURE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + es_font-bold = me->bold. + es_font-italic = me->italic. + es_font-underline = me->underline. + es_font-underline_mode = me->underline_mode. + es_font-strikethrough = me->strikethrough. + es_font-size = me->size. + es_font-color = me->color. + es_font-name = me->name. + es_font-family = me->family. + es_font-scheme = me->scheme. + +endmethod. + + + + class ZCL_EXCEL_STYLE_NUMBER_FORMAT definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +public section. + + class-data C_FORMAT_NUMBER type ZEXCEL_NUMBER_FORMAT value '0'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_00 type ZEXCEL_NUMBER_FORMAT value '0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP1 type ZEXCEL_NUMBER_FORMAT value '#,##0.00'. "#EC NOTEXT . + class-data C_FORMAT_NUMBER_COMMA_SEP2 type ZEXCEL_NUMBER_FORMAT value '#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE type ZEXCEL_NUMBER_FORMAT value '0%'. "#EC NOTEXT . + class-data C_FORMAT_PERCENTAGE_00 type ZEXCEL_NUMBER_FORMAT value '0.00%'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD2 type ZEXCEL_NUMBER_FORMAT value 'yyyy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDD type ZEXCEL_NUMBER_FORMAT value 'yy-mm-dd'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DDMMYYYY type ZEXCEL_NUMBER_FORMAT value 'dd/mm/yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYSLASH type ZEXCEL_NUMBER_FORMAT value 'd/m/y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMYMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DMMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m'. "#EC NOTEXT . + class-data C_FORMAT_DATE_MYMINUS type ZEXCEL_NUMBER_FORMAT value 'm-y'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX14 type ZEXCEL_NUMBER_FORMAT value 'mm-dd-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX15 type ZEXCEL_NUMBER_FORMAT value 'd-mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX16 type ZEXCEL_NUMBER_FORMAT value 'd-mmm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX17 type ZEXCEL_NUMBER_FORMAT value 'mmm-yy'. "#EC NOTEXT . + class-data C_FORMAT_DATE_XLSX22 type ZEXCEL_NUMBER_FORMAT value 'm/d/yy h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_DATETIME type ZEXCEL_NUMBER_FORMAT value 'd/m/y h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME1 type ZEXCEL_NUMBER_FORMAT value 'h:mm AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME2 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss AM/PM'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME3 type ZEXCEL_NUMBER_FORMAT value 'h:mm'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME4 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME5 type ZEXCEL_NUMBER_FORMAT value 'mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME6 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME7 type ZEXCEL_NUMBER_FORMAT value 'i:s.S'. "#EC NOTEXT . + class-data C_FORMAT_DATE_TIME8 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss@'. "#EC NOTEXT . + class-data C_FORMAT_DATE_YYYYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yy/mm/dd@'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD_SIMPLE type ZEXCEL_NUMBER_FORMAT value '"$"#,##0.00_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_USD type ZEXCEL_NUMBER_FORMAT value '$#,##0_-'. "#EC NOTEXT . + class-data C_FORMAT_CURRENCY_EUR_SIMPLE type ZEXCEL_NUMBER_FORMAT value '[$EUR ]#,##0.00_-'. "#EC NOTEXT . + data FORMAT_CODE type ZEXCEL_NUMBER_FORMAT . + + methods CONSTRUCTOR . + methods GET_STRUCTURE + returning + value(EP_NUMBER_FORMAT) type ZEXCEL_NUMBER_FORMAT . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT +*"* do not include other source files here!!! +private section. + + class-data C_FORMAT_GENERAL type ZEXCEL_NUMBER_FORMAT value ''. "#EC NOTEXT . + class-data C_FORMAT_TEXT type ZEXCEL_NUMBER_FORMAT value '@'. "#EC NOTEXT . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + format_code = me->c_format_general. +endmethod. + + + + method GET_STRUCTURE. + ep_number_format = me->format_code. +endmethod. + + + + class ZCL_EXCEL_STYLE_PROTECTION definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +public section. + + constants C_PROTECTION_INHERIT type ZEXCEL_PROTECTION value 'inherit'. "#EC NOTEXT + constants C_PROTECTION_PROTECTED type ZEXCEL_PROTECTION value 'protected'. "#EC NOTEXT + constants C_PROTECTION_UNPROTECTED type ZEXCEL_PROTECTION value 'unprotected'. "#EC NOTEXT + data LOCKED type ZEXCEL_PROTECTION . + data HIDDEN type ZEXCEL_PROTECTION . + + methods CONSTRUCTOR . + *"* protected components of class ZABAP_EXCEL_STYLE_FONT +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_STYLE_PROTECTION +*"* do not include other source files here!!! +private section. + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + method CONSTRUCTOR. + locked = me->c_protection_inherit. + hidden = me->c_protection_inherit. +endmethod. + + + + class ZCL_EXCEL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL +*"* do not include other source files here!!! +public section. + + constants C_XLS type ZEXCEL_FORMAT value 'XLS'. "#EC NOTEXT + constants C_XLSX type ZEXCEL_FORMAT value 'XLSX'. "#EC NOTEXT + data PROPERTIES type ref to ZCL_EXCEL_PROPERTIES . + data SECURITY type ref to ZCL_EXCEL_SECURITY . + + methods ADD_NEW_DRAWING + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods ADD_NEW_RANGE + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods ADD_NEW_STYLE + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods ADD_NEW_WORKSHEET + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods CONSTRUCTOR . + methods GET_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_RANGES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_NAME + returning + value(EP_NAME) type ZEXCEL_WORKSHEETS_NAME . + methods GET_WORKSHEETS_SIZE + returning + value(EP_SIZE) type I . + methods SAVE_AS + importing + !IP_FORMAT type ZEXCEL_FORMAT + returning + value(EP_FILE) type XSTRING . + *"* protected components of class ZABAP_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . + data RANGES type ref to ZCL_EXCEL_RANGES . + data STYLES type ref to ZCL_EXCEL_STYLES . + data WORKSHEETS type ref to ZCL_EXCEL_WORKSHEETS . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + method ADD_NEW_DRAWING. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_title = ip_title. + drawings->add( eo_drawing ). +endmethod. + + + + method ADD_NEW_RANGE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Create default blank range + CREATE OBJECT eo_range. + ranges->add( eo_range ). +endmethod. + + + + method ADD_NEW_STYLE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +* Create default style + CREATE OBJECT eo_style. + styles->add( eo_style ). + +endmethod. + + + + + method ADD_NEW_WORKSHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_title = ip_title. + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). +endmethod. + + + method CONSTRUCTOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT properties. + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings. + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. + + +endmethod. + + + + method GET_ACTIVE_WORKSHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + +endmethod. + + + + method GET_DRAWINGS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->drawings->get_iterator( ). +endmethod. + + + + method GET_RANGES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->ranges->get_iterator( ). +endmethod. + + + + method GET_STYLES_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->styles->get_iterator( ). +endmethod. + + + + method GET_WORKSHEETS_ITERATOR. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + eo_iterator = me->worksheets->get_iterator( ). +endmethod. + + + + method GET_WORKSHEETS_NAME. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_name = me->worksheets->name. + +endmethod. + + + + method GET_WORKSHEETS_SIZE. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + ep_size = me->worksheets->size( ). + +endmethod. + + + + + method SAVE_AS. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + + DATA lo_excel_writer_2007 TYPE REF TO zcl_excel_writer_2007. + +* Determine the output engine to use + CASE ip_format. + WHEN me->c_xlsx. " XLSX for Office 2007 + CREATE OBJECT lo_excel_writer_2007 EXPORTING io_excel = me. + ep_file = lo_excel_writer_2007->create( ). + WHEN OTHERS. + ENDCASE. + +endmethod. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel9. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + +lo_data_validation = lo_worksheet->add_new_data_validation( ). +lo_data_validation->value = lo_range->name. +lo_data_validation->cell_row = 4. +lo_data_validation->cell_column = 'A'. + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Select a value' ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\DataValidation.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel8. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Range.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report Z_ZAKE_SVN +*& +*&---------------------------------------------------------------------* +*& Checkout / Checkin the ZAKE_SVN Project +*& +*&---------------------------------------------------------------------* + +REPORT zake_svn_a2x. + +CONSTANTS cl_svn TYPE seoclsname VALUE 'ZCL_ZAKE_SVN'. +CONSTANTS cl_tortoise_svn TYPE seoclsname VALUE 'ZCL_ZAKE_TORTOISE_SVN'. + +DATA package TYPE devclass. +DATA zake TYPE REF TO zake. + +DATA zake_objects TYPE scts_tadir. + +DATA files TYPE string_table. +DATA file LIKE LINE OF files. + +DATA zake_build TYPE string. +DATA zake_nuggetname TYPE string. + +DATA comment_str TYPE string. +DATA loclpath_str TYPE string. +DATA svnpath_str TYPE string. +DATA username_str TYPE string. +DATA password_str TYPE string. +DATA class TYPE seoclsname. + +DATA: ex TYPE REF TO zcx_saplink, + message TYPE string. + +SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE a. +PARAMETERS: + checkout TYPE flag RADIOBUTTON GROUP act, + update TYPE flag RADIOBUTTON GROUP act DEFAULT 'X', + checkin TYPE flag RADIOBUTTON GROUP act. +SELECTION-SCREEN END OF BLOCK a. + +SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE b. +PARAMETERS: + svn TYPE flag RADIOBUTTON GROUP cl, + tortoise TYPE flag RADIOBUTTON GROUP cl. +SELECTION-SCREEN END OF BLOCK b. + +SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE c. +PARAMETERS: + loclpath TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx' LOWER CASE OBLIGATORY, + zakebuil TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx\build\NUGG_ABAP2XLSX_V_1_0.nugg' LOWER CASE OBLIGATORY, + zakenugg TYPE char512 DEFAULT 'C:\ZAKE_SVN\Projects\abap2xlsx\nuggs\NUGG_ABAP2XLSX_V_1_0.nugg' LOWER CASE OBLIGATORY, + svnpath TYPE char512 DEFAULT 'https://abap2xlsx.googlecode.com/svn/trunk/abap2xlsx' LOWER CASE OBLIGATORY, + comment TYPE char512 DEFAULT '' LOWER CASE, + username TYPE char512 LOWER CASE, + password TYPE char512 LOWER CASE, + testrun TYPE flag DEFAULT 'X'. +SELECTION-SCREEN END OF BLOCK c. + +INITIALIZATION. + a = 'Action'. + b = 'Version Controll Program'. + c = 'Parameters'. + +START-OF-SELECTION. + + svnpath_str = svnpath. + loclpath_str = loclpath. + zake_build = zakebuil. + zake_nuggetname = zakenugg. + comment_str = comment. + + SELECT * INTO TABLE zake_objects FROM tadir WHERE devclass = 'ZABAP2XLSX'. + DELETE zake_objects WHERE object = 'DEVC'. + + TRY. + IF svn = 'X'. + class = cl_svn. + ELSE. + class = cl_tortoise_svn. + ENDIF. + + CREATE OBJECT zake + TYPE + (class) + EXPORTING + i_svnpath = svnpath_str + i_localpath = loclpath_str. + zake->set_testrun( testrun ). + + IF checkin = 'X'. + zake->set_package( 'ZA2X' ). + zake->set_checkin_objects( zake_objects ). + zake->create_slinkees( zake_nuggetname ). + " Build a complete package for download +* zake->set_package( 'ZA2X' ). +* zake->set_checkin_objects( zake_objects ). +* " Let's add the CMD Scripts to the complete package +* CONCATENATE loclpath 'bin/svn-script.cmd' INTO file. +* APPEND file TO files. +* CONCATENATE loclpath 'bin/tortoise-svn-script.cmd' INTO file. +* APPEND file TO files. +* zake->add_files_to_zip( files ). +* " We don't want that for the complete Package Slinkees are created +* " in the ZAKE folder +* zake->download_slinkees_to_lm = space. +* zake->download_nugget_to_lm = space. +* zake->create_slinkees( zake_nuggetname ). + IF testrun IS INITIAL. + zake->checkin( comment_str ). + ENDIF. + ELSE. + IF update = 'X'. + zake->update( ). + ELSE. + zake->checkout( ). + ENDIF. + " zake->install_slinkees_from_lm( testrun ). + zake->install_objects( zake_objects ). + ENDIF. + CATCH zcx_saplink INTO ex. + message = ex->msg. + WRITE: / 'An Error occured: ', message. + ENDTRY. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel1. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HelloWorld.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel2. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +CREATE OBJECT lo_border_light. +lo_border_light->border_color = zcl_excel_style_color=>c_gray. +lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. +" Create a bold / italic style +lo_style_bold = lo_excel->add_new_style( ). +lo_style_bold->font->bold = abap_true. +lo_style_bold->font->italic = abap_true. +lo_style_bold->font->color = zcl_excel_style_color=>c_red. +lv_style_bold_guid = lo_style_bold->get_guid( ). +" Create an underline double style +lo_style_underline = lo_excel->add_new_style( ). +lo_style_underline->font->underline = abap_true. +lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. +lv_style_underline_guid = lo_style_underline->get_guid( ). +" Create filled style +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lv_style_filled_guid = lo_style_filled->get_guid( ). +" Create border with button effects +lo_style_button = lo_excel->add_new_style( ). +lo_style_button->borders->right = lo_border_dark. +lo_style_button->borders->down = lo_border_dark. +lo_style_button->borders->left = lo_border_light. +lo_style_button->borders->top = lo_border_light. +lv_style_button_guid = lo_style_button->get_guid( ). +"Create style with border +lo_style_border = lo_excel->add_new_style( ). +lo_style_border->borders->allborders = lo_border_dark. +lv_style_border_guid = lo_style_border->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Styles'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Styles.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel3. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_header TYPE REF TO zcl_excel_style, + lo_style_body TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_header_guid TYPE zexcel_cell_style, + lv_style_body_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +" Create filled style +lo_style_header = lo_excel->add_new_style( ). +lo_style_header->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_header->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lo_style_header->borders->allborders = lo_border_dark. +lv_style_header_guid = lo_style_header->get_guid( ). +"Create style with border +lo_style_body = lo_excel->add_new_style( ). +lo_style_body->borders->allborders = lo_border_dark. +lv_style_body_guid = lo_style_body->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. +lo_worksheet->set_table( ip_table = lt_test + ip_hdr_style = lv_style_header_guid + ip_body_style = lv_style_body_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTab.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel4. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). + +lo_worksheet = lo_excel->add_new_worksheet( ). +lo_worksheet->title = 'Sheet2'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Sheets.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel5. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '100' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '1000' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '150' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '500' ip_style = lv_style_number_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\CondFormatting.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel6. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '100' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '1000' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '150' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '500' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '1760' ip_formula = 'SUM(C4:C8)' ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Formula.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel7. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_number TYPE REF TO zcl_excel_style, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +lo_style_number = lo_excel->add_new_style( ). +lo_style_number->number_format->format_code = zcl_excel_style_number_format=>c_format_number. +lv_style_number_guid = lo_style_number->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 5 + ip_stop_column = 'B' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 5 + ip_stop_column = 'C' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3flags. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 5 + ip_stop_column = 'D' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 5 + ip_stop_column = 'E' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 5 + ip_stop_column = 'F' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3signs. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'G' + ip_start_row = 5 + ip_stop_column = 'G' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'H' + ip_start_row = 5 + ip_stop_column = 'H' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'I' + ip_start_row = 5 + ip_stop_column = 'I' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 12 + ip_stop_column = 'B' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 12 + ip_stop_column = 'C' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 12 + ip_stop_column = 'D' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 12 + ip_stop_column = 'E' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 12 + ip_stop_column = 'F' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 19 + ip_stop_column = 'B' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 19 + ip_stop_column = 'C' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 19 + ip_stop_column = 'D' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = '50' ip_style = lv_style_number_guid ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5quarters. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 19 + ip_stop_column = 'E' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'E' ip_value = 'C_ICONSET_5QUARTERS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'E' ip_value = '10' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'E' ip_value = '20' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'E' ip_value = '30' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'E' ip_value = '40' ip_style = lv_style_number_guid ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'E' ip_value = '50' ip_style = lv_style_number_guid ). + +lv_file = lo_excel->save_as( zcl_excel=>c_xlsx ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Iconset.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nuggs/NUGG_ABAP2XLSX_V_1_1.nugg.zip b/nuggs/NUGG_ABAP2XLSX_V_1_1.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..73b35be4936f52d0023b33afb28ac9f6d6326714 GIT binary patch literal 53352 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≥t8+}I1a(aD~{{>xYg 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 Cc8atB literal 0 HcmV?d00001 diff --git a/nuggs/NUGG_ABAP2XLSX_V_2_1.nugg b/nuggs/NUGG_ABAP2XLSX_V_2_1.nugg new file mode 100644 index 0000000..34d7261 --- /dev/null +++ b/nuggs/NUGG_ABAP2XLSX_V_2_1.nugg @@ -0,0 +1,4964 @@ + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel. + +SUBMIT zdemo_excel1 AND RETURN. " Hello world +SUBMIT zdemo_excel2 AND RETURN. " Styles +SUBMIT zdemo_excel3 AND RETURN. " iTab binding +SUBMIT zdemo_excel4 AND RETURN. " Multi sheets +SUBMIT zdemo_excel5 AND RETURN. " Conditional formatting +SUBMIT zdemo_excel6 AND RETURN. " Formulas +SUBMIT zdemo_excel7 AND RETURN. " Conditional formatting +SUBMIT zdemo_excel8 AND RETURN. " Ranges +SUBMIT zdemo_excel9 AND RETURN. " Data validation +SUBMIT zdemo_excel10 AND RETURN. " Bind table with field catalog +" zdemo_excel11 is not added because it has a selection screen and +" you also need to have business partners maintained in transaction BP +SUBMIT zdemo_excel12 AND RETURN. " Column size +SUBMIT zdemo_excel13 AND RETURN. " Merge cell +SUBMIT zdemo_excel14 AND RETURN. " Alignment +SUBMIT zdemo_excel15 AND RETURN. " Read Excel and write it back + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel1. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ). + +CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HelloWorld.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& Test Styles for ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel2. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_filled_green_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Create border object +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. +CREATE OBJECT lo_border_light. +lo_border_light->border_color = zcl_excel_style_color=>c_gray. +lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. +" Create a bold / italic style +lo_style_bold = lo_excel->add_new_style( ). +lo_style_bold->font->bold = abap_true. +lo_style_bold->font->italic = abap_true. +lo_style_bold->font->color = zcl_excel_style_color=>c_red. +lv_style_bold_guid = lo_style_bold->get_guid( ). +" Create an underline double style +lo_style_underline = lo_excel->add_new_style( ). +lo_style_underline->font->underline = abap_true. +lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. +lv_style_underline_guid = lo_style_underline->get_guid( ). +" Create filled style yellow +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_yellow. +lv_style_filled_guid = lo_style_filled->get_guid( ). +" Create border with button effects +lo_style_button = lo_excel->add_new_style( ). +lo_style_button->borders->right = lo_border_dark. +lo_style_button->borders->down = lo_border_dark. +lo_style_button->borders->left = lo_border_light. +lo_style_button->borders->top = lo_border_light. +lv_style_button_guid = lo_style_button->get_guid( ). +"Create style with border +lo_style_border = lo_excel->add_new_style( ). +lo_style_border->borders->allborders = lo_border_dark. +lv_style_border_guid = lo_style_border->get_guid( ). +" Create filled style green +lo_style_filled = lo_excel->add_new_style( ). +lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. +lo_style_filled->fill->fgcolor = zcl_excel_style_color=>c_green. +lv_style_filled_green_guid = lo_style_filled->get_guid( ). + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Styles'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). +" Fill the cell and apply one style +lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). +" Change the style +lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Styles.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel3. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: ls_table_settings TYPE zexcel_s_table_settings. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. + +ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. +ls_table_settings-show_row_stripes = abap_true. + +lo_worksheet->bind_table( ip_table = lt_test + is_table_settings = ls_table_settings ). + +column_dimension = lo_worksheet->get_column_dimension( 'E' ). "make date field a bit wider +column_dimension->set_width( 11 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTab.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel4. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). + +lo_worksheet = lo_excel->add_new_worksheet( ). +lo_worksheet->title = 'Sheet2'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Sheets.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel5. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\CondFormatting.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel6. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_formula = 'SUM(C4:C8)' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Formula.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel7. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 5 + ip_stop_column = 'B' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 5 + ip_stop_column = 'C' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = 50 ). +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3flags. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 5 + ip_stop_column = 'D' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 5 + ip_stop_column = 'E' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 5 + ip_stop_column = 'F' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3signs. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'G' + ip_start_row = 5 + ip_stop_column = 'G' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'H' + ip_start_row = 5 + ip_stop_column = 'H' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'I' + ip_start_row = 5 + ip_stop_column = 'I' + ip_stop_row = 9 ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 12 + ip_stop_column = 'B' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 12 + ip_stop_column = 'C' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 12 + ip_stop_column = 'D' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 12 + ip_stop_column = 'E' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 12 + ip_stop_column = 'F' + ip_stop_row = 16 ). + +lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). +lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 19 + ip_stop_column = 'B' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 19 + ip_stop_column = 'C' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5rating. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 19 + ip_stop_column = 'D' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = 50 ). + +lo_style_conditional = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional->iconset = zcl_excel_style_conditional=>c_iconset_5quarters. +lo_style_conditional->priority = 1. +lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 19 + ip_stop_column = 'E' + ip_stop_row = 23 ). + +lo_worksheet->set_cell( ip_row = 18 ip_column = 'E' ip_value = 'C_ICONSET_5QUARTERS' ). +lo_worksheet->set_cell( ip_row = 19 ip_column = 'E' ip_value = 10 ). +lo_worksheet->set_cell( ip_row = 20 ip_column = 'E' ip_value = 20 ). +lo_worksheet->set_cell( ip_row = 21 ip_column = 'E' ip_value = 30 ). +lo_worksheet->set_cell( ip_row = 22 ip_column = 'E' ip_value = 40 ). +lo_worksheet->set_cell( ip_row = 23 ip_column = 'E' ip_value = 50 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Iconset.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel8. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Range.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel9. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. +lo_range = lo_excel->add_new_range( ). +lo_range->name = 'range'. +lo_range->set_value( ip_sheet_name = lo_worksheet->title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + +lo_data_validation = lo_worksheet->add_new_data_validation( ). +lo_data_validation->value = lo_range->name. +lo_data_validation->cell_row = 4. +lo_data_validation->cell_column = 'A'. + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Select a value' ). + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). +lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\DataValidation.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel10. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional2 TYPE REF TO zcl_excel_style_conditional, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_field_catalog TYPE zexcel_s_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Internal table'. + +"Conditional style +lo_style_conditional2 = lo_worksheet->add_new_conditional_style( ). +lo_style_conditional2->rule = zcl_excel_style_conditional=>c_rule_iconset. +lo_style_conditional2->iconset = zcl_excel_style_conditional=>c_iconset_5arrows. +lo_style_conditional2->priority = 1. + +DATA lt_test TYPE TABLE OF sflight. +SELECT * FROM sflight INTO TABLE lt_test. + +lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). + +LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'CARRID'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_count. + WHEN 'CONNID'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FLDATE'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'PRICE'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. + <fs_field_catalog>-cond_style = lo_style_conditional2. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. +ENDLOOP. + +ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. + +lo_worksheet->bind_table( ip_table = lt_test + is_table_settings = ls_table_settings + it_field_catalog = lt_field_catalog ). + +column_dimension = lo_worksheet->get_column_dimension( 'D' ). "make date field a bit wider +column_dimension->set_width( 13 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\iTabFieldCatalog.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL11 +*& Export Organisation and Contact Persons using ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel11. + +TYPE-POOLS: abap. + +DATA: central_search TYPE bapibus1006_central_search, + addressdata_search TYPE bapibus1006_addr_search, + others_search TYPE bapibus1006_other_data. +DATA: searchresult TYPE TABLE OF bapibus1006_bp_addr, + return TYPE TABLE OF bapiret2. +DATA: lines TYPE i. +FIELD-SYMBOLS: <searchresult_line> LIKE LINE OF searchresult. +DATA: centraldata TYPE bapibus1006_central, + centraldataperson TYPE bapibus1006_central_person, + centraldataorganization TYPE bapibus1006_central_organ. +DATA: addressdata TYPE bapibus1006_address. +DATA: relationships TYPE TABLE OF bapibus1006_relations. +FIELD-SYMBOLS: <relationship> LIKE LINE OF relationships. +DATA: relationship_centraldata TYPE bapibus1006002_central. +DATA: relationship_addresses TYPE TABLE OF bapibus1006002_addresses. +FIELD-SYMBOLS: <relationship_address> LIKE LINE OF relationship_addresses. + +DATA: lt_download TYPE TABLE OF zexcel_s_org_rel. +FIELD-SYMBOLS: <download> LIKE LINE OF lt_download. + +PARAMETERS: md TYPE flag RADIOBUTTON GROUP act. + +SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE a. +PARAMETERS: partnerc TYPE bu_type DEFAULT 2, " Organizations + postlcod TYPE ad_pstcd1 DEFAULT '8334*', + country TYPE land1 DEFAULT 'DE', + maxsel TYPE bu_maxsel DEFAULT 100. +SELECTION-SCREEN END OF BLOCK a. + +PARAMETERS: rel TYPE flag RADIOBUTTON GROUP act DEFAULT 'X'. + +SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE b. +PARAMETERS: reltyp TYPE bu_reltyp DEFAULT 'BUR011', + partner TYPE bu_partner DEFAULT '191'. +SELECTION-SCREEN END OF BLOCK b. + +INITIALIZATION. + a = 'Select by master data'. + b = 'Select by relationship'. + +START-OF-SELECTION. + IF md = abap_true. + " Read all Companies by Master Data + central_search-partnercategory = partnerc. + addressdata_search-postl_cod1 = postlcod. + addressdata_search-country = country. + others_search-maxsel = maxsel. + others_search-no_search_for_contactperson = 'X'. + + CALL FUNCTION 'BAPI_BUPA_SEARCH_2' + EXPORTING + centraldata = central_search + addressdata = addressdata_search + OTHERS = others_search + TABLES + searchresult = searchresult + return = return. + + SORT searchresult BY partner. + DELETE ADJACENT DUPLICATES FROM searchresult COMPARING partner. + ELSEIF rel = abap_true. + " Read by Relationship + SELECT but050~partner1 AS partner FROM but050 + INNER JOIN but000 ON but000~partner = but050~partner1 AND but000~type = '2' + INTO CORRESPONDING FIELDS OF TABLE searchresult + WHERE but050~partner2 = partner + AND but050~reltyp = reltyp. + ENDIF. + + DESCRIBE TABLE searchresult LINES lines. + WRITE: / 'Number of search results: ', lines. + + LOOP AT searchresult ASSIGNING <searchresult_line>. + " Read Details of Organization + CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + centraldataorganization = centraldataorganization. + " Read Standard Address of Organization + CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + addressdata = addressdata. + + " Add Organization to Download + APPEND INITIAL LINE TO lt_download ASSIGNING <download>. + " Fill Organization Partner Numbers + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + businesspartnerout = <download>-org_number + businesspartnerguidout = <download>-org_guid. + + MOVE-CORRESPONDING centraldataorganization TO <download>. + MOVE-CORRESPONDING addressdata TO <download>. + CLEAR: addressdata. + + " Read all Relationships + CLEAR: relationships. + CALL FUNCTION 'BAPI_BUPA_RELATIONSHIPS_GET' + EXPORTING + businesspartner = <searchresult_line>-partner + TABLES + relationships = relationships. + DELETE relationships WHERE relationshipcategory <> 'BUR001'. + LOOP AT relationships ASSIGNING <relationship>. + " Read details of Contact person + CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' + EXPORTING + businesspartner = <relationship>-partner2 + IMPORTING + centraldata = centraldata + centraldataperson = centraldataperson. + " Read details of the Relationship + CALL FUNCTION 'BAPI_BUPR_CONTP_GETDETAIL' + EXPORTING + businesspartner = <relationship>-partner1 + contactperson = <relationship>-partner2 + IMPORTING + centraldata = relationship_centraldata. + " Read relationship address + CLEAR: relationship_addresses. + + CALL FUNCTION 'BAPI_BUPR_CONTP_ADDRESSES_GET' + EXPORTING + businesspartner = <relationship>-partner1 + contactperson = <relationship>-partner2 + TABLES + addresses = relationship_addresses. + + READ TABLE relationship_addresses + ASSIGNING <relationship_address> + WITH KEY standardaddress = 'X'. + + IF <relationship_address> IS ASSIGNED. + " Read Relationship Address + CLEAR addressdata. + CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + addressguid = <relationship_address>-addressguid + IMPORTING + addressdata = addressdata. + + APPEND INITIAL LINE TO lt_download ASSIGNING <download>. + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <relationship>-partner1 + IMPORTING + businesspartnerout = <download>-org_number + businesspartnerguidout = <download>-org_guid. + + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <relationship>-partner2 + IMPORTING + businesspartnerout = <download>-contpers_number + businesspartnerguidout = <download>-contpers_guid. + + MOVE-CORRESPONDING centraldataorganization TO <download>. + MOVE-CORRESPONDING addressdata TO <download>. + MOVE-CORRESPONDING centraldataperson TO <download>. + MOVE-CORRESPONDING relationship_centraldata TO <download>. + + WRITE: / <relationship>-partner1, <relationship>-partner2. + WRITE: centraldataorganization-name1(20), centraldataorganization-name2(10). + WRITE: centraldataperson-firstname(15), centraldataperson-lastname(15). + WRITE: addressdata-street(25), addressdata-house_no, + addressdata-postl_cod1, addressdata-city(25). + ENDIF. + ENDLOOP. + + ENDLOOP. + + DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_body TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + DATA: lv_style_body_odd_guid TYPE zexcel_cell_style, + lv_style_body_even_guid TYPE zexcel_cell_style, + lv_style_body_green TYPE zexcel_cell_style, + lv_style_body_odd_n_guid TYPE zexcel_cell_style, + lv_style_body_even_n_guid TYPE zexcel_cell_style. + + DATA: row TYPE zexcel_cell_row. + + DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + + DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings. + + DATA: column TYPE zexcel_cell_column, + column_alpha TYPE zexcel_cell_column_alpha, + value TYPE zexcel_cell_value. + + FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + "Create style with border odd + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_gray. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_odd_guid = lo_style_body->get_guid( ). + "Create style with border even + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_yellow. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_even_guid = lo_style_body->get_guid( ). + "Create style with border and green fill + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_green. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_green = lo_style_body->get_guid( ). + "Create style numeric with border odd + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_gray. + lo_style_body->borders->allborders = lo_border_dark. + lo_style_body->number_format->format_code = zcl_excel_style_number_format=>c_format_number. + lv_style_body_odd_n_guid = lo_style_body->get_guid( ). + "Create style numeric with border odd + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->borders->allborders = lo_border_dark. + lo_style_body->number_format->format_code = zcl_excel_style_number_format=>c_format_number. + lv_style_body_even_n_guid = lo_style_body->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->title = 'Internal table'. + + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_download ). + + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'ORG_NUMBER'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'CONTPERS_NUMBER'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'NAME1'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'NAME2'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'STREET'. + <fs_field_catalog>-position = 5. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'HOUSE_NO'. + <fs_field_catalog>-position = 6. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'POSTL_COD1'. + <fs_field_catalog>-position = 7. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'CITY'. + <fs_field_catalog>-position = 8. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'COUNTRYISO'. + <fs_field_catalog>-position = 9. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FIRSTNAME'. + <fs_field_catalog>-position = 10. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'LASTNAME'. + <fs_field_catalog>-position = 11. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FUNCTIONNAME'. + <fs_field_catalog>-position = 12. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'DEPARTMENTNAME'. + <fs_field_catalog>-position = 13. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'TEL1_NUMBR'. + <fs_field_catalog>-position = 14. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'TEL1_EXT'. + <fs_field_catalog>-position = 15. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FAX_NUMBER'. + <fs_field_catalog>-position = 16. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FAX_EXTENS'. + <fs_field_catalog>-position = 17. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'E_MAIL'. + <fs_field_catalog>-position = 18. + <fs_field_catalog>-dynpfld = abap_true. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. + ENDLOOP. + + ls_table_settings-top_left_column = 'A'. + ls_table_settings-top_left_row = '2'. + ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. + + lo_worksheet->bind_table( ip_table = lt_download + is_table_settings = ls_table_settings + it_field_catalog = lt_field_catalog ). + LOOP AT lt_download ASSIGNING <download>. + row = sy-tabix + 2. + IF NOT <download>-org_number IS INITIAL + AND <download>-contpers_number IS INITIAL. + " Mark fields of Organization which can be changed green + lo_worksheet->set_cell_style( + ip_column = 'C' + ip_row = row + ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'D' + ip_row = row + ip_style = lv_style_body_green + ). +* CATCH zcx_excel. " Exceptions for ABAP2XLSX + ELSEIF NOT <download>-org_number IS INITIAL + AND NOT <download>-contpers_number IS INITIAL. + " Mark fields of Relationship which can be changed green + lo_worksheet->set_cell_style( + ip_column = 'L' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'M' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'N' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'O' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'P' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'Q' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'R' ip_row = row ip_style = lv_style_body_green + ). + ENDIF. + ENDLOOP. + " Add Fieldnames in first row and hide the row + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog> + WHERE position <> '' AND dynpfld = abap_true. + column = <fs_field_catalog>-position. + column_alpha = zcl_excel_common=>convert_column2alpha( column ). + value = <fs_field_catalog>-fieldname. + lo_worksheet->set_cell( ip_column = column_alpha + ip_row = 1 + ip_value = value + ip_style = lv_style_body_even_guid ). + ENDLOOP. + " Hide first row + row_dimension = lo_worksheet->get_row_dimension( 1 ). + row_dimension->set_visible( abap_false ). + + " Set Column width + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_width( 11 ). + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_width( 11 ). + column_dimension = lo_worksheet->get_column_dimension( 'C' ). + column_dimension->set_width( 35 ). + column_dimension = lo_worksheet->get_column_dimension( 'E' ). + column_dimension->set_width( 18 ). + column_dimension = lo_worksheet->get_column_dimension( 'F' ). + column_dimension->set_width( 5 ). + column_dimension = lo_worksheet->get_column_dimension( 'G' ). + column_dimension->set_width( 6 ). + column_dimension = lo_worksheet->get_column_dimension( 'H' ). + column_dimension->set_width( 12 ). + column_dimension = lo_worksheet->get_column_dimension( 'I' ). + column_dimension->set_width( 3 ). + column_dimension = lo_worksheet->get_column_dimension( 'J' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'K' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'L' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'M' ). + column_dimension->set_width( 13 ). + column_dimension = lo_worksheet->get_column_dimension( 'N' ). + column_dimension->set_width( 12 ). + column_dimension = lo_worksheet->get_column_dimension( 'O' ). + column_dimension->set_width( 9 ). + column_dimension = lo_worksheet->get_column_dimension( 'P' ). + column_dimension->set_width( 12 ). + column_dimension = lo_worksheet->get_column_dimension( 'Q' ). + column_dimension->set_width( 9 ). + column_dimension = lo_worksheet->get_column_dimension( 'R' ). + column_dimension->set_width( 40 ). + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + + " Save the file + CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\ZDEMO_EXCEL11.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL12 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel12. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'Sheet1'. +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world in AutoSize column' ). +lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Hello world in a column width size 50' ). +lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Hello world (hidden column)' ). +lo_worksheet->set_cell( ip_column = 'F' ip_row = 2 ip_value = 'Outline column level 0' ). +lo_worksheet->set_cell( ip_column = 'G' ip_row = 2 ip_value = 'Outline column level 1' ). +lo_worksheet->set_cell( ip_column = 'H' ip_row = 2 ip_value = 'Outline column level 2' ). + + +lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Hello world (hidden row)' ). +lo_worksheet->set_cell( ip_column = 'E' ip_row = 5 ip_value = 'Hello world in a row height size 20' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Outline row level 0' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Outline row level 1' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Outline row level 2' ). + +" Column Settings +column_dimension = lo_worksheet->get_column_dimension( 'B' ). +column_dimension->set_auto_size( abap_true ). +column_dimension = lo_worksheet->get_column_dimension( 'C' ). +column_dimension->set_width( 50 ). +column_dimension = lo_worksheet->get_column_dimension( 'D' ). +column_dimension->set_visible( abap_false ). +" Implementation in the Writer is not working yet ===== TODO ===== +column_dimension = lo_worksheet->get_column_dimension( 'F' ). +column_dimension->set_outline_level( 0 ). +column_dimension = lo_worksheet->get_column_dimension( 'G' ). +column_dimension->set_outline_level( 1 ). +column_dimension = lo_worksheet->get_column_dimension( 'H' ). +column_dimension->set_outline_level( 2 ). + +row_dimension = lo_worksheet->get_row_dimension( 1 ). +row_dimension->set_visible( abap_false ). +row_dimension = lo_worksheet->get_row_dimension( 5 ). +row_dimension->set_row_height( 20 ). +" Implementation in the Writer is not working yet ===== TODO ===== +row_dimension = lo_worksheet->get_row_dimension( 6 ). +row_dimension->set_outline_level( 0 ). +row_dimension = lo_worksheet->get_row_dimension( 7 ). +row_dimension->set_outline_level( 1 ). +row_dimension = lo_worksheet->get_row_dimension( 8 ). +row_dimension->set_outline_level( 2 ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +" Convert to binary +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\HideSizeOutlineRowsAndColumns.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL13 +*& +*&---------------------------------------------------------------------* +*& Example by: Alvaro "Blag" Tejada Galindo. +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel13. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer type ref to zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_file TYPE xstring, + lv_style_number_guid TYPE zexcel_cell_style, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1, + lv_style_bold_border_guid TYPE zexcel_cell_style, + lo_style_bold_border TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border. + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. + +CREATE OBJECT lo_border_dark. +lo_border_dark->border_color = zcl_excel_style_color=>c_black. +lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + +lo_style_bold_border = lo_excel->add_new_style( ). +lo_style_bold_border->font->bold = abap_true. +lo_style_bold_border->font->italic = abap_false. +lo_style_bold_border->font->color = zcl_excel_style_color=>c_black. +lo_style_bold_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lo_style_bold_border->borders->allborders = lo_border_dark. +lv_style_bold_border_guid = lo_style_bold_border->get_guid( ). + +lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = 'Test' ). + +lo_worksheet->set_cell( ip_row = 2 ip_column = 'B' ip_value = 'Banana' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'E' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_cell( ip_row = 2 ip_column = 'G' ip_value = '' ip_style = lv_style_bold_border_guid ). +lo_worksheet->set_merge( ip_row = 2 ip_column_start = 'B' ip_column_end = 'G' ). + +create object lo_excel_writer type zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Merged_Cells.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + interfaces ZIF_EXCEL_WRITER . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_TABLE + importing + !IO_TABLE type ref to ZCL_EXCEL_TABLE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + METHOD zif_excel_writer~write_file. + me->excel = io_excel. + ep_file = me->create( ). +ENDMETHOD. + + + + method CREATE. + + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string, + lv_value TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( lo_worksheet ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + lv_content = me->create_xl_table( lo_table ). + + lv_value = lo_table->get_name( ). + CONCATENATE 'xl/tables/' lv_value '.xml' into lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +endmethod. + + + + method CREATE_CONTENT_TYPES. + + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml', + lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i, + lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_worksheet_ct ). + lo_element_root->append_child( lo_element ). + ENDDO. + + lo_iterator = me->excel->get_worksheets_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->get_next( ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->get_next( ). + + lv_value = lo_table->get_name( ). + CONCATENATE '/xl/tables/' lv_value '.xml' INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_table_ct ). + lo_element_root->append_child( lo_element ). + ENDWHILE. + ENDWHILE. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_APP. + + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_CORE. + + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_SHAREDSTRINGS. + + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + + method CREATE_XL_SHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software. you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation. either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY. without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_sheetpr TYPE string VALUE 'sheetPr', + lc_xml_node_outlinepr TYPE string VALUE 'outlinePr', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_cols TYPE string VALUE 'cols', + lc_xml_node_col TYPE string VALUE 'col', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', + lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', + lc_xml_node_formula1 TYPE string VALUE 'formula1', + lc_xml_node_mergecell TYPE string VALUE 'mergeCell', + lc_xml_node_mergecells TYPE string VALUE 'mergeCells', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow', + lc_xml_attr_summaryright TYPE string VALUE 'summaryRight', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_showgridlines TYPE string VALUE 'showGridLines', + lc_xml_attr_showrowcolheaders TYPE string VALUE 'showRowColHeaders', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_min TYPE string VALUE 'min', + lc_xml_attr_max TYPE string VALUE 'max', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_width TYPE string VALUE 'width', + lc_xml_attr_defaultwidth TYPE string VALUE '9.10', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_true TYPE string VALUE 'true', + lc_xml_attr_bestfit TYPE string VALUE 'bestFit', + lc_xml_attr_customheight TYPE string VALUE 'customHeight', + lc_xml_attr_customwidth TYPE string VALUE 'customWidth', + lc_xml_attr_collapsed TYPE string VALUE 'collapsed', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_defaultcolwidth TYPE string VALUE 'defaultColWidth', + lc_xml_attr_outlinelevelrow TYPE string VALUE 'x14ac:outlineLevelRow', + lc_xml_attr_outlinelevelcol TYPE string VALUE 'x14ac:outlineLevelCol', + lc_xml_attr_outlinelevel TYPE string VALUE 'outlineLevel', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', + lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', + lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', + lc_xml_attr_count TYPE string VALUE 'count', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', + lc_xml_node_comp_pref TYPE string VALUE 'x14ac', + lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_value TYPE string, + t_range_merge TYPE string_table, + lv_merge TYPE string, + lv_column_p TYPE zexcel_cell_column_alpha, + lv_column TYPE zexcel_cell_column, + lv_flag TYPE c, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + DATA: default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, + default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data, + <fs_range_merge> LIKE LINE OF t_range_merge. + DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. + FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. + DATA: row_dimensions TYPE zexcel_t_worksheet_rowdimensio. + FIELD-SYMBOLS: <row_dimension> LIKE LINE OF row_dimensions. + DATA: outline_level_row TYPE i VALUE 0, + outline_level_col TYPE i VALUE 0. + DATA: col_count TYPE int4. + DATA: row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: write_current_row TYPE boolean. +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:mc' + value = lc_xml_node_comp_ns ). + lo_element_root->set_attribute_ns( name = 'mc:Ignorable' + value = lc_xml_node_comp_pref ). + lo_element_root->set_attribute_ns( name = 'xmlns:x14ac' + value = lc_xml_node_ig_ns ). + + +********************************************************************** +* STEP 4: Create subnodes + " sheetPr + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetpr + parent = lo_document ). + " TODO tabColor + + " outlinePr + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_outlinepr + parent = lo_document ). + " TODO read attribute summaryBelow and set the attribute to 0 + lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow + value = '1' ). + " TODO read attribute summaryRight and set the attribute to 0 + lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright + value = '1' ). + + lo_element->append_child( lo_element_2 ). + " TODO pageSetUpPr + + lo_element_root->append_child( lo_element ). + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + " showGridLines attribute + lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines + value = 'true' ). + " showRowColHeaders attribute + lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders + value = '1' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + column_dimensions[] = io_worksheet->get_column_dimensions( ). + row_dimensions[] = io_worksheet->get_row_dimensions( ). + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + " defaultRowHeight + default_row_dimension = io_worksheet->get_default_row_dimension( ). + IF default_row_dimension IS BOUND. + IF default_row_dimension->get_row_height( ) >= 0. + lo_element->set_attribute_ns( name = lc_xml_attr_customheight + value = lc_xml_attr_true ). + lv_value = default_row_dimension->get_row_height( ). + ELSE. + lv_value = '12.75'. + ENDIF. + ELSE. + lv_value = '12.75'. + ENDIF. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + " defaultColWidth + default_col_dimension = io_worksheet->get_default_column_dimension( ). + IF default_col_dimension IS BOUND. + IF default_col_dimension->get_width( ) >= 0. + lv_value = default_col_dimension->get_width( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultcolwidth + value = lv_value ). + ENDIF. + ENDIF. + " outlineLevelRow + LOOP AT row_dimensions ASSIGNING <row_dimension>. + IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. + outline_level_row = <row_dimension>-row_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_row. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelrow + value = lv_value ). + " outlineLevelCol + LOOP AT column_dimensions ASSIGNING <column_dimension>. + IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. + outline_level_col = <column_dimension>-column_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_col. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelcol + value = lv_value ). + + lo_element_root->append_child( lo_element ). " sheetFormatPr node + " cols node + IF NOT column_dimensions IS INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_cols + parent = lo_document ). + LOOP AT column_dimensions ASSIGNING <column_dimension>. + " col node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = <column_dimension>-column_dimension->get_column_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min + value = lv_value ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + " Width + IF <column_dimension>-column_dimension->get_width( ) < 0. + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + ELSE. + lv_value = <column_dimension>-column_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lv_value ). + ENDIF. + " Column visibility + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = lc_xml_attr_true ). + ENDIF. + " Auto size? + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit + value = lc_xml_attr_true ). + ENDIF. + " Custom width? + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + + ENDIF. + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + ENDIF. + " Collapsed + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed + value = lc_xml_attr_true ). + ENDIF. + " outlineLevel + IF <column_dimension>-column_dimension->get_outline_level( ) > 0. + lv_value = <column_dimension>-column_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel + value = lv_value ). + ENDIF. + " Style + lv_value = <column_dimension>-column_dimension->get_xf_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + + lo_element->append_child( lo_element_2 ). " col node + ENDLOOP. + ENDIF. + lo_element_root->append_child( lo_element ). " cols node + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + " Get column count + col_count = io_worksheet->get_highest_column( ). + + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + " Add new row + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + " r + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + " Spans + lv_value = col_count. + CONCATENATE '1:' lv_value INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = lv_value ). + row_dimension = io_worksheet->get_row_dimension( <ls_sheet_content>-cell_row ). + " Do we need the row dimension attributes? + IF row_dimension->get_row_height( ) >= 0 OR + row_dimension->get_visible( ) = abap_false OR + row_dimension->get_collapsed( ) = abap_true OR + row_dimension->get_outline_level( ) > 0 OR + row_dimension->get_xf_index( ) <> 0. + " Row dimensions + IF row_dimension->get_row_height( ) >= 0. + lo_element_2->set_attribute_ns( name = 'customHeight' value = '1'). + lv_value = row_dimension->get_row_height( ). + lo_element_2->set_attribute_ns( name = 'ht' value = lv_value ). + ENDIF. + " Row visibility + IF row_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). + ENDIF. + " Collapsed + IF row_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = 'collapsed' value = 'true'). + ENDIF. + " Outline level + IF row_dimension->get_outline_level( ) > 0. + lv_value = row_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = 'outlineLevel' value = lv_value ). + ENDIF. + " Style + IF row_dimension->get_xf_index( ) <> 0. + lv_value = row_dimension->get_xf_index( ). + lo_element_2->set_attribute_ns( name = 's' value = lv_value ). + lo_element_2->set_attribute_ns( name = 'customFormat' value = '1'). + ENDIF. + ENDIF. + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + + " For cells with formula ignore the value - Excel will calculate it + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ELSE. + IF <ls_sheet_content>-data_type IS NOT INITIAL. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = <ls_sheet_content>-data_type ). + ENDIF. + + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF <ls_sheet_content>-data_type EQ 's'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + ENDIF. + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + + + IF io_worksheet->get_data_validations_size( ) GT 0. + " dataValidations node + lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations + parent = lo_document ). + " Conditional formatting node + lo_iterator = io_worksheet->get_data_validations_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_data_validation ?= lo_iterator->get_next( ). + " dataValidation node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation + parent = lo_document ). + lv_value = lo_data_validation->type. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + IF lo_data_validation->allowblank EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank + value = lv_value ). + IF lo_data_validation->showinputmessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage + value = lv_value ). + IF lo_data_validation->showerrormessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage + value = lv_value ). + lv_cell_row_s = lo_data_validation->cell_row. + SHIFT lv_cell_row_s RIGHT DELETING TRAILING space. + SHIFT lv_cell_row_s LEFT DELETING LEADING space. + CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + " formula1 node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 + parent = lo_document ). + lv_value = lo_data_validation->value. + lo_element_3->set_value( lv_value ). + + lo_element_2->append_child( lo_element_3 ). " formula1 node + + lo_element->append_child( lo_element_2 ). " dataValidation node + ENDWHILE. + lo_element_root->append_child( lo_element ). " dataValidations node + ENDIF. + + t_range_merge = io_worksheet->get_merge( ). + IF t_range_merge IS NOT INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_mergecells + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + LOOP AT t_range_merge ASSIGNING <fs_range_merge>. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_mergecell + parent = lo_document ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_ref + value = <fs_range_merge> ). + lo_element->append_child( lo_element_2 ). + lo_element_root->append_child( lo_element ). + io_worksheet->delete_merge( ). + ENDLOOP. + ENDIF. + + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +* tables + DATA lv_table_count TYPE i. + + lv_table_count = io_worksheet->get_tables_size( ). + IF lv_table_count > 0. + lo_element = lo_document->create_simple_element( name = 'tableParts' + parent = lo_document ). + lv_value = lv_table_count. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lv_table_count = 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_iterator->get_next( ). + add 1 to lv_table_count. + + lv_value = lv_table_count. + condense lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element_2 = lo_document->create_simple_element( name = 'tablePart' + parent = lo_element ). + lo_element_2->set_attribute_ns( name = 'r:id' + value = lv_value ). + lo_element->append_child( lo_element_2 ). + + ENDWHILE. + + lo_element_root->append_child( lo_element ). + + ENDIF. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + method CREATE_XL_SHEET_RELS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_value TYPE string, + lv_counter TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Add sheet Relationship nodes here + lv_counter = 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_iterator->get_next( ). + ADD 1 TO lv_counter. + + lv_value = lv_counter. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_table_tp ). + + lv_value = lo_table->get_name( ). + CONCATENATE '../tables/' lv_value '.xml' INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element_root->append_child( lo_element ). + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_STYLES. + + +** Constant node name + DATA: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " numfmt + lc_xml_node_numfmts TYPE string VALUE 'numFmts', + lc_xml_node_numfmt TYPE string VALUE 'numFmt', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + lc_xml_node_alignment TYPE string VALUE 'alignment', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + lc_xml_attr_applyalignment TYPE string VALUE 'applyAlignment', + lc_xml_attr_horizontal TYPE string VALUE 'horizontal', + lc_xml_attr_formatcode TYPE string VALUE 'formatCode', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_numfmts TYPE REF TO if_ixml_element, + lo_element_numfmt TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + lt_numfmts TYPE zexcel_t_style_numfmt, + ls_numfmt TYPE zexcel_s_style_numfmt, + lt_alignments TYPE zexcel_t_style_alignment, + ls_alignment TYPE zexcel_s_style_alignment, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i, + lv_align_flag TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + + lo_element_numfmts = lo_document->create_simple_element( name = lc_xml_node_numfmts + parent = lo_document ). + + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_alignment = lo_style->alignment->get_structure( ). + ls_numfmt = lo_style->number_format->get_structure( ). + + CLEAR ls_cellxfs. + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress alignment + READ TABLE lt_alignments FROM ls_alignment TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-alignmentid = sy-tabix. + ELSE. + APPEND ls_alignment TO lt_alignments. + DESCRIBE TABLE lt_alignments LINES ls_cellxfs-alignmentid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + +* Compress number formats + IF ls_numfmt IS NOT INITIAL. + READ TABLE lt_numfmts FROM ls_numfmt TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-numfmtid = sy-tabix. + ELSE. + APPEND ls_numfmt TO lt_numfmts. + DESCRIBE TABLE lt_numfmts LINES ls_cellxfs-numfmtid. + ENDIF. + ADD zcl_excel_common=>c_excel_numfmt_offset TO ls_cellxfs-numfmtid. " Add OXML offset for custom styles + ls_cellxfs-applynumberformat = 1. + ELSE. + ls_cellxfs-applynumberformat = 0. + ENDIF. + + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-alignmentid NE 0. + ls_cellxfs-applyalignment = 1. + ELSE. + ls_cellxfs-applyalignment = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create numfmt elements + LOOP AT lt_numfmts INTO ls_numfmt. + lo_element_numfmt = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_document ). + lv_value = sy-tabix + zcl_excel_common=>c_excel_numfmt_offset. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + lv_value = ls_numfmt-numfmt. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_formatcode + value = lv_value ). + lo_element_numfmts->append_child( lo_element_numfmt ). + ENDLOOP. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_numfmts ). + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyalignment EQ 1. " depends on each style not for all the sheet + MOVE ls_cellxfs-applyalignment TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyalignment + value = lv_value ). + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_alignment + parent = lo_document ). + ADD 1 TO ls_cellxfs-alignmentid. "Table index starts from 1 + READ TABLE lt_alignments INTO ls_alignment INDEX ls_cellxfs-alignmentid. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + MOVE ls_alignment-horizontal TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_horizontal + value = lv_value ). + lo_element->append_child( lo_sub_element_2 ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = '0' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = '0' ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = 'TableStyleMedium9' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = 'PivotStyleLight16' ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + METHOD create_xl_table. + + DATA: lc_xml_node_table TYPE string VALUE 'table', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_display_name TYPE string VALUE 'displayName', + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_totals TYPE string VALUE 'totalsRowShown', + " Node namespace + lc_xml_node_table_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + + lv_table_name TYPE string, + lv_id TYPE i, + lv_syindex TYPE char3, + lv_ref TYPE string, + lv_value TYPE string, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_num_columns TYPE i, + ls_fieldcat TYPE zexcel_s_fieldcatalog. + + +********************************************************************** +* STEP 1: Create xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node table + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table + parent = lo_document ). + + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_table_ns ). + + lv_id = io_table->get_id( ). + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + + lv_table_name = io_table->get_name( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_name + value = lv_table_name ). + + lo_element_root->set_attribute_ns( name = lc_xml_attr_display_name + value = lv_table_name ). + + lv_ref = io_table->get_reference( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_ref + value = lv_ref ). + IF io_table->has_totals( ) = abap_true. + lo_element_root->set_attribute_ns( name = 'totalsRowCount' + value = '1' ). + ELSE. + lo_element_root->set_attribute_ns( name = lc_xml_attr_totals + value = '0' ). + ENDIF. + +********************************************************************** +* STEP 4: Create subnodes + + " autoFilter + lo_element = lo_document->create_simple_element( name = 'autoFilter' + parent = lo_document ). + + lv_ref = io_table->get_reference( ip_include_totals_row = abap_false ). + lo_element->set_attribute_ns( name = 'ref' + value = lv_ref ). + + lo_element_root->append_child( lo_element ). + + "columns + lo_element = lo_document->create_simple_element( name = 'tableColumns' + parent = lo_document ). + +* lo_columns = io_table->get_columns( ). + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + ADD 1 TO lv_num_columns. + ENDLOOP. + + lv_value = lv_num_columns. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lo_element_root->append_child( lo_element ). + + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn' + parent = lo_element ). + + lv_value = ls_fieldcat-position. + SHIFT lv_value LEFT DELETING LEADING '0'. + lo_element2->set_attribute_ns( name = 'id' + value = lv_value ). + lv_value = ls_fieldcat-scrtext_m. + lo_element2->set_attribute_ns( name = 'name' + value = lv_value ). + + IF ls_fieldcat-totals_function IS NOT INITIAL. + lo_element2->set_attribute_ns( name = 'totalsRowFunction' + value = ls_fieldcat-totals_function ). + ENDIF. + + lo_element->append_child( lo_element2 ). + ENDLOOP. + + + lo_element = lo_document->create_simple_element( name = 'tableStyleInfo' + parent = lo_element_root ). + + lo_element->set_attribute_ns( name = 'name' + value = io_table->settings-table_style ). + + lo_element->set_attribute_ns( name = 'showFirstColumn' + value = '0' ). + + lo_element->set_attribute_ns( name = 'showLastColumn' + value = '0' ). + + IF io_table->settings-show_row_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showRowStripes' + value = lv_value ). + + IF io_table->settings-show_column_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showColumnStripes' + value = lv_value ). + + lo_element_root->append_child( lo_element ). +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + method CREATE_XL_THEME. + + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +endmethod. + + + + method CREATE_XL_WORKBOOK. + + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + + " ranges node + lo_element = lo_document->create_simple_element( name = lc_xml_node_definedNames + parent = lo_document ). + lo_iterator = excel->get_ranges_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedName + parent = lo_document ). + lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( lv_value ). + lo_element->append_child( lo_sub_element ). " range node + ENDWHILE. + lo_element_root->append_child( lo_element )." ranges node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + method FLAG2BOOL. + + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +endmethod. + + + + + method GET_SHARED_STRING_INDEX. + + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +endmethod. + + + + + + + + + + class ZCL_EXCEL definition + public + final + create public . + +*"* public components of class ZCL_EXCEL +*"* do not include other source files here!!! +public section. + + data PROPERTIES type ref to ZCL_EXCEL_PROPERTIES . + data SECURITY type ref to ZCL_EXCEL_SECURITY . + + methods ADD_NEW_DRAWING + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . + methods ADD_NEW_RANGE + returning + value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . + methods ADD_NEW_STYLE + returning + value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . + methods ADD_NEW_WORKSHEET + importing + !IP_TITLE type ZEXCEL_SHEET_TITLE optional + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods CONSTRUCTOR . + methods GET_ACTIVE_WORKSHEET + returning + value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_RANGES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_STYLES_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods GET_WORKSHEETS_NAME + returning + value(EP_NAME) type ZEXCEL_WORKSHEETS_NAME . + methods GET_WORKSHEETS_SIZE + returning + value(EP_SIZE) type I . + methods GET_NEXT_TABLE_ID + returning + value(EP_ID) type I . + *"* protected components of class ZCL_EXCEL +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL +*"* do not include other source files here!!! +private section. + + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . + data RANGES type ref to ZCL_EXCEL_RANGES . + data STYLES type ref to ZCL_EXCEL_STYLES . + data WORKSHEETS type ref to ZCL_EXCEL_WORKSHEETS . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + method ADD_NEW_DRAWING. + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_title = ip_title. + drawings->add( eo_drawing ). +endmethod. + + + + method ADD_NEW_RANGE. +* Create default blank range + CREATE OBJECT eo_range. + ranges->add( eo_range ). +endmethod. + + + + method ADD_NEW_STYLE. +* Create default style + CREATE OBJECT eo_style. + styles->add( eo_style ). + +endmethod. + + + + + method ADD_NEW_WORKSHEET. + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_excel = me + ip_title = ip_title. + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). +endmethod. + + + method CONSTRUCTOR. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT properties. + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings. + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. +endmethod. + + + + method GET_ACTIVE_WORKSHEET. + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + +endmethod. + + + + method GET_DRAWINGS_ITERATOR. + + eo_iterator = me->drawings->get_iterator( ). + +endmethod. + + + + method GET_NEXT_TABLE_ID. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_tables_count TYPE i. + + lo_iterator = me->get_worksheets_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->get_next( ). + + lv_tables_count = lo_worksheet->get_tables_size( ). + ADD lv_tables_count TO ep_id. + + ENDWHILE. + + ADD 1 TO ep_id. + +endmethod. + + + + method GET_RANGES_ITERATOR. + + eo_iterator = me->ranges->get_iterator( ). + +endmethod. + + + + method GET_STYLES_ITERATOR. + + eo_iterator = me->styles->get_iterator( ). + +endmethod. + + + + method GET_WORKSHEETS_ITERATOR. + + eo_iterator = me->worksheets->get_iterator( ). + +endmethod. + + + + method GET_WORKSHEETS_NAME. + + ep_name = me->worksheets->name. + +endmethod. + + + + method GET_WORKSHEETS_SIZE. + + ep_size = me->worksheets->size( ). + +endmethod. + + + diff --git a/nuggs/NUGG_ABAP2XLSX_V_2_1.nugg.zip b/nuggs/NUGG_ABAP2XLSX_V_2_1.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e093c62b6ae52c2280fdcbbc2083e414b40cc54 GIT binary patch literal 30742 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 F{{ni#gFpZP literal 0 HcmV?d00001 diff --git a/nuggs/NUGG_ABAP2XLSX_V_3_0.nugg b/nuggs/NUGG_ABAP2XLSX_V_3_0.nugg new file mode 100644 index 0000000..cc04a8a --- /dev/null +++ b/nuggs/NUGG_ABAP2XLSX_V_3_0.nugg @@ -0,0 +1,3559 @@ + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL13 +*& +*&---------------------------------------------------------------------* +*& Example by: Alvaro "Blag" Tejada Galindo. +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel14. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1, + lo_style_center TYPE REF TO zcl_excel_style, + lo_style_right TYPE REF TO zcl_excel_style, + lo_style_left TYPE REF TO zcl_excel_style, + lo_style_general TYPE REF TO zcl_excel_style, + lo_style_bottom TYPE REF TO zcl_excel_style, + lo_style_middle TYPE REF TO zcl_excel_style, + lo_style_top TYPE REF TO zcl_excel_style, + lo_style_justify TYPE REF TO zcl_excel_style, + lo_style_mixed TYPE REF TO zcl_excel_style, + lo_style_rotated TYPE REF TO zcl_excel_style, + lo_style_shrink TYPE REF TO zcl_excel_style, + lo_style_indent TYPE REF TO zcl_excel_style, + lv_style_center_guid TYPE zexcel_cell_style, + lv_style_right_guid TYPE zexcel_cell_style, + lv_style_left_guid TYPE zexcel_cell_style, + lv_style_general_guid TYPE zexcel_cell_style, + lv_style_bottom_guid TYPE zexcel_cell_style, + lv_style_middle_guid TYPE zexcel_cell_style, + lv_style_top_guid TYPE zexcel_cell_style, + lv_style_justify_guid TYPE zexcel_cell_style, + lv_style_mixed_guid TYPE zexcel_cell_style, + lv_style_rotated_guid TYPE zexcel_cell_style, + lv_style_shrink_guid TYPE zexcel_cell_style, + lv_style_indent_guid TYPE zexcel_cell_style. + +DATA: lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->title = 'sheet1'. + +"Center +lo_style_center = lo_excel->add_new_style( ). +lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lv_style_center_guid = lo_style_center->get_guid( ). +"Right +lo_style_right = lo_excel->add_new_style( ). +lo_style_right->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. +lv_style_right_guid = lo_style_right->get_guid( ). +"Left +lo_style_left = lo_excel->add_new_style( ). +lo_style_left->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_left. +lv_style_left_guid = lo_style_left->get_guid( ). +"General +lo_style_general = lo_excel->add_new_style( ). +lo_style_general->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_general. +lv_style_general_guid = lo_style_general->get_guid( ). +"Bottom +lo_style_bottom = lo_excel->add_new_style( ). +lo_style_bottom->alignment->vertical = zcl_excel_style_alignment=>c_vertical_bottom. +lv_style_bottom_guid = lo_style_bottom->get_guid( ). +"Middle +lo_style_middle = lo_excel->add_new_style( ). +lo_style_middle->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +lv_style_middle_guid = lo_style_middle->get_guid( ). +"Top +lo_style_top = lo_excel->add_new_style( ). +lo_style_top->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. +lv_style_top_guid = lo_style_top->get_guid( ). +"Justify +lo_style_justify = lo_excel->add_new_style( ). +lo_style_justify->alignment->vertical = zcl_excel_style_alignment=>c_vertical_justify. +lv_style_justify_guid = lo_style_justify->get_guid( ). + +"Shrink +lo_style_shrink = lo_excel->add_new_style( ). +lo_style_shrink->alignment->shrinktofit = abap_true. +lv_style_shrink_guid = lo_style_shrink->get_guid( ). + +"Indent +lo_style_indent = lo_excel->add_new_style( ). +lo_style_indent->alignment->indent = 5. +lv_style_indent_guid = lo_style_indent->get_guid( ). + +"Middle / Centered / Wrap +lo_style_mixed = lo_excel->add_new_style( ). +lo_style_mixed->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lo_style_mixed->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +lo_style_mixed->alignment->wraptext = abap_true. +lv_style_mixed_guid = lo_style_mixed->get_guid( ). + +"Center +lo_style_rotated = lo_excel->add_new_style( ). +lo_style_rotated->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. +lo_style_rotated->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +lo_style_rotated->alignment->textrotation = 165. " -75° == 90° + 75° +lv_style_rotated_guid = lo_style_rotated->get_guid( ). + + +" Set row size for first 7 rows to 40 +DO 7 TIMES. + lo_row_dimension = lo_worksheet->get_row_dimension( sy-index ). + lo_row_dimension->set_row_height( 40 ). +ENDDO. + +"Horizontal alignment +lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Centered Text' ip_style = lv_style_center_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 'Right Text' ip_style = lv_style_right_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Left Text' ip_style = lv_style_left_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 'General Text' ip_style = lv_style_general_guid ). + +" Shrink & indent +lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'Text shrinked' ip_style = lv_style_shrink_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 'Text indented' ip_style = lv_style_indent_guid ). + +"Vertical alignment + +lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Bottom Text' ip_style = lv_style_bottom_guid ). +lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Middle Text' ip_style = lv_style_middle_guid ). +lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 'Top Text' ip_style = lv_style_top_guid ). +lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 'Justify Text' ip_style = lv_style_justify_guid ). + +" Wrapped +lo_worksheet->set_cell( ip_row = 10 ip_column = 'B' + ip_value = 'This is a wrapped text centered in the middle' + ip_style = lv_style_mixed_guid ). + +" Rotated +lo_worksheet->set_cell( ip_row = 10 ip_column = 'D' + ip_value = 'This is a centered text rotated by -75°' + ip_style = lv_style_rotated_guid ). + +CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +"convert to table +CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +"Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Alignment.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. + + + + class ZCL_EXCEL_WRITER_2007 definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +public section. + + interfaces ZIF_EXCEL_WRITER . + *"* protected components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_WRITER_2007 +*"* do not include other source files here!!! +private section. + + constants C_CONTENT_TYPES type STRING value '[Content_Types].xml'. "#EC NOTEXT + constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT + constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT + constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT + constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT + constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT + constants C_XL_SHEET_RELS type STRING value 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT + constants C_XL_STYLES type STRING value 'xl/styles.xml'. "#EC NOTEXT + constants C_XL_THEME type STRING value 'xl/theme/theme1.xml'. "#EC NOTEXT + constants C_XL_WORKBOOK type STRING value 'xl/workbook.xml'. "#EC NOTEXT + data EXCEL type ref to ZCL_EXCEL . + data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING . + data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . + + methods CREATE + returning + value(EP_EXCEL) type XSTRING . + methods CREATE_CONTENT_TYPES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_APP + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_DOCPROPS_CORE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_RELATIONSHIPS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHAREDSTRINGS + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_ACTIVE type FLAG default '' + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_SHEET_RELS + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_STYLES + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_TABLE + importing + !IO_TABLE type ref to ZCL_EXCEL_TABLE + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_WORKBOOK + returning + value(EP_CONTENT) type XSTRING . + methods FLAG2BOOL + importing + !IP_FLAG type FLAG + returning + value(EP_BOOLEAN) type CHAR5 . + methods GET_SHARED_STRING_INDEX + importing + !IP_CELL_VALUE type ZEXCEL_CELL_VALUE + returning + value(EP_INDEX) type INT4 . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + METHOD zif_excel_writer~write_file. + me->excel = io_excel. + ep_file = me->create( ). +ENDMETHOD. + + + + method CREATE. + + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_syindex TYPE string, + lv_value TYPE string. + + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sheet#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_true. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( lo_worksheet ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + lv_content = me->create_xl_table( lo_table ). + + lv_value = lo_table->get_name( ). + CONCATENATE 'xl/tables/' lv_value '.xml' into lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + ENDWHILE. + +********************************************************************** +* STEP 11: Create the final zip + ep_excel = lo_zip->save( ). + +endmethod. + + + + method CREATE_CONTENT_TYPES. + + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml', + lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i, + lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_worksheet_ct ). + lo_element_root->append_child( lo_element ). + ENDDO. + + lo_iterator = me->excel->get_worksheets_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->get_next( ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->get_next( ). + + lv_value = lo_table->get_name( ). + CONCATENATE '/xl/tables/' lv_value '.xml' INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_table_ct ). + lo_element_root->append_child( lo_element ). + ENDWHILE. + ENDWHILE. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_APP. + + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->properties->application. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->properties->docsecurity. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->scalecrop ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( lv_value ). + lo_sub_element_variant->append_child( lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( lo_sub_element_variant ). " variant node + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lo_sub_element_lpstr->set_value( lv_value ). + lo_sub_element_vector->append_child( lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( lo_sub_element_vector ). " vector node + + lo_element_root->append_child( lo_element ). " TitlesOfParts + + + + " Company + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->properties->company. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->linksuptodate ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->shareddoc ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->properties->hyperlinkschanged ). + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->properties->appversion. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_DOCPROPS_CORE. + + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', + lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->properties->creator. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->properties->lastmodifiedby. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->created. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + lv_value = excel->properties->modified. + lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( lv_value ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + method CREATE_XL_SHAREDSTRINGS. + + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + lo_sub_element->set_value( <fs_sheet_string>-string_value ). + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + + method CREATE_XL_SHEET. +********************************************************************** +* abap2xlsx +* +* Copyright (c) 2010 - 2011 Plinky.it +* +* This library is free software. you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation. either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY. without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @category ABAP xlsx Creator +* @package ZA2E +* @author Ivan Femia +* @company Techedge SpA +* @homepage http://www.plinky.it/software +* @copyright Copyright (c) 2010 - 2011 http://www.plinky.it +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.0, 2010-06-30 +********************************************************************** + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_sheetpr TYPE string VALUE 'sheetPr', + lc_xml_node_outlinepr TYPE string VALUE 'outlinePr', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_cols TYPE string VALUE 'cols', + lc_xml_node_col TYPE string VALUE 'col', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', + lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', + lc_xml_node_formula1 TYPE string VALUE 'formula1', + lc_xml_node_mergecell TYPE string VALUE 'mergeCell', + lc_xml_node_mergecells TYPE string VALUE 'mergeCells', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow', + lc_xml_attr_summaryright TYPE string VALUE 'summaryRight', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_showgridlines TYPE string VALUE 'showGridLines', + lc_xml_attr_showrowcolheaders TYPE string VALUE 'showRowColHeaders', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_min TYPE string VALUE 'min', + lc_xml_attr_max TYPE string VALUE 'max', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_width TYPE string VALUE 'width', + lc_xml_attr_defaultwidth TYPE string VALUE '9.10', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_true TYPE string VALUE 'true', + lc_xml_attr_bestfit TYPE string VALUE 'bestFit', + lc_xml_attr_customheight TYPE string VALUE 'customHeight', + lc_xml_attr_customwidth TYPE string VALUE 'customWidth', + lc_xml_attr_collapsed TYPE string VALUE 'collapsed', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_defaultcolwidth TYPE string VALUE 'defaultColWidth', + lc_xml_attr_outlinelevelrow TYPE string VALUE 'x14ac:outlineLevelRow', + lc_xml_attr_outlinelevelcol TYPE string VALUE 'x14ac:outlineLevelCol', + lc_xml_attr_outlinelevel TYPE string VALUE 'outlineLevel', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', + lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', + lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', + lc_xml_attr_count TYPE string VALUE 'count', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', + lc_xml_node_comp_pref TYPE string VALUE 'x14ac', + lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_value TYPE string, + t_range_merge TYPE string_table, + lv_merge TYPE string, + lv_column_p TYPE zexcel_cell_column_alpha, + lv_column TYPE zexcel_cell_column, + lv_flag TYPE c, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping. + + DATA: default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, + default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data, + <fs_range_merge> LIKE LINE OF t_range_merge. + DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. + FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. + DATA: row_dimensions TYPE zexcel_t_worksheet_rowdimensio. + FIELD-SYMBOLS: <row_dimension> LIKE LINE OF row_dimensions. + DATA: outline_level_row TYPE i VALUE 0, + outline_level_col TYPE i VALUE 0. + DATA: col_count TYPE int4. + DATA: row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: write_current_row TYPE boolean. +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:mc' + value = lc_xml_node_comp_ns ). + lo_element_root->set_attribute_ns( name = 'mc:Ignorable' + value = lc_xml_node_comp_pref ). + lo_element_root->set_attribute_ns( name = 'xmlns:x14ac' + value = lc_xml_node_ig_ns ). + + +********************************************************************** +* STEP 4: Create subnodes + " sheetPr + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetpr + parent = lo_document ). + " TODO tabColor + + " outlinePr + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_outlinepr + parent = lo_document ). + " TODO read attribute summaryBelow and set the attribute to 0 + lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow + value = '1' ). + " TODO read attribute summaryRight and set the attribute to 0 + lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright + value = '1' ). + + lo_element->append_child( lo_element_2 ). + " TODO pageSetUpPr + + lo_element_root->append_child( lo_element ). + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF iv_active EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + " showGridLines attribute + lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines + value = 'true' ). + " showRowColHeaders attribute + lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders + value = '1' ). + + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( lo_element_3 ). " sheetView node + + lo_element->append_child( lo_element_2 ). " sheetView node + + lo_element_root->append_child( lo_element ). " sheetViews node + + + column_dimensions[] = io_worksheet->get_column_dimensions( ). + row_dimensions[] = io_worksheet->get_row_dimensions( ). + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + " defaultRowHeight + default_row_dimension = io_worksheet->get_default_row_dimension( ). + IF default_row_dimension IS BOUND. + IF default_row_dimension->get_row_height( ) >= 0. + lo_element->set_attribute_ns( name = lc_xml_attr_customheight + value = lc_xml_attr_true ). + lv_value = default_row_dimension->get_row_height( ). + ELSE. + lv_value = '12.75'. + ENDIF. + ELSE. + lv_value = '12.75'. + ENDIF. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + " defaultColWidth + default_col_dimension = io_worksheet->get_default_column_dimension( ). + IF default_col_dimension IS BOUND. + IF default_col_dimension->get_width( ) >= 0. + lv_value = default_col_dimension->get_width( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultcolwidth + value = lv_value ). + ENDIF. + ENDIF. + " outlineLevelRow + LOOP AT row_dimensions ASSIGNING <row_dimension>. + IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. + outline_level_row = <row_dimension>-row_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_row. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelrow + value = lv_value ). + " outlineLevelCol + LOOP AT column_dimensions ASSIGNING <column_dimension>. + IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. + outline_level_col = <column_dimension>-column_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_col. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelcol + value = lv_value ). + + lo_element_root->append_child( lo_element ). " sheetFormatPr node + " cols node + IF NOT column_dimensions IS INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_cols + parent = lo_document ). + LOOP AT column_dimensions ASSIGNING <column_dimension>. + " col node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = <column_dimension>-column_dimension->get_column_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min + value = lv_value ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + " Width + IF <column_dimension>-column_dimension->get_width( ) < 0. + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + ELSE. + lv_value = <column_dimension>-column_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lv_value ). + ENDIF. + " Column visibility + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = lc_xml_attr_true ). + ENDIF. + " Auto size? + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit + value = lc_xml_attr_true ). + ENDIF. + " Custom width? + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + + ENDIF. + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + ENDIF. + " Collapsed + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed + value = lc_xml_attr_true ). + ENDIF. + " outlineLevel + IF <column_dimension>-column_dimension->get_outline_level( ) > 0. + lv_value = <column_dimension>-column_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel + value = lv_value ). + ENDIF. + " Style + lv_value = <column_dimension>-column_dimension->get_xf_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + + lo_element->append_child( lo_element_2 ). " col node + ENDLOOP. + ENDIF. + lo_element_root->append_child( lo_element ). " cols node + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + " Get column count + col_count = io_worksheet->get_highest_column( ). + + LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. + CLEAR ls_style_mapping. + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + " Add new row + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + " r + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + " Spans + lv_value = col_count. + CONCATENATE '1:' lv_value INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = lv_value ). + row_dimension = io_worksheet->get_row_dimension( <ls_sheet_content>-cell_row ). + " Do we need the row dimension attributes? + IF row_dimension->get_row_height( ) >= 0 OR + row_dimension->get_visible( ) = abap_false OR + row_dimension->get_collapsed( ) = abap_true OR + row_dimension->get_outline_level( ) > 0 OR + row_dimension->get_xf_index( ) <> 0. + " Row dimensions + IF row_dimension->get_row_height( ) >= 0. + lo_element_2->set_attribute_ns( name = 'customHeight' value = '1'). + lv_value = row_dimension->get_row_height( ). + lo_element_2->set_attribute_ns( name = 'ht' value = lv_value ). + ENDIF. + " Row visibility + IF row_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). + ENDIF. + " Collapsed + IF row_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = 'collapsed' value = 'true'). + ENDIF. + " Outline level + IF row_dimension->get_outline_level( ) > 0. + lv_value = row_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = 'outlineLevel' value = lv_value ). + ENDIF. + " Style + IF row_dimension->get_xf_index( ) <> 0. + lv_value = row_dimension->get_xf_index( ). + lo_element_2->set_attribute_ns( name = 's' value = lv_value ). + lo_element_2->set_attribute_ns( name = 'customFormat' value = '1'). + ENDIF. + ENDIF. + ENDIF. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + + " For cells with formula ignore the value - Excel will calculate it + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + lo_element_4->set_value( lv_value ). + lo_element_3->append_child( lo_element_4 ). " fomula node + ELSE. + IF <ls_sheet_content>-data_type IS NOT INITIAL. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = <ls_sheet_content>-data_type ). + ENDIF. + + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF <ls_sheet_content>-data_type EQ 's'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + lo_element_4->set_value( lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + lo_element_4->set_value( lv_value ). + ENDIF. + + lo_element_3->append_child( lo_element_4 ). " value node + ENDIF. + + lo_element_2->append_child( lo_element_3 ). " column node + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + lo_element->append_child( lo_element_2 ). " row node + ls_last_row = <ls_sheet_content>. + ENDIF. + + ENDLOOP. + lo_element_root->append_child( lo_element ). " sheetData node + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_iconset. + CLEAR lt_percent_val. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF lo_style_conditional->iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = lo_style_conditional->iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + CASE lo_style_conditional->iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + APPEND '0' TO lt_percent_val. + APPEND '33' TO lt_percent_val. + APPEND '67' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + APPEND '0' TO lt_percent_val. + APPEND '25' TO lt_percent_val. + APPEND '50' TO lt_percent_val. + APPEND '75' TO lt_percent_val. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + APPEND '0' TO lt_percent_val. + APPEND '20' TO lt_percent_val. + APPEND '40' TO lt_percent_val. + APPEND '60' TO lt_percent_val. + APPEND '80' TO lt_percent_val. + WHEN OTHERS. + CLEAR lt_percent_val. + ENDCASE. + + LOOP AT lt_percent_val INTO ls_percent_val. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = 'percent' ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_percent_val ). + lo_element_3->append_child( lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = '0' ). " @TODO <***************************** + lv_value = lo_style_conditional->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = lo_style_conditional->formula. + lo_element_3->set_value( lv_value ). + lo_element_2->append_child( lo_element_3 ). " formula node + + ENDCASE. + + lo_element->append_child( lo_element_2 ). " cfRule node + + lo_element_root->append_child( lo_element ). " Conditional formatting node + ENDWHILE. + + + IF io_worksheet->get_data_validations_size( ) GT 0. + " dataValidations node + lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations + parent = lo_document ). + " Conditional formatting node + lo_iterator = io_worksheet->get_data_validations_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_data_validation ?= lo_iterator->get_next( ). + " dataValidation node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation + parent = lo_document ). + lv_value = lo_data_validation->type. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + IF lo_data_validation->allowblank EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank + value = lv_value ). + IF lo_data_validation->showinputmessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage + value = lv_value ). + IF lo_data_validation->showerrormessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage + value = lv_value ). + lv_cell_row_s = lo_data_validation->cell_row. + SHIFT lv_cell_row_s RIGHT DELETING TRAILING space. + SHIFT lv_cell_row_s LEFT DELETING LEADING space. + CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + " formula1 node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 + parent = lo_document ). + lv_value = lo_data_validation->value. + lo_element_3->set_value( lv_value ). + + lo_element_2->append_child( lo_element_3 ). " formula1 node + + lo_element->append_child( lo_element_2 ). " dataValidation node + ENDWHILE. + lo_element_root->append_child( lo_element ). " dataValidations node + ENDIF. + + t_range_merge = io_worksheet->get_merge( ). + IF t_range_merge IS NOT INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_mergecells + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + LOOP AT t_range_merge ASSIGNING <fs_range_merge>. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_mergecell + parent = lo_document ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_ref + value = <fs_range_merge> ). + lo_element->append_child( lo_element_2 ). + lo_element_root->append_child( lo_element ). + io_worksheet->delete_merge( ). + ENDLOOP. + ENDIF. + + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = '0.7' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = '0.75' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = '0.3' ). " @TODO <***************************** + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = '0.3' ). " @TODO <***************************** + lo_element_root->append_child( lo_element ). " sheetFormatPr node + +* tables + DATA lv_table_count TYPE i. + + lv_table_count = io_worksheet->get_tables_size( ). + IF lv_table_count > 0. + lo_element = lo_document->create_simple_element( name = 'tableParts' + parent = lo_document ). + lv_value = lv_table_count. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lv_table_count = 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_iterator->get_next( ). + add 1 to lv_table_count. + + lv_value = lv_table_count. + condense lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element_2 = lo_document->create_simple_element( name = 'tablePart' + parent = lo_element ). + lo_element_2->set_attribute_ns( name = 'r:id' + value = lv_value ). + lo_element->append_child( lo_element_2 ). + + ENDWHILE. + + lo_element_root->append_child( lo_element ). + + ENDIF. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + method CREATE_XL_SHEET_RELS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_value TYPE string, + lv_counter TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Add sheet Relationship nodes here + lv_counter = 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_table ?= lo_iterator->get_next( ). + ADD 1 TO lv_counter. + + lv_value = lv_counter. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_table_tp ). + + lv_value = lo_table->get_name( ). + CONCATENATE '../tables/' lv_value '.xml' INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element_root->append_child( lo_element ). + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + METHOD create_xl_styles. + + +** Constant node name + CONSTANTS: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " numfmt + lc_xml_node_numfmts TYPE string VALUE 'numFmts', + lc_xml_node_numfmt TYPE string VALUE 'numFmt', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + lc_xml_node_alignment TYPE string VALUE 'alignment', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + lc_xml_attr_applyalignment TYPE string VALUE 'applyAlignment', + lc_xml_attr_horizontal TYPE string VALUE 'horizontal', + lc_xml_attr_formatcode TYPE string VALUE 'formatCode', + lc_xml_attr_vertical TYPE string VALUE 'vertical', + lc_xml_attr_wraptext TYPE string VALUE 'wrapText', + lc_xml_attr_textrotation TYPE string VALUE 'textRotation', + lc_xml_attr_shrinktofit TYPE string VALUE 'shrinkToFit', + lc_xml_attr_indent TYPE string VALUE 'indent', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + CONSTANTS: lc_on TYPE string VALUE '1', + lc_off TYPE string VALUE '0'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_numfmts TYPE REF TO if_ixml_element, + lo_element_numfmt TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + lt_numfmts TYPE zexcel_t_style_numfmt, + ls_numfmt TYPE zexcel_s_style_numfmt, + lt_alignments TYPE zexcel_t_style_alignment, + ls_alignment TYPE zexcel_s_style_alignment, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + lt_colors TYPE TABLE OF zexcel_style_color_argb, + ls_color TYPE zexcel_style_color_argb. + + DATA: lv_value TYPE string, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i, + lv_align_flag TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + + lo_element_numfmts = lo_document->create_simple_element( name = lc_xml_node_numfmts + parent = lo_document ). + + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) EQ abap_true. + lo_style ?= lo_iterator->get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_alignment = lo_style->alignment->get_structure( ). + ls_numfmt = lo_style->number_format->get_structure( ). + + CLEAR ls_cellxfs. + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress alignment + READ TABLE lt_alignments FROM ls_alignment TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-alignmentid = sy-tabix. + ELSE. + APPEND ls_alignment TO lt_alignments. + DESCRIBE TABLE lt_alignments LINES ls_cellxfs-alignmentid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + +* Compress number formats + IF ls_numfmt IS NOT INITIAL. + READ TABLE lt_numfmts FROM ls_numfmt TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-numfmtid = sy-tabix. + ELSE. + APPEND ls_numfmt TO lt_numfmts. + DESCRIBE TABLE lt_numfmts LINES ls_cellxfs-numfmtid. + ENDIF. + ADD zcl_excel_common=>c_excel_numfmt_offset TO ls_cellxfs-numfmtid. " Add OXML offset for custom styles + ls_cellxfs-applynumberformat = 1. + ELSE. + ls_cellxfs-applynumberformat = 0. + ENDIF. + + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-alignmentid NE 0. + ls_cellxfs-applyalignment = 1. + ELSE. + ls_cellxfs-applyalignment = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create numfmt elements + LOOP AT lt_numfmts INTO ls_numfmt. + lo_element_numfmt = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_document ). + lv_value = sy-tabix + zcl_excel_common=>c_excel_numfmt_offset. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + lv_value = ls_numfmt-numfmt. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_formatcode + value = lv_value ). + lo_element_numfmts->append_child( lo_element_numfmt ). + ENDLOOP. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "color + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_font-color. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + "scheme + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( lo_sub_element ). + lo_element_fonts->append_child( lo_element_font ). + APPEND ls_font-color TO lt_colors. + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + IF ls_fill-fgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_fgcolor + parent = lo_document ). + lv_value = ls_fill-fgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." fgcolor + ENDIF. + " bgcolor + IF ls_fill-bgcolor IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_bgcolor + parent = lo_document ). + lv_value = ls_fill-bgcolor. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + + lo_sub_element->append_child( lo_sub_element_2 )." bgcolor + ENDIF. + + lo_element_fill->append_child( lo_sub_element )."pattern + lo_element_fills->append_child( lo_element_fill ). + " Collect color + IF ls_fill-fgcolor IS NOT INITIAL. + APPEND ls_fill-fgcolor TO lt_colors. + ENDIF. + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-left_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-left_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-left_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-right_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-right_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-right_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-top_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-top_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-top_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-bottom_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-bottom_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-bottom_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + IF ls_border-diagonal_color IS NOT INITIAL. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_border-diagonal_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color +* Collect color + APPEND ls_border-diagonal_color TO lt_colors. + ENDIF. + lo_element_border->append_child( lo_sub_element ). + lo_element_borders->append_child( lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( lo_element_numfmts ). + lo_element_root->append_child( lo_element_fonts ). + lo_element_root->append_child( lo_element_fills ). + lo_element_root->append_child( lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lc_off ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyalignment EQ 1. " depends on each style not for all the sheet + MOVE ls_cellxfs-applyalignment TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyalignment + value = lv_value ). + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_alignment + parent = lo_document ). + ADD 1 TO ls_cellxfs-alignmentid. "Table index starts from 1 + READ TABLE lt_alignments INTO ls_alignment INDEX ls_cellxfs-alignmentid. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + IF ls_alignment-horizontal IS NOT INITIAL. + MOVE ls_alignment-horizontal TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_horizontal + value = lv_value ). + ENDIF. + IF ls_alignment-vertical IS NOT INITIAL. + MOVE ls_alignment-vertical TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_vertical + value = lv_value ). + ENDIF. + IF ls_alignment-wraptext EQ abap_true. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_wraptext + value = lc_on ). + ENDIF. + IF ls_alignment-textrotation IS NOT INITIAL. + MOVE ls_alignment-textrotation TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_textrotation + value = lv_value ). + ENDIF. + IF ls_alignment-shrinktofit EQ abap_true. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_shrinktofit + value = lc_on ). + ENDIF. + IF ls_alignment-indent IS NOT INITIAL. + MOVE ls_alignment-indent TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indent + value = lv_value ). + ENDIF. + + lo_element->append_child( lo_sub_element_2 ). + ENDIF. + lo_element_cellxfs->append_child( lo_element ). + ENDLOOP. + + lo_element_root->append_child( lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lc_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = lc_off ). + + lo_element->append_child( lo_sub_element ). + lo_element_root->append_child( lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element_root->append_child( lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = zcl_excel_table=>builtinstyle_medium9 ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = zcl_excel_table=>builtinstyle_pivot_light16 ). + lo_element_root->append_child( lo_element ). + + " colors node + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + " mruColors node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_mrucolors + parent = lo_document ). + + SORT lt_colors. + DELETE ADJACENT DUPLICATES FROM lt_colors. + + LOOP AT lt_colors INTO ls_color. + " color node + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( lo_sub_element_2 )." color node + ENDLOOP. + + lo_element->append_child( lo_sub_element )." mruColors node + lo_element_root->append_child( lo_element )." colors node + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + METHOD create_xl_table. + + DATA: lc_xml_node_table TYPE string VALUE 'table', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_display_name TYPE string VALUE 'displayName', + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_totals TYPE string VALUE 'totalsRowShown', + " Node namespace + lc_xml_node_table_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + + lv_table_name TYPE string, + lv_id TYPE i, + lv_syindex TYPE char3, + lv_ref TYPE string, + lv_value TYPE string, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_num_columns TYPE i, + ls_fieldcat TYPE zexcel_s_fieldcatalog. + + +********************************************************************** +* STEP 1: Create xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node table + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table + parent = lo_document ). + + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_table_ns ). + + lv_id = io_table->get_id( ). + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + + lv_table_name = io_table->get_name( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_name + value = lv_table_name ). + + lo_element_root->set_attribute_ns( name = lc_xml_attr_display_name + value = lv_table_name ). + + lv_ref = io_table->get_reference( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_ref + value = lv_ref ). + IF io_table->has_totals( ) = abap_true. + lo_element_root->set_attribute_ns( name = 'totalsRowCount' + value = '1' ). + ELSE. + lo_element_root->set_attribute_ns( name = lc_xml_attr_totals + value = '0' ). + ENDIF. + +********************************************************************** +* STEP 4: Create subnodes + + " autoFilter + lo_element = lo_document->create_simple_element( name = 'autoFilter' + parent = lo_document ). + + lv_ref = io_table->get_reference( ip_include_totals_row = abap_false ). + lo_element->set_attribute_ns( name = 'ref' + value = lv_ref ). + + lo_element_root->append_child( lo_element ). + + "columns + lo_element = lo_document->create_simple_element( name = 'tableColumns' + parent = lo_document ). + +* lo_columns = io_table->get_columns( ). + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + ADD 1 TO lv_num_columns. + ENDLOOP. + + lv_value = lv_num_columns. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lo_element_root->append_child( lo_element ). + + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn' + parent = lo_element ). + + lv_value = ls_fieldcat-position. + SHIFT lv_value LEFT DELETING LEADING '0'. + lo_element2->set_attribute_ns( name = 'id' + value = lv_value ). + lv_value = ls_fieldcat-scrtext_m. + lo_element2->set_attribute_ns( name = 'name' + value = lv_value ). + + IF ls_fieldcat-totals_function IS NOT INITIAL. + lo_element2->set_attribute_ns( name = 'totalsRowFunction' + value = ls_fieldcat-totals_function ). + ENDIF. + + lo_element->append_child( lo_element2 ). + ENDLOOP. + + + lo_element = lo_document->create_simple_element( name = 'tableStyleInfo' + parent = lo_element_root ). + + lo_element->set_attribute_ns( name = 'name' + value = io_table->settings-table_style ). + + lo_element->set_attribute_ns( name = 'showFirstColumn' + value = '0' ). + + lo_element->set_attribute_ns( name = 'showLastColumn' + value = '0' ). + + IF io_table->settings-show_row_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showRowStripes' + value = lv_value ). + + IF io_table->settings-show_column_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showColumnStripes' + value = lv_value ). + + lo_element_root->append_child( lo_element ). +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + method CREATE_XL_THEME. + + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + +endmethod. + + + + method CREATE_XL_WORKBOOK. + + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( lo_element ). + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + lo_element->append_child( lo_sub_element )." bookview node + lo_element_root->append_child( lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->title. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( lo_sub_element ). " sheet node + ENDWHILE. + lo_element_root->append_child( lo_element )." sheets node + + + " ranges node + lo_element = lo_document->create_simple_element( name = lc_xml_node_definedNames + parent = lo_document ). + lo_iterator = excel->get_ranges_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedName + parent = lo_document ). + lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( lv_value ). + lo_element->append_child( lo_sub_element ). " range node + ENDWHILE. + lo_element_root->append_child( lo_element )." ranges node + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( lo_element ). + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +endmethod. + + + + + method FLAG2BOOL. + + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. +endmethod. + + + + + method GET_SHARED_STRING_INDEX. + + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value. + ep_index = ls_shared_string-string_no. + +endmethod. + + + + class ZCL_EXCEL_TABLE definition + public + final + create public . + +*"* public components of class ZCL_EXCEL_TABLE +*"* do not include other source files here!!! +public section. + type-pools ABAP . + + constants BUILTINSTYLE_DARK1 type ZEXCEL_TABLE_STYLE value 'TableStyleDark1'. "#EC NOTEXT + constants BUILTINSTYLE_DARK2 type ZEXCEL_TABLE_STYLE value 'TableStyleDark2'. "#EC NOTEXT + constants BUILTINSTYLE_DARK3 type ZEXCEL_TABLE_STYLE value 'TableStyleDark3'. "#EC NOTEXT + constants BUILTINSTYLE_DARK4 type ZEXCEL_TABLE_STYLE value 'TableStyleDark4'. "#EC NOTEXT + constants BUILTINSTYLE_DARK5 type ZEXCEL_TABLE_STYLE value 'TableStyleDark5'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT1 type ZEXCEL_TABLE_STYLE value 'TableStyleLight1'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT2 type ZEXCEL_TABLE_STYLE value 'TableStyleLight2'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT3 type ZEXCEL_TABLE_STYLE value 'TableStyleLight3'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT4 type ZEXCEL_TABLE_STYLE value 'TableStyleLight4'. "#EC NOTEXT + constants BUILTINSTYLE_LIGHT5 type ZEXCEL_TABLE_STYLE value 'TableStyleLight5'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM1 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium1'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM2 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium2'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM3 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium3'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM4 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium4'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM5 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium5'. "#EC NOTEXT + constants BUILTINSTYLE_MEDIUM9 type ZEXCEL_TABLE_STYLE value 'TableStyleMedium9'. "#EC NOTEXT + constants BUILTINSTYLE_PIVOT_LIGHT16 type ZEXCEL_TABLE_STYLE value 'PivotStyleLight16'. "#EC NOTEXT + data FIELDCAT type ZEXCEL_T_FIELDCATALOG . + data SETTINGS type ZEXCEL_S_TABLE_SETTINGS . + constants TOTALS_FUNCTION_AVERAGE type ZEXCEL_TABLE_TOTALS_FUNCTION value 'average'. "#EC NOTEXT + constants TOTALS_FUNCTION_COUNT type ZEXCEL_TABLE_TOTALS_FUNCTION value 'count'. "#EC NOTEXT + constants TOTALS_FUNCTION_MAX type ZEXCEL_TABLE_TOTALS_FUNCTION value 'max'. "#EC NOTEXT + constants TOTALS_FUNCTION_MIN type ZEXCEL_TABLE_TOTALS_FUNCTION value 'min'. "#EC NOTEXT + constants TOTALS_FUNCTION_SUM type ZEXCEL_TABLE_TOTALS_FUNCTION value 'sum'. "#EC NOTEXT + + methods GET_TOTALS_FORMULA + importing + !IP_COLUMN type CLIKE + !IP_FUNCTION type ZEXCEL_TABLE_TOTALS_FUNCTION + returning + value(EP_FORMULA) type STRING . + methods HAS_TOTALS + returning + value(EP_RESULT) type ABAP_BOOL . + methods SET_DATA + importing + !IR_DATA type STANDARD TABLE . + methods GET_ID + returning + value(OV_ID) type I . + methods SET_ID + importing + !IV_ID type I . + methods CONSTRUCTOR . + methods GET_NAME + returning + value(OV_NAME) type STRING . + methods GET_REFERENCE + importing + !IP_INCLUDE_TOTALS_ROW type ABAP_BOOL default ABAP_TRUE + returning + value(OV_REFERENCE) type STRING . + *"* protected components of class ZCL_EXCEL_TABLE +*"* do not include other source files here!!! +protected section. + *"* private components of class ZCL_EXCEL_TABLE +*"* do not include other source files here!!! +private section. + + data ID type I . + data NAME type STRING . + data TABLE_DATA type ref to DATA . + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + +endmethod. + + + + method GET_ID. + ov_id = id. +endmethod. + + + + method GET_NAME. + + IF me->name IS INITIAL. + me->name = zcl_excel_common=>number_to_excel_string( ip_value = me->id ). + CONCATENATE 'table' me->name INTO me->name. + ENDIF. + + ov_name = me->name. +endmethod. + + + + + method GET_REFERENCE. + DATA: lv_column TYPE zexcel_cell_column, + lv_table_lines TYPE i, + lv_right_column TYPE zexcel_cell_column_alpha, + ls_field_catalog TYPE zexcel_s_fieldcatalog, + lv_bottom_row TYPE zexcel_cell_row, + lv_top_row_string(10) TYPE c, + lv_bottom_row_string(10) TYPE c. + + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. + +*column + lv_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). + lv_table_lines = 0. + LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. + ADD 1 TO lv_table_lines. + ENDLOOP. + lv_column = lv_column + lv_table_lines - 1. + lv_right_column = zcl_excel_common=>convert_column2alpha( lv_column ). + +*row + ASSIGN table_data->* TO <fs_table>. + DESCRIBE TABLE <fs_table> LINES lv_table_lines. + lv_bottom_row = settings-top_left_row + lv_table_lines . + + IF me->has_totals( ) = abap_true AND ip_include_totals_row = abap_true. + add 1 to lv_bottom_row. + ENDIF. + + WRITE settings-top_left_row TO lv_top_row_string. + CONDENSE lv_top_row_string. + WRITE lv_bottom_row TO lv_bottom_row_string. + CONDENSE lv_bottom_row_string. + + CONCATENATE settings-top_left_column lv_top_row_string + ':' + lv_right_column lv_bottom_row_string INTO ov_reference. + +endmethod. + + + + + + method GET_TOTALS_FORMULA. + CONSTANTS: lc_function_id_sum TYPE string VALUE '109', + lc_function_id_min TYPE string VALUE '105', + lc_function_id_max TYPE string VALUE '104', + lc_function_id_count TYPE string VALUE '103', + lc_function_id_average TYPE string VALUE '101'. + + DATA: lv_function_id TYPE string. + + CASE ip_function. + WHEN zcl_excel_table=>totals_function_sum. + lv_function_id = lc_function_id_sum. + + WHEN zcl_excel_table=>totals_function_min. + lv_function_id = lc_function_id_min. + + WHEN zcl_excel_table=>totals_function_max. + lv_function_id = lc_function_id_max. + + WHEN zcl_excel_table=>totals_function_count. + lv_function_id = lc_function_id_count. + + WHEN zcl_excel_table=>totals_function_average. + lv_function_id = lc_function_id_average. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid totals formula. See ZCL_ for possible values'. + ENDCASE. + + CONCATENATE 'SUBTOTAL(' lv_function_id ',[' ip_column '])' INTO ep_formula. +endmethod. + + + + method HAS_TOTALS. + DATA: ls_field_catalog TYPE zexcel_s_fieldcatalog. + + ep_result = abap_false. + + LOOP AT fieldcat INTO ls_field_catalog. + IF ls_field_catalog-totals_function IS NOT INITIAL. + ep_result = abap_true. + EXIT. + ENDIF. + ENDLOOP. + +endmethod. + + + + method SET_DATA. + GET REFERENCE OF ir_data INTO me->table_data. +endmethod. + + + + method SET_ID. + id = iv_id. +endmethod. + + + diff --git a/nuggs/NUGG_ABAP2XLSX_V_3_0.nugg.zip b/nuggs/NUGG_ABAP2XLSX_V_3_0.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..0bbe9d7078bf8d4911bd8244d093bc32ee7b771d GIT binary patch literal 25444 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 m9Tg{lp<_odLMZUe`YlM + + diff --git a/test/OpenXMLValidator/Binaries/OpenXMLValidator.pdb b/test/OpenXMLValidator/Binaries/OpenXMLValidator.pdb new file mode 100644 index 0000000000000000000000000000000000000000..700501a2ae45ab43a05ea283019b5e941ff2f3cd GIT binary patch literal 17920 zcmeI3e{ht=8OQe$3?vxj5Kz?Wfk9F5@&k}x%8w)j&_u96jW!M($q^z+4(}2Qqn$Zh z$LZMqK^>eaEsk_rwXL*;N;^)gGdN=%Ydf_gYSsFOZ5^jNR2Us3jE#rC)E|L1eQtn$QpI`u5jpa0jE z820~)tLJ_3)U(Fv*P}yguAleR(0$P@%gx@U-z)g;lMAoi_U0SUMYqfg;=}K|>!#@1 zebL7+=bSif$>XaZ?418>%U9}uaiIG7JJJtr)3HHx+k$6S&e{F`t(ABFx~^;P)F*<} z{O`$bffF_URS)0u_Mw|A#_U}D*t(MYHa~E(_dDOdzyc>~{O3>j+D}Vj8{fF+>RTS1 zzU`ai^Y;C0S>SH>AmH({)%tvEKduFi>_4(!XZtShc}>mirj?mwI@8pZ>PW6{YDqPB zcO*NzGEE!XGTn*xSf;DHr7ab!s;I1JT9!`Tl58e#>4s!yV?+HH676j*iLO-o=!DNF zGpX)$b21aJO=j9!JCo^nbHJuZ|noe{KVqX|duVJ{GxSbAnF&SSaTnDB= z&COAon~sM1Kpszs1KxmrUXnxQ*yy^`X|_=|h@jj|dct3{z}MjOrUk!-BDoc)^#8Mul?7{BF9SW@&AFpIF7%kko1p)3j+<-N6mG9rcsqbteqUOMvJ7=X0;}} zR{4jEhD2wgHJO&6e6!|V8A2-S<(2+C@fhhba5SuX&cpWt3cJ04=b>cB2BmqwIWRv~ zRe%puJ=R}d>H6`clt9*yL6H8MqS=IPmikfC-QLxmPAYp~x_a-6URQzT$A4uah;7n3;gz_p#1g~p!{~!%wu2K2~T1|l-d15`hxL_4=<;z;+SsYnH+~R$BS`obR>ci4=Q~J-h7% zUxE+Aqsgp*7sD;^?eJE(FUcl;{qJ%4J3>NdF`m0gw^oIYR|^7^G{RYwm>e*S57MGo-0c(?FfgwBJ49`s~kT;WApJ@(aF9JF=RmF)AlW zdMt{3FFkFpjLLnqb1*9k>U$3M>-|Y7f@VpvBm8O6^{y?(87NstN6A;4A4PTx_@OyIqssYp4-V-hWsn!Z*cNz8%e$7lj(FS&A_U^JCUnLU^g;f4VBRx4!5m2 z)!o@en##O}++xbyPW(rqG8&C=8LNjhzfXiw^~f&Ypq?^hZUSWw%@6skUiF0P7?}SL z&gNR5(kZ_aqw-)aM$8W4BF@Fu7buKRv3>`iWqqH{x|C;Km@IQf&+qoEr?c-w;unIP zYwej>zHvP9>EOlSJdi$R7lQcD>;t zZ*zD*$evC6<}nee87j4YI8J;Ttd=QlVlG~4RuR9D_*|Pm%H2dn%?jdE&^MKxA)ebC zve+q@_mSMXp|7S(g9FV#zs5&rb1eq>X`U-+k;z^JE&$cCYOo5d1@Zs(%zPcVi1_s& zdrvdKYeX_?}Duu}7Ca-r*A- zU4GJG!lmEq;#&6v&C3qI?9y2SHhqkXFLC&?L*SSc8IsHH3FVT4z=Uv|K8NXe^_vf^ zHC)SwhePe_S16SKku_;O4K~F-p@JAYWtfg@@33$vtmiD9y~|+s6ML@5Uz*i$JG=?L z6W#)EhkpR?f%n4ltvV;a4xjFHp&6kq&gdM$3&5oflUFV5>`HH5wJg=9!w`2*HeZvm zz+C{3HJ63bDz4O(X$6~!m)&J$g9}(M8>Bhe7M(eQdZ#cQ3c?qLl=WqTJXa>!Q@`30 z>8C9b<7C-pCb;^yTG{?D3cQ{`#+7A5_ibykKBxD?xi1ssxiTDBe3_?hncffCzD$tk z%1l!~0~<`k1`*TquWH9#9|Mw>D;GbzOCJRZX?I;+OGvBlf1b=iLf7 z6G7$tMof#n*XGFKDB}a zkR|Ex6fqm@bD@6+AF(HIFBiOD9PflR4xS<=ZSSdexP$`J;j`>`>2Ai~XS$)Z`30O5 z^=?#F(7aVh-z#cw68SV?p>AK1D}eP+_bsA7!h`hPRG;~y@23VyQ*LGS`k-!*l!ZPA z!*>3AK{pICX+Sc1KqYn{g0Roc<4J0PWBvaxy)!E3<<0sfooiF3yfe|ktCI3ey19H^ zGSQMuuW3&;uMZOJYn1ZlPxFgT+mJ!k+s`MLgReC7ZKV8o39Pj?*ZDX-cq{$eus@vY z{5}DeZ;dyxP|-!xYq4z1UMhLGhun# z7_4ON6}nH?UAZ=1-PM%BYM(+RS`_!Cr5zM9Xb1^x$Px^{5@ literal 0 HcmV?d00001 diff --git a/test/OpenXMLValidator/src/CommandLineArgs.cs b/test/OpenXMLValidator/src/CommandLineArgs.cs new file mode 100644 index 0000000..49c7dd8 --- /dev/null +++ b/test/OpenXMLValidator/src/CommandLineArgs.cs @@ -0,0 +1,77 @@ +namespace Abap2Xlsx.OpenXMLValidator +{ + using System; + using System.IO; + + ///

+ /// Command line arguments for validator + /// + public class CommandLineArgs + { + + private const string DefaultDirectory = "."; + private const string DefaultSearchPattern = "*.xlsx"; + + public string Directory { get; private set; } + public string SearchPattern { get; private set; } + public bool ShowUsage { get; private set; } + + public CommandLineArgs() + { + this.Directory = DefaultDirectory; + this.SearchPattern = DefaultSearchPattern; + } + + public void Parse(string[] args) + { + for (int currentArg = 0; currentArg < args.Length; currentArg++) + { + string arg = args[currentArg]; + + switch (arg) + { + case "-d": + case "/d": + string dir = GetNextArg(args, currentArg); + + DirectoryInfo di = new DirectoryInfo(dir); + if (!di.Exists) + { + throw new ArgumentException(string.Format("Unknown directory: {0}", dir)); + } + + this.Directory = dir; + currentArg++; + + break; + + case "-p": + case "/p": + this.SearchPattern = GetNextArg(args, currentArg); + currentArg++; + + break; + + case "-?": + case "/?": + this.ShowUsage = true; + + break; + + default: + throw new ArgumentException(string.Format("Unknown argument: {0}", arg)); + } + } + } + + private string GetNextArg(string[] args, int currentArg) + { + if (currentArg >= args.Length - 1) + { + throw new ArgumentException(string.Format("Missing value for argument: {0}", args[currentArg])); + } + + return args[currentArg + 1]; + } + } +} diff --git a/test/OpenXMLValidator/src/OpenXMLValidator.csproj b/test/OpenXMLValidator/src/OpenXMLValidator.csproj new file mode 100644 index 0000000..9c9eab7 --- /dev/null +++ b/test/OpenXMLValidator/src/OpenXMLValidator.csproj @@ -0,0 +1,74 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {99967614-17D7-4521-BE36-1540B6D5CD89} + Exe + Properties + OpenXMLValidator + OpenXMLValidator + v3.5 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + \ No newline at end of file diff --git a/test/OpenXMLValidator/src/Program.cs b/test/OpenXMLValidator/src/Program.cs new file mode 100644 index 0000000..f4d3e7a --- /dev/null +++ b/test/OpenXMLValidator/src/Program.cs @@ -0,0 +1,101 @@ +namespace Abap2Xlsx.OpenXMLValidator +{ + using System; + using System.Linq; + using System.IO; + using DocumentFormat.OpenXml.Packaging; + using DocumentFormat.OpenXml.Validation; + + /// + /// Simple command line wrapper around OpenXMLValidator. + /// See CommandLineArgs for possible options. + /// + class Program + { + /// + /// Entry point + /// + /// The arguments + static void Main(string[] args) + { + CommandLineArgs arguments = new CommandLineArgs(); + try + { + arguments.Parse(args); + } + catch (ArgumentException e) + { + Console.WriteLine(e.Message); + Console.WriteLine(Resources.Usage); + Environment.Exit(1); + } + + if (arguments.ShowUsage) + { + Console.WriteLine(Resources.Usage); + Environment.Exit(0); + } + + string[] files = Directory.GetFiles(arguments.Directory, arguments.SearchPattern); + if (!files.Any()) + { + Console.WriteLine("No matching files found"); + Environment.Exit(1); + } + + for (int i = 1; i <= files.Length; i++) + { + Console.WriteLine("Validating file {0} from {1}", i, files.Length); + ValidateFile(files[i - 1]); + } + } + + private static void ValidateFile(string file) + { + ConsoleColor color = Console.ForegroundColor; + + try + { + Console.WriteLine("File name: {0}", file); + + OpenXmlValidator validator = new OpenXmlValidator(); + + using (var doc = SpreadsheetDocument.Open(file, true)) + { + var errors = validator.Validate(doc); + if (errors.Any()) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Found {0} validation errors: ", errors.Count()); + + int count = 0; + foreach (ValidationErrorInfo error in errors) + { + count++; + Console.WriteLine("Error " + count); + Console.WriteLine("Part: " + error.Part.Uri); + Console.WriteLine("Description: " + error.Description); + Console.WriteLine("Path: " + error.Path.XPath); + } + } + else + { + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("Document valid"); + } + + Console.WriteLine(); + } + } + catch (Exception e) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Exception occured while validating file: {0} - {1}",e.GetType().ToString() ,e.Message); + } + finally + { + Console.ForegroundColor = color; + } + } + } +} diff --git a/test/OpenXMLValidator/src/Properties/AssemblyInfo.cs b/test/OpenXMLValidator/src/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8541f65 --- /dev/null +++ b/test/OpenXMLValidator/src/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenXMLValidator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenXMLValidator")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ab032f8b-6f76-4bfc-8f1c-3a96d328f670")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/test/OpenXMLValidator/src/Resources.Designer.cs b/test/OpenXMLValidator/src/Resources.Designer.cs new file mode 100644 index 0000000..7c39cac --- /dev/null +++ b/test/OpenXMLValidator/src/Resources.Designer.cs @@ -0,0 +1,89 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Abap2Xlsx.OpenXMLValidator +{ + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenXMLValidator.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to USAGE: + /// OpenXMLValidator.exe [-d direcory] [-p pattern] + /// + ///OPTIONS: + /// -d + /// Directory with files for validation (default value if not specified - current directory) + /// -p + /// Search pattern used for finding files. * and ? allowed as wildcards (default value if not specified - *.xlsx) + /// -? + /// Show this help + /// + ///EXAMPLES: + /// OpenXMLValidator.exe + /// validate all xlsx files in current directory + /// OpenXMLValidator.exe -d c:\temp + /// validate all xlsx files in c:\temp directory + /// OpenXMLValidator.exe -d c:\ [rest of string was truncated]";. + /// + internal static string Usage { + get { + return ResourceManager.GetString("Usage", resourceCulture); + } + } + } +} diff --git a/test/OpenXMLValidator/src/Resources.resx b/test/OpenXMLValidator/src/Resources.resx new file mode 100644 index 0000000..7b3ec18 --- /dev/null +++ b/test/OpenXMLValidator/src/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Resources\usage.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;windows-1250 + + \ No newline at end of file diff --git a/test/OpenXMLValidator/src/Resources/usage.txt b/test/OpenXMLValidator/src/Resources/usage.txt new file mode 100644 index 0000000..7a3b24c --- /dev/null +++ b/test/OpenXMLValidator/src/Resources/usage.txt @@ -0,0 +1,18 @@ +USAGE: + OpenXMLValidator.exe [-d direcory] [-p pattern] + +OPTIONS: + -d + Directory with files for validation (default value if not specified - current directory) + -p + Search pattern used for finding files. * and ? allowed as wildcards (default value if not specified - *.xlsx) + -? + Show this help + +EXAMPLES: + OpenXMLValidator.exe + validate all xlsx files in current directory + OpenXMLValidator.exe -d c:\temp + validate all xlsx files in c:\temp directory + OpenXMLValidator.exe -d c:\temp -p demo*.xlsx + validate all xlsx files in c:\temp directory starting with 'demo' \ No newline at end of file diff --git a/test/OpenXMLValidator/src/app.config b/test/OpenXMLValidator/src/app.config new file mode 100644 index 0000000..809fa1f --- /dev/null +++ b/test/OpenXMLValidator/src/app.config @@ -0,0 +1,3 @@ + + + diff --git a/test/OpenXMLValidator/src/readme.txt b/test/OpenXMLValidator/src/readme.txt new file mode 100644 index 0000000..ea70c99 --- /dev/null +++ b/test/OpenXMLValidator/src/readme.txt @@ -0,0 +1,2 @@ +To build and run you need .Net 3.5 and OpenXMl SDK installed. +It can be downloaded from http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en \ No newline at end of file