mriconvert/0002755000175000000620000000000012545107531012261 5ustar stevestaffmriconvert/NiftiOptionsDlg.h0000640000175000000620000000134112542632322015475 0ustar stevestaff/// NiftiOptionsDlg.h /** */ #ifndef NIFTI_OPTIONS_DLG_H_ #define NIFTI_OPTIONS_DLG_H_ #include "BasicOptionsDlg.h" namespace jcs { class NiftiOutputterBase; class NiftiOptionsDlg : public BasicOptionsDlg { public: NiftiOptionsDlg(NiftiOutputterBase* outputter); void OnOkay(wxCommandEvent& event); bool NeedsRebuild() const { return mNeedsRebuild; } bool SaveNii() const { return mpNiiCheck->GetValue(); } protected: DECLARE_EVENT_TABLE() private: wxCheckBox* mpNiiCheck; wxCheckBox* mpSaveUint16Check; bool mNeedsRebuild; bool mSaveNii; bool mSplit; int mDim; int mSkip; NiftiOutputterBase* mOutputter; }; } #endif mriconvert/NumarisDictionary.h0000640000175000000620000005276112542632320016077 0ustar stevestaff/** \file NumarisDictionary.h These are proprietary Numaris tags. */ // Identifying group mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0000 ), "GROUP_LENGTH", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0010 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0012 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0013 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1010 ), "COMMENTS", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1015 ), "UNIQUE_IDENTIFIER", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1040 ), "DATA_OBJECT_TYPE", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1041 ), "DATA_OBJECT_SUBTYPE", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1210 ), "STORAGE_MODE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1212 ), "EVALUATION_MASK_IMAGE", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1226 ), "TABLE_ZERO_DATE", "DA" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1227 ), "TABLE_ZERO_TIME", "TM" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1316 ), "CPU_IDENTIFICATION_LABEL", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1320 ), "HEADER_VERSION", "SH" )); // Patient group mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x0000 ), "GROUP_LENGTH", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x0010 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x0011 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x1010 ), "ORGAN", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x1110 ), "REGISTRATION_DATE", "DA" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x1111 ), "REGISTRATION_TIME", "TM" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x1123 ), "USED_PATIENT_WEIGHT", "DS" )); // Acquisition group mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0000 ), "GROUP_LENGTH", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0010 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0012 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0014 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0015 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1010 ), "NET_FREQUENCY", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1020 ), "MEASUREMENT_MODE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1030 ), "CALCULATION_MODE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1050 ), "NOISE_LEVEL", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1060 ), "NUMBER_OF_DATABYTES", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1070 ), "AC_SCALE_VECTOR", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1080 ), "AC_ELEMENT_CONNECTED", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1210 ), "TOTAL_MEASUREMENT_TIME_NOM", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1211 ), "TOTAL_MEASUREMENT_TIME_CUR", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1212 ), "START_DELAY_TIME", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1213 ), "DWELL_TIME", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1214 ), "NUMBER_OF_PHASES", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1216 ), "SEQUENCE_CONTROL_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1218 ), "MEASUREMENT_STATUS_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1220 ), "FOURIER_LINES_NOM", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1221 ), "FOURIER_LINES_CUR", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1226 ), "FOURIER_LINES_AFTER_ZERO", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1228 ), "FIRST_FOURIER_LINE", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1230 ), "ACQUISITION_COLUMNS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1231 ), "RECONSTRUCTION_COLUMNS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1240 ), "AC_ELEMENT_NUMBER", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1241 ), "AC_ELEMENT_SELECT_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1242 ), "AC_ELEMENT_DATA_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1243 ), "AC_ELEMENT_TO_ADC_CONNECT", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1245 ), "AC_ADC_PAIR_NUMBER", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1246 ), "AC_COMBINATION_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1250 ), "NUMBER_OF_AVERAGES", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1260 ), "FLIP_ANGLE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1270 ), "NUMBER_OF_PRESCANS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1281 ), "RAW_DATA_FILTER_TYPE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1283 ), "IMAGE_DATA_FILTER_TYPE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1285 ), "PHASE_CORRECTION_FILTER_TYPE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1287 ), "NORMALIZATION_FILTER_TYPE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1290 ), "SATURATION_REGIONS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1294 ), "IMAGE_ROTATION_ANGLE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1296 ), "COIL_ID_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1297 ), "COIL_CLASS_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1298 ), "COIL_POSITION", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1412 ), "MAGNETIC_FIELD_STRENGTH", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1414 ), "ADC_VOLTAGE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1416 ), "ADC_OFFSET", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1420 ), "TRANSMITTER_AMPLITUDE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1421 ), "NUMBER_OF_TRANS_AMPS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1424 ), "TRANSMITTER_CALIBRATION", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1451 ), "RECEIVER_AMPLIFIER_GAIN", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1452 ), "RECEIVER_PREAMP_GAIN", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1470 ), "PHASE_GRADIENT_AMPLITUDE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1471 ), "READOUT_GRADIENT_AMPLITUDE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1472 ), "SELECTION_GRADIENT_AMPLITUDE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1480 ), "GRADIENT_DELAY_TIME", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1482 ), "TOTAL_GRADIENT_DELAY_TIME", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1490 ), "SENSITIVITY_CORRECTION_LABEL", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14a0 ), "RF_WATCHDOG_MASK", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14a2 ), "RF_POWER_ERROR_INDICATOR", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14a5 ), "SPECIFIC_ABSORPTION_RATE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14a6 ), "SPECIFIC_ENERGY_DOSE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14b0 ), "ADJUSTMENT_STATUS_MASK", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d1 ), "FLOW_SENSITIVITY", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d2 ), "CALCULATION_SUBMODE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d3 ), "FIELD_OF_VIEW_RATIO", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d4 ), "BASE_RAW_MATRIX_SIZE", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d5 ), "2D_PHASE_OVERSAMPLING_LINES", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d6 ), "2D_PHASE_OVERSAMPLING_PART", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d7 ), "ECHO_LINE_POSITION", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d8 ), "ECHO_COLUMN_POSITION", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14d9 ), "LINES_PER_SEGMENT", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x14da ), "PHASE_CODING_DIRECTION", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1510 ), "PARAMETER_FILE_NAME", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1511 ), "SEQUENCE_FILE_NAME", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1512 ), "SEQUENCE_FILE_OWNER", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1513 ), "SEQUENCE_DESCRIPTION", "LO" )); // Relationship group mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0000 ), "GROUP_LENGTH", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0010 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0011 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0013 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0023 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1010 ), "ZOOM", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1011 ), "TARGET", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1020 ), "ROI_MASK", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1120 ), "FIELD_OF_VIEW", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1122 ), "IMAGE_MAGNIFICATION_FACTOR", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1124 ), "IMAGE_SCROLL_OFFSET", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1126 ), "IMAGE_PIXEL_OFFSET", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1130 ), "VIEW_DIRECTION", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1132 ), "REST_DIRECTION", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1160 ), "IMAGE_POSITION", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1161 ), "IMAGE_NORMAL", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1163 ), "IMAGE_DISTANCE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1165 ), "IMAGE_POSITIONING_HISTORY_MASK", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x116a ), "IMAGE_ROW", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x116b ), "IMAGE_COLUMN", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1170 ), "PATIENT_ORIENTATION_SET_1", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1171 ), "PATIENT_ORIENTATION_SET_2", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1182 ), "STUDY_TYPE", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1320 ), "PHASE_COR_ROW_SEQ", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1321 ), "PHASE_COR_COL_SEQ", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1322 ), "PHASE_CORRECTION_ROWS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1324 ), "PHASE_CORRECTION_COLUMNS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1330 ), "3D_RAW_PARTITIONS_NOMINAL", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1331 ), "3D_RAW_PARTITIONS_CURRENT", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1334 ), "IMAGE_PARTITIONS", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1336 ), "PARTITION_NUMBER", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1339 ), "SLAB_THICKNESS", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1340 ), "NUMBER_OF_SLICES_NOMINAL", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1341 ), "NUMBER_OF_SLICES_CURRENT", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1342 ), "CURRENT_SLICE_NUMBER", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1343 ), "CURRENT_GROUP_NUMBER", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1344 ), "CURRENT_SLICE_DISTANCE_FACTOR", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x134f ), "ORDER_OF_SLICES", "ST" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1350 ), "SIGNAL_MASK", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1356 ), "EFFECTIVE_REPETITION_TIME", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1370 ), "NUMBER_OF_ECHOES", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2300 ), "SEQUENCE_TYPE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2301 ), "VECTOR_SIZE_ORIGINAL", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2302 ), "VECTOR_SIZE_EXTENDED", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2303 ), "ACQUIRED_SPECTRAL_RANGE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2304 ), "VOI_POSITION", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2305 ), "VOI_SIZE", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2306 ), "CSI_MATRIX_SIZE_ORIGINAL", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2307 ), "CSI_MATRIX_SIZE_EXTENDED", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2308 ), "SPATIAL_GRID_SHIFT", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2309 ), "SIGNAL_LIMITS_MINIMUM", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2310 ), "SIGNAL_LIMITS_MAXIMUM", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2311 ), "SPECTROSCOPY_INFO_MASK", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2330 ), "AC_ADC_OFFSET", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x2331 ), "AC_PREAMPLIFIER_GAIN", "DS" )); // Image presentation group mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0000 ), "GROUP_LENGTH", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0010 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0011 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0012 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1010 ), "CSAImageHeader", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1110 ), "WINDOW_STYLE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1010 ), "CSASeriesHeader", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1120 ), "PIXEL_QUALITY_CODE", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1152 ), "SORT_CODE", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1131 ), "PMTF_INFORMATION_1", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1132 ), "PMTF_INFORMATION_2", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1133 ), "PMTF_INFORMATION_3", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1134 ), "PMTF_INFORMATION_4", "CS" )); // Device group mAddEntry ( DicomElement ( DicomTag ( 0x0051, 0x0000 ), "GROUP_LENGTH", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0051, 0x0010 ), "PRIVATE_CREATOR", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0051, 0x1010 ), "IMAGE_TEXT", "LO" )); /** https://groups.google.com/forum/?hl=en&fromgroups=#!searchin/comp.protocols.dicom/siemens$20csa$20header/comp.protocols.dicom/c7OC15FXKGA/gwjt_nJbmncJ "AbsTablePosition", "AcquisitionMatrixText", "AcqusitionMatrix", "Actual3DImaPartNumber", "AutoAlignMatrix", "B_value", "CoilForGradient", "CoilId", "CoilString", "CoilTuningReflection", "Columns", "Comp_AdjustedParam", "Comp_Algorithm", "Comp_AutoParam", "Comp_Blended", "Comp_JobID", "Comp_ManualAdjusted", "CsiGridshiftVector", "DataFile", "DataFileName", "DiffusionDirectionality", "DiffusionGradientDirection", "EchoColumnPosition", "EchoLinePosition", "EchoNumbers", "EchoPartitionPosition", "EchoTime", "EchoTrainLength", "FMRIStimulInfo", "Filter1", "Filter2", "FlipAngle", "FlowEncodingDirection", "FlowEncodingDirectionString", "FlowVenc", "GradientDelayTime", "ICE_Dims", "ImageComments", "ImageGroup", "ImageNumber", "ImageOrientationPatient", "ImagePositionPatient", "ImagedNucleus", "ImagingFrequency", "InversionTime", "LongModelName", "MagneticFieldStrength", "MeasuredFourierLines", "MeasurementIndex", "MiscSequenceParam", "MrEvaProtocol", "MrProtocol", "MrProtocolVersion", "NumberOfAverages", "NumberOfImagesInMosaic", "NumberOfPhaseEncodingSteps", "NumberOfPrescans", "Operation_mode_flag", "PATModeText", "PatReinPattern", "PatientOrientation", "PercentPhaseFieldOfView", "PercentSampling", "PhaseEncodingDirection", "PhaseEncodingDirectionPositive", "PhaseGradientAmplitude", "PixelBandwidth", "PixelFile", "PixelFileName", "PixelSpacing", "PositivePCSDirections", "ProtocolSliceNumber", "ReadoutGradientAmplitude", "ReadoutOS", "RealDwellTime", "ReceivingCoil", "ReferencedImageSequence", "RelTablePosition", "RepetitionTime", "RepetitionTimeEffective", "RepresentativeImage", "RfPowerErrorIndicator", "RfWatchdogMask", "Rows", "SAR", "SW_korr_faktor", "SarWholeBody", "ScanningSequence", "Sed", "SelectionGradientAmplitude", "SequenceFileOwner", "SequenceMask", "SequenceName", "SliceArrayConcatenations", "SliceLocation", "SliceMeasurementDuration", "SliceNormalVector", "SliceResolution", "SliceThickness", "SourceImageSequence", "SpectrumTextRegionLabel", "Stim_faktor", "Stim_lim", "Stim_max_ges_norm_online", "Stim_max_online", "Stim_mon_mode", "TimeAfterStart", "TransmitterCalibration", "TransmittingCoil", "TriggerTime", "UsedChannelMask", "UsedPatientWeight", "VariableFlipAngleFlag", "VoxelInPlaneRot", "VoxelNormalCor", "VoxelNormalSag", "VoxelNormalTra", "VoxelPhaseFOV", "VoxelPositionCor", "VoxelPositionSag", "VoxelPositionTra", "VoxelReadoutFOV", "VoxelThickness", "dBdt", "dBdt_limit", "dBdt_max", "dBdt_thresh", "t_puls_max", **/ mriconvert/NewMetaVolume.h0000640000175000000620000000207712542632333015162 0ustar stevestaff#ifndef NEW_META_VOLUME_H_ #define NEW_META_VOLUME_H_ #include #include // MetaIO, from ITK #include "metaTypes.h" #include "Globals.h" #include "Volume.h" #include "BasicVolumeFormat.h" namespace jcs { struct NewMetaHeader: public Basic3DHeader { int nDims; int dimSize[4]; int numberOfChannels; MET_ValueEnumType elementType; double elementSpacing[4]; double origin[4]; std::vector orientation; bool byteOrderMSB; int headerSize; std::string elementFile; std::vector sourceFileVector; std::vector extraFields; virtual void SetNumberOfSlices(int slices) { dimSize[2] = slices; } virtual void SetSliceSpacing(double spacing) { elementSpacing[2] = spacing; } virtual int GetNumberOfSlices() { return dimSize[2]; } }; class NewMetaVolume: public BasicVolumeFormat { public : NewMetaVolume(const char* filename, const char* header_extension, const char* raw_extension); virtual void WriteHeader(Basic3DHeader* header); }; } #endif mriconvert/GeDti2Handler.cpp0000640000175000000620000000562112542632311015333 0ustar stevestaff/// GeDti2Handler.cpp /** */ #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "GeEpiHandler.h" #include "GeDti2Handler.h" using namespace jcs; /// /** */ GeDti2Handler::GeDti2Handler(const std::string& seriesUid) : GeEpiHandler(seriesUid) { } /// /** */ SeriesHandler::VolListType GeDti2Handler::ReadVolIds(DicomFile& file) { VolListType v = SeriesHandler::ReadVolIds(file); Dictionary* Excite = Excite_Dictionary::Instance(); int image_number, number_of_slices; if (!file.Find("InstanceNumber", image_number)) { wxLogError(_("Instance number not found")); } if (!file.Find(Excite->Lookup("Locations_in_acquisition"), number_of_slices)) { wxLogError(_("Locations_in_acquisition not found")); } int vol_no = static_cast(floor(static_cast(image_number - 1) / number_of_slices) + 1); v.front().ids.push_back(itos(vol_no, 3)); std::vector g_value; std::string b_direction; double value; file.Find(Excite->Lookup("User_data_20"), value); g_value.push_back(value); file.Find(Excite->Lookup("User_data_21"), value); g_value.push_back(value); file.Find(Excite->Lookup("User_data_22"), value); g_value.push_back(value); int g_number; std::vector >::iterator pos; pos = find(gradients.begin(), gradients.end(), g_value); if (pos != gradients.end()) { g_number = distance(gradients.begin(), pos); } else { g_number = gradients.size(); gradients.push_back(g_value); } v.front().ids.push_back(itos(g_number, 3)); return v; } /// /** */ GradientInfo GeDti2Handler::GetGradientInfo() { GradientInfo info; Dictionary* Excite = Excite_Dictionary::Instance(); std::map volFileMap = GetVolIdsAndFiles(); std::map::iterator it = volFileMap.begin(); std::map::iterator it_end = volFileMap.end(); for (;it != it_end; it++) { //std::vector test = it->first.ids; //for (int t = 0; t < test.size(); ++t) // wxLogMessage(test[t].c_str()); info.values.push_back(0); // bvalue not found in these files. DicomFile file(it->second.c_str()); double value; int err = file.Find(Excite->Lookup("User_data_20"), value); if (err > 0) { info.xGrads.push_back(value); } err = file.Find(Excite->Lookup("User_data_21"), value); if (err > 0) { info.yGrads.push_back(value); } err = file.Find(Excite->Lookup("User_data_22"), value); if (err > 0) { info.zGrads.push_back(value); } } // GE -- do not correct! // std::vector r = GetRotationMatrix(volFileMap.begin()->first); // RotateGradInfo(info, r); return info; } mriconvert/ExciteDictionary.h0000750000175000000620000007742712542632317015720 0ustar stevestaff/** \file ExciteDictionary.h These are exciting proprietary tags. */ mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0012 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x0013 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1010 ), "Comments", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1001 ), "Full_fidelity", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1002 ), "Suite_id", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1004 ), "Product_id", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1027 ), "Image_actual_date", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1030 ), "Service_id", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x1031 ), "Mobile_location_number", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x10E3 ), "Equipment_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x10E6 ), "Genesis_Version", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x10E7 ), "Exam_Record_checksum", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0009, 0x10E9 ), "Actual_series_data_time_stamp", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x0011 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0011, 0x1010 ), "Patient_Status", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0012 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0014 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x0015 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x100F ), "Horiz_Frame_of_ref.", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1011 ), "Series_contrast", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1012 ), "Last_pseq", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1017 ), "Series_plane", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1018 ), "First_scan_ras", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1019 ), "First_scan_location", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x101A ), "Last_scan_ras", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x101B ), "Last_scan_loc", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x101E ), "Display_field_of_view", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x105A ), "Acquisition_Duration", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x107D ), "Second_echo", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x107E ), "Number_of_echoes", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x107F ), "Table_delta", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1081 ), "Contiguous", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1084 ), "Peak_SAR", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1085 ), "Monitor_SAR", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1087 ), "Cardiac_repetition_time", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1088 ), "Images_per_cardiac_cycle", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x108A ), "Actual_receive_gain_analog", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x108B ), "Actual_receive_gain_digital", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x108D ), "Delay_after_trigger", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x108F ), "Swappf", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1090 ), "Pause_Interval", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1091 ), "Pulse_Time", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1092 ), "Slice_offset_on_freq_axis", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1093 ), "Center_Frequency", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1094 ), "Transmit_Gain", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1095 ), "Analog_receiver_gain", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1096 ), "Digital_receiver_gain", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1097 ), "Bitmap_defining_CVs", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x1098 ), "Center_freq_Method", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x109B ), "Pulse_seq_Mode", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x109C ), "Pulse_seq_Name", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x109D ), "Pulse_seq_Date", "DT" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x109E ), "Internal_pulse_seq_Name", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x109F ), "Transmitting_coil", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A0 ), "Surface_Coil_Type", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A1 ), "Extremity_Coil_flag", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A2 ), "Raw_data_run_number", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A3 ), "Calibrated_Field_strength", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A4 ), "SAT_fat_water_bone", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A5 ), "Receive_bandwidth", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A7 ), "User_data_0", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A8 ), "User_data_1", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10A9 ), "User_data_2", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10AA ), "User_data_3", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10AB ), "User_data_4", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10AC ), "User_data_5", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10AD ), "User_data_6", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10AE ), "User_data_7", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10AF ), "User_data_8", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B0 ), "User_data_9", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B1 ), "User_data_10", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B2 ), "User_data_11", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B3 ), "User_data_12", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B4 ), "User_data_13", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B5 ), "User_data_14", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B6 ), "User_data_15", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B7 ), "User_data_16", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B8 ), "User_data_17", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10B9 ), "User_data_18", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10BA ), "User_data_19", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10BB ), "User_data_20", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10BC ), "User_data_21", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10BD ), "User_data_22", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10BE ), "Projection_angle", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C0 ), "Saturation_planes", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C1 ), "Surface_coil_intensity", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C2 ), "SAT_location_R", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C3 ), "SAT_location_L", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C4 ), "SAT_location_A", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C5 ), "SAT_location_P", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C6 ), "SAT_location_H", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C7 ), "SAT_location_F", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C8 ), "SAT_thickness_R/L", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10C9 ), "SAT_thickness_A/P", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10CA ), "SAT_thickness_H/F", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10CB ), "Prescribed_flow_axis", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10CC ), "Velocity_encoding", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10CD ), "Thickness_disclaimer", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10CE ), "Prescan_type", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10CF ), "Prescan_status", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D0 ), "Raw_data_type", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D2 ), "Projection_Algorithm", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D3 ), "Projection_algorithm", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D5 ), "Fractional_echo", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D6 ), "Prep_pulse", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D7 ), "Cardiac_phase_number", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D8 ), "Variable_echoflag", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10D9 ), "Concatenated_SAT", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10DF ), "User_data_23", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10E0 ), "User_data_24", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10E2 ), "Velocity_Encode_Scale", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10F2 ), "Fast_phases", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0019, 0x10F9 ), "Transmit_gain", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1003 ), "Series_from_which_Prescribed", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1005 ), "Genesis_Version", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1007 ), "Series_Record_checksum", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1018 ), "Genesis_version", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1019 ), "Acq_recon_record_checksum", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1020 ), "Table_start_location", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1035 ), "Series_from_which_prescribed", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1036 ), "Image_from_which_prescribed", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1037 ), "Screen_Format", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x104F ), "Locations_in_acquisition", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1050 ), "Graphically_prescribed", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1051 ), "Rotation_from_source_x_rot", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1052 ), "Rotation_from_source_y_rot", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1053 ), "Rotation_from_source_z_rot", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1054 ), "Image_position", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1055 ), "Image_orientation", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1056 ), "Num_3D_slabs", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1057 ), "Locs_per_slab", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1058 ), "Overlaps", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1059 ), "Image_Filtering", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x105A ), "Diffusion_direction", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x105B ), "Ihtagfa", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x105C ), "Ihtagor", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x105D ), "Ihbspti", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x105E ), "RTIA_timer", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x105F ), "Fps", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1081 ), "Auto_window/level_alpha", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1082 ), "Auto_window/level_beta", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1083 ), "Auto_window/level_window", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0021, 0x1084 ), "Auto_window/level_level", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x1001 ), "Number_of_series_in_Study_", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x1002 ), "Number_of_unarchived_Series_", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x1010 ), "Reference_image_field", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x1050 ), "Summary_image", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x1070 ), "Start_time", "FD" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x1074 ), "No_of_updates_to_header", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0023, 0x107D ), "Complete_info", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1006 ), "Last_pulse_sequence_used", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1007 ), "Images_in_Series", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1010 ), "Landmark_Counter", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1011 ), "Number_of_Acquisitions", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1014 ), "Indicates_no_of_updates_to_header", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1017 ), "Series_Complete_Flag", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1018 ), "Number_of_images_archived", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x1019 ), "Last_image_number_used", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x101A ), "Primary_Receiver_Suite_and_Host", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0025, 0x101B ), "Protocol_Data_Block", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1006 ), "Image_archive_flag", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1010 ), "Scout_Type", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1030 ), "Foreign_Image_Revision", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1031 ), "Imaging_Mode", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1032 ), "Pulse_Sequence", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1033 ), "Imaging_Options", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1035 ), "Plane_Type", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1036 ), "Oblique_Plane", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1040 ), "RAS_letter_of_image_location", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1041 ), "Image_location", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1042 ), "Center_R_coord_of_plane_image", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1043 ), "Center_A_coord_of_plane_image", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1044 ), "Center_S_coord_of_plane_image", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1045 ), "Normal_R_coord", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1046 ), "Normal_A_coord", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1047 ), "Normal_S_coord", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1048 ), "R_Coord_of_Top_Right_Corner", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1049 ), "A_Coord_of_Top_Right_Corner", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x104A ), "S_Coord_of_Top_Right_Corner", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x104B ), "R_Coord_of_Bottom_Right_Corner", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x104C ), "A_Coord_of_Bottom_Right_Corner", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x104D ), "S_Coord_of_Bottom_Right_Corner", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1060 ), "Image_dimension_-_X", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1061 ), "Image_dimension_-_Y", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0027, 0x1062 ), "Number_of_Excitations", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0011 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x0012 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1015 ), "Lower_range_of_Pixels1", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1016 ), "Lower_range_of_Pixels1", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1017 ), "Lower_range_of_Pixels2", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1018 ), "Upper_range_of_Pixels2", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x101A ), "Len_of_tot_hdr_in_bytes", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1026 ), "Version_of_the_hdr_struct", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1034 ), "Advantage_comp_Overflow", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0029, 0x1035 ), "Advantage_comp_Underflow", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1001 ), "Bitmap_of_prescan_options", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1002 ), "Gradient_offset_in_X", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1003 ), "Gradient_offset_in_Y", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1004 ), "Gradient_offset_in_Z", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1005 ), "Img_is_original_or_unoriginal", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1006 ), "Number_of_EPI_shots", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1007 ), "Views_per_segment", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1008 ), "Respiratory_rate_bpm", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1009 ), "Respiratory_trigger_point", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x100A ), "Type_of_receiver_used", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x100B ), "Peak_rate_of_change_of_gradient_field", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x100C ), "Limits_in_units_of_percent", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x100D ), "PSD_estimated_limit", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x100E ), "PSD_estimated_limit_in_tesla_per_second", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x100F ), "Saravghead", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1010 ), "Window_value", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x101C ), "GE_image_integrity", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x101D ), "Level_value", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1028 ), "Unique_image_iden", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1029 ), "Histogram_tables", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x102A ), "User_defined_data", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x102B ), "Private_Scan_Options", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x102C ), "Effective_echo_spacing", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x102D ), "Filter_Mode", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x102E ), "String_slop_field_2", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x102F ), "Image_Type", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1030 ), "Vas_collapse_flag", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1031 ), "RA_cord_of_target_recon_center", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1032 ), "Vas_flags", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1033 ), "Neg_scanspacing", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1034 ), "Offset_Frequency", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1035 ), "User_usage_tag", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1036 ), "User_fill_map_MSW", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1037 ), "User_fill_map_LSW", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1038 ), "User_data_25...User_data_48", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1039 ), "Slop_int_6...slop_int_9", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1060 ), "Slop_int_10...slop_int_17", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1061 ), "Scanner_Study_Entity_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1062 ), "Scanner_Study_ID", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x106f ), "Scanner_Table_Entry", "" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1070 ), "Paradigm_Name", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1071 ), "Paradigm_Description", "ST" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1072 ), "Paradigm_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1073 ), "Experiment_Type", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1074 ), "rest_volumes", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1075 ), "active_volumes", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1076 ), "dummy_scans", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1077 ), "Application_Name", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1078 ), "Application_Version", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1079 ), "Slices_Per_Volume", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x107A ), "Expected_Time_Points", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x107B ), "Regressor_Values", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x107C ), "Delay_after_slice_group", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x107D ), "Recon_mode_flag_word", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x107E ), "PACC_specific_information", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x107F ), "Grad_Shim_Values", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1080 ), "Coil_ID_Data", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1081 ), "GE_Coil_Name", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1082 ), "System_Configuration_Information", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1083 ), "Asset_R_Factors", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1084 ), "Additional_Asset_Data", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1085 ), "Debug_Data_text", "UT" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1086 ), "Debug_Data_binary", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1087 ), "Software_Versions_Long", "UT" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1088 ), "PURE_Acquisition_Calibration_Series_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1089 ), "Governing_Body_dB/dt_and_SAR_definition", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x108A ), "Private_In-Plane_Phase_Encoding_Direction", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1090 ), "SAR_Definition", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1091 ), "SAR_value", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1092 ), "Image_Error_Text", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1096 ), "Content_Qualification", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1097 ), "Image_Filtering_Parameters", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1098 ), "ASSET_Acquisition_Calibration_Series_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x0043, 0x1099 ), "Extended_Options", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x0051, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x0051, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1010 ), "DICOM_Implementation_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1011 ), "DICOM_Implementation_Version", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1012 ), "Within-DICOM-Implementation_SOP_Instance_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1013 ), "Application_Name", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1014 ), "Application_Version", "SH" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1021 ), "Referenced_Series_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1031 ), "Number_of_Objects_Averaged", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1041 ), "Number_of_Expected_Time_Points", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1051 ), "Number_of_Slices_Per_Volume", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1061 ), "Experiment_Type", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1071 ), "Paradigm_UID", "UI" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1072 ), "Paradigm_Name", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1073 ), "Paradigm_Description", "ST" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1081 ), "Regressor_Values", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1086 ), "Number_of_Degrees_of_Freedom", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x108A ), "Z_Threshold", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x108B ), "p_Threshold", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x0000 ), "Group_Length", "UL" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x0010 ), "Private_Creator", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1001 ), "rdb_hdr_rec", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1002 ), "rdb_hdr_per_pass_tab", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1003 ), "rdb_hdr_unlock_raw", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1004 ), "rdb_hdr_data_acq_tab", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1005 ), "rdb_hdr_nex_tab", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1006 ), "rdb_hdr_nex_abort_tab", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1007 ), "rdb_hdr_tool", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1008 ), "rdb_raw_data", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x1009 ), "SSP_save", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x7001, 0x100A ), "UDA_save", "OB" )); mriconvert/McVerter.h0000640000175000000620000000140212542632332014147 0ustar stevestaff/// McVerter.h /** */ #ifndef MCVERTER_H_ #define MCVERTER_H_ #define NO_CONFIG // #define _CRT_SECURE_NO_DEPRECATE 1 // #define _CRT_SECURE_NO_WARNINGS 1 #define EXIT_NO_WX -1 #define EXIT_SUCCESS 0 #define EXIT_NO_PROCESSING 1 #define EXIT_NO_INPUT_SPECIFIED 2 #define EXIT_ARGUMENT_ERROR -2 #define EXIT_PERMISSION_ERROR -3 #include #include #include #include #include #include #include #include #include #include #include "OutputFactory.h" #include "Converter.h" #include "OutputterBase.h" #include "StringConvert.h" #include "Globals.h" #include "version_string.h" #include "ConfigValues.h" #endif mriconvert/open_folder.xpm0000640000175000000620000000107012542632322015271 0ustar stevestaff/* XPM */ static const char *open_folder_xpm[] = { /* width height num_colors chars_per_pixel */ " 16 16 4 1", /* colors */ ". c #000000", "# c #808000", "a c None", "b c #ffff00", /* pixels */ "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa", "a.....aaaaaaaaaa", "a.bbb........aaa", "a.bbbbbbbbbb.aaa", "a.bbbbbbbbbb.aaa", "a.bb...........a", "a.bb##########.a", "a.b.##########.a", "a.b##########.aa", "a..##########.aa", "a.##########.aaa", "a...........aaaa", "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa", }; mriconvert/DicomViewer.cpp0000640000175000000620000002756112542632317015211 0ustar stevestaff/// DicomViewer.cpp /** Displays DICOM header information in a wxFrame. todo: 20130301cdt - add ability to search */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include //20060823cdt #include #include #include #include #include #include #include #include #include "DicomFile.h" #include "DicomViewer.h" #include "StringConvert.h" using namespace jcs; enum { MENU_FILE_EXIT = 1, MENU_FILE_SAVE, MENU_FILE_FIND, MENU_FILE_CSA_IMAGE, MENU_FILE_CSA_SERIES }; BEGIN_EVENT_TABLE(DicomViewer, wxFrame) EVT_MENU(MENU_FILE_SAVE, DicomViewer::OnSave) EVT_MENU(MENU_FILE_EXIT, DicomViewer::OnQuit) EVT_MENU(MENU_FILE_FIND, DicomViewer::ShowFindDialog) EVT_MENU(MENU_FILE_CSA_IMAGE, DicomViewer::OnCsaImage) EVT_MENU(MENU_FILE_CSA_SERIES, DicomViewer::OnCsaSeries) EVT_FIND(-1, DicomViewer::OnFindDialog) EVT_FIND_NEXT(-1, DicomViewer::OnFindDialog) EVT_FIND_CLOSE(-1, DicomViewer::OnCloseFindDialog) END_EVENT_TABLE() DicomViewer::DicomViewer(wxWindow* parent, const char* filename) : wxFrame(parent, -1, ""), mDicomFile(filename), mDescLength(0) { CreateStatusBar(); wxMenuBar* pMenuBar = new wxMenuBar(); wxMenu* pFileMenu = new wxMenu(); pFileMenu->Append(MENU_FILE_SAVE, "&Save", "Save as text file"); pFileMenu->Append(MENU_FILE_EXIT, "E&xit", "Close this window"); pMenuBar->Append(pFileMenu, _T("&File")); std::string manufacturer; mDicomFile.Find("Manufacturer", manufacturer); std::string software; //mDicomFile.Find("SoftwareVersion", software); mDicomFile.Find("SoftwareVersions", software); if ((manufacturer.find("SIEMENS") != std::string::npos) && (software.find("syngo") != std::string::npos)) { pFileMenu->Append(MENU_FILE_CSA_IMAGE, _T("&CSA Image Header"), _T("View CSA Image header")); pFileMenu->Append(MENU_FILE_CSA_SERIES, _T("CSA Series &Header"), _T("View CSA Series header")); } SetMenuBar(pMenuBar); wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL); wxString fname; wxString ext; wxFileName::SplitPath(wxString(filename, wxConvLocal), NULL, &fname, &ext); if (!ext.IsEmpty()) { fname += _T(".") + ext; } SetTitle(fname); mpDicomList = new wxListView(this, -1, wxDefaultPosition, wxSize(600, 400), wxLC_REPORT); InitList(); frameSizer->Add(mpDicomList, 1, wxEXPAND); SetSizer(frameSizer); frameSizer->Fit(this); } /// /** */ void DicomViewer::OnSave(wxCommandEvent& event) { wxFileDialog* dlg = new wxFileDialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.txt"), wxFD_SAVE); if (dlg->ShowModal() == wxID_OK) { wxString path = dlg->GetPath(); std::ofstream output(path.mb_str(wxConvLocal)); for (int i = 0; i < mpDicomList->GetItemCount(); ++i) { output << mGetItemText(i, 0).mb_str(wxConvLocal); output << " "; wxString desc = mGetItemText(i, 1); desc.Pad(mDescLength - desc.Length()); output << desc.mb_str(wxConvLocal); output << " "; output << mGetItemText(i, 2).mb_str(wxConvLocal); output << " "; wxString vl = mGetItemText(i, 3); vl.Pad(12 - vl.Length(), ' ', false); output << vl.mb_str(wxConvLocal); output << " "; output << mGetItemText(i, 4).mb_str(wxConvLocal); output << std::endl; } // Could save CSA headers too if we really wanted output.close(); } dlg->Destroy(); } /// /** */ void DicomViewer::OnCsaImage(wxCommandEvent& event) { std::string header; mDicomFile.GetCSAImageHeader(header); CSAViewer* viewer = new CSAViewer(this, this->GetTitle(), header); viewer->Show(); } /// /** */ void DicomViewer::OnCsaSeries(wxCommandEvent& event) { std::string header; mDicomFile.GetCSASeriesHeader(header); CSAViewer* viewer = new CSAViewer(this, this->GetTitle(), header); viewer->Show(); } /// /** */ void DicomViewer::OnQuit(wxCommandEvent& event) { Close(); } /// /** */ wxString DicomViewer::mGetItemText(long index, int column) const { wxListItem item; item.SetId(index); item.SetColumn(column); item.SetMask(wxLIST_MASK_TEXT); mpDicomList->GetItem(item); return item.GetText(); } /// /** */ void DicomViewer::InitList() { wxBusyCursor busy; mpDicomList->InsertColumn(0, _T("Tag")); mpDicomList->InsertColumn(1, _T("Description")); mpDicomList->InsertColumn(2, _T("VR")); mpDicomList->InsertColumn(3, _T("VL")); mpDicomList->InsertColumn(4, _T("Value")); std::vector elements = mDicomFile.DataDump(); std::vector::iterator it = elements.begin(); std::vector::iterator it_end = elements.end(); for (;it != it_end; it++) { AddElement(*it); } mpDicomList->SetColumnWidth(0, wxLIST_AUTOSIZE); mpDicomList->SetColumnWidth(1, wxLIST_AUTOSIZE); mpDicomList->SetColumnWidth(2, wxLIST_AUTOSIZE); mpDicomList->SetColumnWidth(3, wxLIST_AUTOSIZE); mpDicomList->SetColumnWidth(4, wxLIST_AUTOSIZE); } /// /** */ int DicomViewer::AddElement(DicomElement& e) { wxString buf; int i = mpDicomList->GetItemCount(); mpDicomList->InsertItem(i, wxString::Format( _T("(%04x, %04x)"), e.tag.group, e.tag.element )); mpDicomList->SetItem(i, 1, wxString(e.description.c_str(), wxConvLocal)); mpDicomList->SetItem(i, 2, wxString(e.vr.c_str(), wxConvLocal)); mpDicomList->SetItem(i, 3, wxString::Format(_T("%d"), e.value_length)); // Todo: 20130221cdt - add formatting of value according to VR if (e.vr.compare("AT") == 0) { // Formatted as attribute tag. char delim[] = "/"; int loc = e.value.find(delim); std::string group = e.value.substr(0, loc); std::string element = e.value.substr(loc + 1); mpDicomList->SetItem(i, 4, wxString::Format(_T("(%.4x,%.4x)"), stoi(group), stoi(element))); } else { // The use of From8BitData presumes Unicode encoding, true in the case of // (0x0008,0x0005) being ISO_IR 100 (ISO-8859-1). // On OS X, SL, compile fails unless mb_str() is used - 20131127cdt mpDicomList->SetItem(i, 4, wxString(wxString::From8BitData(e.value.c_str()).wc_str(), wxConvLocal)); } mDescLength = std::max(mDescLength, e.description.size()); return 1; } /// /** */ CSAViewer::CSAViewer(wxWindow* parent, const wxString& title, const std::string& header) : wxFrame(parent, -1, title) { wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL); mTextCtrl = new wxTextCtrl(this, -1, _T(""), wxDefaultPosition, wxSize(400,400), wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH); /* if (!mTextCtrl->GetFont().IsFixedWidth()) { wxFont fixed; fixed.SetFamily(wxMODERN); mTextCtrl->SetFont(fixed); } */ frameSizer->Add(mTextCtrl, 1, wxEXPAND); AddHeader(header); SetSizer(frameSizer); frameSizer->Fit(this); } /// /** */ void CSAViewer::AddHeader(const std::string& header) { wxBusyCursor busy; std::stringstream ss; ss.write(header.c_str(), header.size()); ss.ignore(16); while(ss.good()) AddNext(ss); } /// /** */ void CSAViewer::AddNext(std::istream& in) { char char_buffer[64]; in.read(char_buffer, 64); if (!in.good()) { return; } mTextCtrl->AppendText(wxString(char_buffer, wxConvLocal)); (*mTextCtrl) << _T("\n"); int n_values; in.read(reinterpret_cast (&n_values), 4); in.read(char_buffer, 4); wxInt32 intval1; wxInt32 intval2; wxInt32 intval3; wxInt32 intval4; in.read(reinterpret_cast (&intval1), 4); in.read(reinterpret_cast (&intval2), 4); in.read(reinterpret_cast (&intval3), 4); if (intval3 == 205) { (*mTextCtrl) << _T("\n"); return; } for (;;) { in.read(reinterpret_cast (&intval1), 4); in.read(reinterpret_cast (&intval2), 4); in.read(reinterpret_cast (&intval3), 4); in.read(reinterpret_cast (&intval4), 4); if (intval3 != 77 || !in.good()) { break; } unsigned int bytes_read = 0; std::stringstream test; for(int i = 0; i < intval4; ++i) { //(*mTextCtrl) << in.get(); // not sure why this doesn't work test.put(in.get()); bytes_read += in.gcount(); if (!in.good()) { break; } } (*mTextCtrl) << wxString(test.str().c_str(), wxConvLocal); mTextCtrl->AppendText(_T("\n")); while (bytes_read % 4) { in.get(); bytes_read += in.gcount(); if (!in.good()) { break; } } } while (intval1 == 0 && intval3 == 205 && in.good()) { if (in.good()) { in.read(reinterpret_cast (&intval1), 4); } if (in.good()) { in.read(reinterpret_cast (&intval2), 4); } if (in.good()) { in.read(reinterpret_cast (&intval3), 4); } if (in.good()) { in.read(reinterpret_cast (&intval4), 4); } } in.seekg(-16, std::ios::cur); (*mTextCtrl) << _T("\n"); } /// /** */ void DicomViewer::ShowFindDialog( wxCommandEvent& WXUNUSED(event) ) { wxFindReplaceData data(wxFR_DOWN); wxFindReplaceDialog* dlgFind = new wxFindReplaceDialog(this, &data, _T("Find text"), wxFR_NOWHOLEWORD); dlgFind->Show(TRUE); } /// /** */ void DicomViewer::OnFindDialog(wxFindDialogEvent& event) { wxString search = event.GetFindString(); bool down = (event.GetFlags() & wxFR_DOWN); bool match_case = ((event.GetFlags() & wxFR_MATCHCASE) != 0); int start_index = 0; wxEventType type = event.GetEventType(); int n_rows = mpDicomList->GetItemCount(); if ( event.GetEventType() == wxEVT_COMMAND_FIND_NEXT ) { start_index = mpDicomList->GetFocusedItem(); if (down) { ++start_index; if (start_index >= n_rows) { wxMessageBox(_T("At end of list"), _T("Message"), wxOK | wxCENTRE, this); return; } } else { --start_index; if (start_index < 0) { wxMessageBox(_T("At start of list"), _T("Message"), wxOK | wxCENTRE, this); return; } } } int n_columns = 5; bool found = false; wxBusyCursor busy; if (down) { for (int i = start_index; i < n_rows; ++i) { if (found) { break; } for (int j = 0; j < n_columns; ++j) { wxString itemText = mGetItemText(i, j); if (!match_case) { found = itemText.Upper().Contains(search.Upper()); } else { found = itemText.Contains(search); } if (found) { // deselect all for (int k = 0; k < n_rows; ++k) { mpDicomList->Select(k, false); } SetFocus(); mpDicomList->Focus(i); mpDicomList->Select(i); mpDicomList->EnsureVisible(i); break; } } } } else { for (int i = start_index; i >= n_rows; --i) { if (found) { break; } for (int j = 0; j < n_columns; ++j) { wxString itemText = mGetItemText(i, j); if (!match_case) { itemText.MakeUpper(); } if (itemText.Contains(search)) { // deselect all for (int k = 0; k < n_rows; ++k) mpDicomList->Select(k, false); SetFocus(); mpDicomList->Focus(i); mpDicomList->Select(i); mpDicomList->EnsureVisible(i); found = true; break; } } } } if (!found) { wxMessageBox(wxString::Format(_T("%s not found"), search.c_str()), _T("Message"), wxOK | wxCENTRE, this); } } /// /** */ void DicomViewer::OnCloseFindDialog(wxFindDialogEvent& event) { wxFindReplaceDialog *dlg = event.GetDialog(); dlg->Destroy(); } mriconvert/resource.h0000640000175000000620000000075612542632317014265 0ustar stevestaff//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by MRIConvert.rc // #define VS_VERSION_INFO 1 #define DUMMY 4 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif mriconvert/MRIConvert.cpp0000640000175000000620000000606312542632323014753 0ustar stevestaff/// MRIConvert.cpp /** */ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include "MRIConvert.h" #include "McFrame.h" #include "resource.h" #include "StringConvert.h" #include "Globals.h" #include "ConfigValues.h" // Create a new application object: this macro will allow wxWindows to create // the application object during program execution (it's better than using a // static object for many reasons) and also declares the accessor function // wxGetApp() which will return the reference of the right type (i.e. MRIConvert and // not wxApp) IMPLEMENT_APP(MRIConvert) // ============================================================================ // implementation // ============================================================================ // ---------------------------------------------------------------------------- // the application class // ---------------------------------------------------------------------------- // 'Main program' equivalent: the program execution "starts" here bool MRIConvert::OnInit() { jcs::verbose = false; // Start with loading preferences for window size and position. wxSize size; long minWidth = 400, minHeight = 400, maxWidth = 10000, maxHeight = 10000; // Constrain width and height of McFrame to avoid assert failure undoer OS X: // Assertion failed: (winRgnBounds.size.width <= 1000000), // function CGSNewWindowWithOpaqueShape, // file Services/Windows/CGSWindow.c, line 572. size.SetWidth(std::min(wxConfig::Get()->Read(CFG_framewidth, minWidth), maxWidth)); size.SetHeight(std::min(wxConfig::Get()->Read(CFG_frameheight, minHeight), maxHeight)); // 20130326cdt Do we want to save and restore window location? wxPoint pos; wxConfig::Get()->Read(CFG_frameposx, &pos.x); wxConfig::Get()->Read(CFG_frameposy, &pos.y); // For now, let's rely on wxWisdom for positioning. pos = wxDefaultPosition; // Localization steps if ( !m_locale.Init() ) { wxLogError(_T("This language is not supported by the system.")); } // Development only, distribution should install in standard location. //wxLocale::AddCatalogLookupPathPrefix(_T("l10n")); // Initialize the catalogs we'll be using m_locale.AddCatalog(_T("mriconvert")); // create the main application window McFrame *frame = new McFrame(_T("MRIConvert"), pos, size); wxTheApp->SetAppName(_T("MRIConvert")); // and show it (the frames, unlike simple controls, are not shown when // created initially) frame->Show(TRUE); // success: wxApp::OnRun() will be called which will enter the main message // loop and the application will run. If we returned FALSE here, the // application would exit immediately. return TRUE; } mriconvert/McPanel.cpp0000640000175000000620000005350712542632312014305 0ustar stevestaff/// McPanel.cpp /** Main user interface within McFrame. */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "MRIConvert.h" #include "Converter.h" #include "DicomTree.h" #include "InfoFrame.h" #include "DicomViewer.h" #include "ImageView.h" #include "OutputFactory.h" #include "McPanel.h" #include "MessageList.h" #include "OutputterBase.h" #include "NewSpmOutputter.h" #include "NewMetaOutputter.h" #include "NewBvOutputter.h" #include "NiftiOutputter.h" #include "AnalyzeOutputter.h" #include "NoOptionsDlg.h" #include "BvOptionsDlg.h" #include "BasicOptionsDlg.h" #include "AnalyzeOptionsDlg.h" #include "NiftiOptionsDlg.h" #include "SpmOptionsDlg.h" #include "MetaOptionsDlg.h" #include "OverrideDlg.h" #include "ConfigValues.h" using namespace jcs; BEGIN_EVENT_TABLE(McPanel, wxPanel) EVT_BUTTON(COMMAND_NEW, McPanel::OnNew) EVT_BUTTON(COMMAND_ADD_FILES, McPanel::OnAddFiles) EVT_BUTTON(COMMAND_ADD_DIR, McPanel::OnAddDir) EVT_BUTTON(COMMAND_DIRECTORY, McPanel::OnDirectory) EVT_BUTTON(COMMAND_CONVERT, McPanel::OnConvert) EVT_BUTTON(COMMAND_REMOVE, McPanel::OnRemove) EVT_BUTTON(COMMAND_RENAME, McPanel::OnRename) EVT_BUTTON(COMMAND_OPTIONS, McPanel::OnOptions) EVT_BUTTON(wxID_EXIT, McPanel::OnQuit) EVT_CHOICE(CHOICE_OUTPUT, McPanel::OnChoiceOutput) EVT_TREE_SEL_CHANGED(SOURCE_CTRL, McPanel::OnSourceSelect) EVT_TREE_SEL_CHANGED(OUTPUT_CTRL, McPanel::OnOutputSelect) EVT_TREE_END_LABEL_EDIT(OUTPUT_CTRL, McPanel::OnEditEnd) EVT_CONTEXT_MENU( McPanel::OnContextMenu) EVT_MENU(COMMAND_REMOVE, McPanel::OnRemove) EVT_MENU(COMMAND_INFO, McPanel::OnInfo) EVT_MENU(COMMAND_DICOM, McPanel::OnDicom) EVT_MENU(COMMAND_IMAGE, McPanel::OnImage) EVT_MENU(COMMAND_DIRECTORY, McPanel::OnDirectory) EVT_MENU(COMMAND_RENAME, McPanel::OnRename) EVT_DROP_FILES( McPanel::OnDropFiles) END_EVENT_TABLE() /// /** */ McPanel::McPanel(wxWindow* parent) : wxPanel(parent, -1) { m_output_type = 0; mpConverter = new Converter(m_output_type); // create sizer for panel wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL); panelSizer->Add(new wxStaticLine(this, -1), 0, wxEXPAND); // create sizer for source list wxBoxSizer* sSizer = new wxBoxSizer(wxHORIZONTAL); // add title panelSizer->Add(new wxStaticText(this, -1, _("DICOM series to convert"), wxDefaultPosition), 0, wxLEFT|wxTOP, 20); panelSizer->Add(0, 10, 0, wxEXPAND); // add list box mpSourceCtrl = new DicomTreeCtrl(this, SOURCE_CTRL, wxTR_MULTIPLE); sSizer->Add(mpSourceCtrl, 1, wxEXPAND); // add buttons wxBoxSizer* sSizer_buttons = new wxBoxSizer(wxVERTICAL); sSizer_buttons->Add(new ttButton(this, COMMAND_ADD_FILES, _("Add files"), _("Add files to convert")), 0, wxBOTTOM, 10); sSizer_buttons->Add(new ttButton(this, COMMAND_ADD_DIR, _("Add folder"), _("Add directory of files to convert")), 0, wxBOTTOM, 10); mpRemoveButton = new ttButton(this, COMMAND_REMOVE, _("Remove"), _("Remove series from list")); sSizer_buttons->Add(mpRemoveButton, 0, wxBOTTOM, 10); sSizer->Add(sSizer_buttons, 0, wxLEFT, 20); // add source list box sizer to panel sizer panelSizer->Add(sSizer, 1, wxEXPAND|wxLEFT|wxRIGHT, 20); // add output selector mpOutputChooser = new wxChoice(this, CHOICE_OUTPUT); for (int i = 0; i < OutputFactory::GetNumberOfTypes(); ++i) { mpOutputChooser->Append(wxString(OutputFactory::GetDescription(i), wxConvLocal)); } mpOutputChooser->SetSize(mpOutputChooser->GetBestSize()); mpOutputChooser->SetSelection(m_output_type); panelSizer->Add(mpOutputChooser, 0, wxLEFT|wxTOP, 20); panelSizer->Add(0, 10, 0, wxEXPAND); // create sizer for output tree control wxBoxSizer* oSizer = new wxBoxSizer(wxHORIZONTAL); // add output tree control wxString rootdir; wxConfig::Get()->Read(CFG_dir, &rootdir); while (!wxDir::Exists(rootdir)) { rootdir = wxDirSelector(_("Choose a directory for output")); if (rootdir.empty()) { GetParent()->Close(false); } } mpOutputCtrl = new NewOutputTreeCtrl(this, OUTPUT_CTRL, rootdir); oSizer->Add(mpOutputCtrl, 1, wxEXPAND); // add buttons wxBoxSizer* oSizer_buttons = new wxBoxSizer(wxVERTICAL); mpOptionsButton = new ttButton(this, COMMAND_OPTIONS, _("Options"), _("Options for this format")); oSizer_buttons->Add(mpOptionsButton, 0, wxBOTTOM, 10); oSizer_buttons->Add(new ttButton(this, COMMAND_DIRECTORY, _("Directory"), _("Select directory for converted files")), 0, wxBOTTOM, 10); mpRenameButton = new ttButton(this, COMMAND_RENAME, _("Rename"), _("Change names of output files/directories")); oSizer_buttons->Add(mpRenameButton); oSizer->Add(oSizer_buttons, 0, wxLEFT, 20); // add output control sizer to panel sizer panelSizer->Add(oSizer, 1, wxEXPAND|wxLEFT|wxRIGHT, 20); mpPathInfo = new wxStaticText(this, -1, ::wxGetCwd()); panelSizer->Add(mpPathInfo, 0, wxALL, 20); panelSizer->Add(new wxStaticLine(this, -1), 0, wxEXPAND); // create button sizer wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); // add buttons to button sizer buttonSizer->Add(new ttButton(this, COMMAND_NEW, _("New session"), _("Clear list and start new session")), 0, wxRIGHT, 20); buttonSizer->Add(new ttButton(this, COMMAND_CONVERT, _("Convert all"), _("Convert all files")), 0, wxRIGHT, 20); buttonSizer->Add(new ttButton(this, wxID_EXIT, _("Quit"), _("Quit the application"))); // add button sizer to panel sizer panelSizer->Add(0, 10, 0, wxEXPAND); panelSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxRIGHT, 20); panelSizer->Add(0, 10, 0, wxEXPAND); // set the sizer and layout SetSizer(panelSizer); mpOutputCtrl->SetOutputter(mpConverter->GetOutputter()); #if defined(__WXMSW__) DragAcceptFiles(true); #endif if (wxGetApp().argc > 1) { for (int i = 1; i < wxGetApp().argc; ++i) { wxFileName filename(wxGetApp().argv[i]); if (filename.FileExists()) { mpConverter->AddFile(filename.GetFullPath()); } else if (filename.DirExists()) { wxArrayString files; wxDir::GetAllFiles(filename.GetFullPath(), &files); mAddSomeFilesDialog(files); } } mpConverter->UpdateOutput(); ResetOutput(); RefreshSourceCtrl(); ShowMessageBox(); ::wxGetTopLevelParent(this)->Raise(); } } /// /** */ McPanel::~McPanel() { wxString rootdir = mpOutputCtrl->GetItemText(mpOutputCtrl->GetRootItem()); wxConfig::Get()->Write(CFG_dir, rootdir); delete mpConverter; } // kindof annoying this way, but okay for now /// /** */ void McPanel::RefreshSourceCtrl() { std::vector sv = mpConverter->GetSeriesList(); std::vector::iterator it = sv.begin(); std::vector::iterator it_end = sv.end(); for (; it != it_end; ++it) { SeriesHandler* series = mpConverter->GetHandler(*it); mpSourceCtrl->AddSeries(series); } } /// /** */ void McPanel::ResetOutput() { wxBusyCursor busy; mpOutputCtrl->Reset(); mpOutputCtrl->RefreshList(); } /// /** */ void McPanel::SetSplitDirs(bool split) { mpOutputCtrl->SplitDirectories(split); } /// /** */ void McPanel::SetSplitSubj(bool split) { mpOutputCtrl->SplitSubjects(split); } /// /** */ void McPanel::SetPathInfo(wxString path) { wxTreeItemId item = mpOutputCtrl->GetSelection(); wxTreeItemId root = mpOutputCtrl->GetRootItem(); if (!item.IsOk() || item == root) { path = mpOutputCtrl->GetItemText(root); } else { while(item != root) { item = mpOutputCtrl->GetItemParent(item); path.Prepend(wxFileName::GetPathSeparator()); path.Prepend(mpOutputCtrl->GetItemText(item)); } } mpPathInfo->SetLabel(path); } /// /** */ void McPanel::ShowMessageBox() { if (!mpConverter->messages.empty()) { wxWindowDisabler disableAll; MessageListDlg lmd(_("Finished adding files")); Message m; m.push_back(_("File name")); m.push_back(_("Status")); m.push_back(_("Information")); lmd.SetColumns(m); lmd.AddMessages(mpConverter->messages); lmd.ShowModal(); mpConverter->messages.clear(); } } /// /** Helper method for adding files. Handles display of a progress dialog. Local variable tuneParam controls the period of dialog update. \param files List of files to add. \param msg Message to display. This is also logged. */ void McPanel::mAddSomeFilesDialog(wxArrayString files, const wxChar* msg) { wxLogStatus(msg); unsigned int nfiles = files.GetCount(); // Dialog is updated twenty times. unsigned int tuneParam = 20; unsigned int tuneUpdate = std::max(tuneParam, nfiles / tuneParam); wxProgressDialog* p_dlg = new wxProgressDialog(_("Progress"), msg, nfiles, this, wxPD_CAN_ABORT | wxPD_APP_MODAL | wxPD_SMOOTH); files.Sort(); wxArrayString::iterator it = files.begin(); wxArrayString::iterator it_end = files.end(); for (unsigned int i = 0; it != it_end; ++it, ++i) { wxFileName filename(*it); mpConverter->AddFile(filename.GetFullPath()); if (i % tuneUpdate == 0) { if (!p_dlg->Update(i)) { break; } } } p_dlg->Destroy(); } // EVENT HANDLERS /// /** */ void McPanel::OnQuit(wxCommandEvent& event) { GetParent()->Close(false); } /// /** */ void McPanel::OnContextMenu(wxContextMenuEvent& event) { wxPoint pos = event.GetPosition(); wxTreeItemId item = mpSourceCtrl->HitTest(mpSourceCtrl->ScreenToClient(pos)); if (item.IsOk()) { wxMenu menu; switch (mpSourceCtrl->GetItemType(item)) { case dtFILE : menu.Append(COMMAND_DICOM, _("View DICOM")); menu.Append(COMMAND_IMAGE, _("View Image")); menu.Append(COMMAND_INFO, _("Series Info")); break; case dtSERIES : menu.Append(COMMAND_INFO, _("Series Info")); default : menu.Append(COMMAND_REMOVE, _("Remove")); break; } PopupMenu(&menu, ScreenToClient(pos)); } } /// /** */ void McPanel::OnChoiceOutput(wxCommandEvent& event) { if (m_output_type != mpOutputChooser->GetSelection()) { m_output_type = mpOutputChooser->GetSelection(); mpConverter->SetOutput(m_output_type); mpOutputCtrl->SetOutputter(mpConverter->GetOutputter()); mpOutputCtrl->SetItemTextColour(mpOutputCtrl->GetRootItem(), mpOutputCtrl->GetForegroundColour()); } } /// /** */ void McPanel::OnSourceSelect(wxTreeEvent& event) { // I think we used to enable/disable buttons here... } /// /** */ void McPanel::OnOutputSelect(wxTreeEvent& event) { // Only do anything if this is a "select" event wxTreeItemId item = mpOutputCtrl->GetSelection(); if (item.IsOk()) { SetPathInfo(mpOutputCtrl->GetStringSelection()); mpSourceCtrl->UnselectAll(); } } /// /** */ void McPanel::OnEditBegin(wxTreeEvent& event) { } /// /** */ void McPanel::OnEditEnd(wxTreeEvent& event) { if (!event.IsEditCancelled()) { SetPathInfo(event.GetLabel()); } } /// /** Handler for adding user-chosen set of files. */ void McPanel::OnAddFiles(wxCommandEvent& event) { wxString lastDir; wxConfig::Get()->Read(CFG_lastdir, &lastDir); wxFileDialog dlg(this, _("Choose files"), lastDir, _T(""), _("*"), wxFD_OPEN|wxFD_MULTIPLE|wxRESIZE_BORDER); if (dlg.ShowModal() == wxID_OK) { wxBusyCursor busy; wxLogStatus(_("Searching directories...")); wxArrayString files; dlg.GetPaths(files); mAddSomeFilesDialog(files); // These three lines permit saving the user's last directory // in their config file. wxFileName fn(files[0]); lastDir = fn.GetPath(); wxConfig::Get()->Write(CFG_lastdir, lastDir); mpConverter->UpdateOutput(); wxLogStatus(_("Creating tree...")); RefreshSourceCtrl(); ResetOutput(); } wxLogStatus(_("Finished.")); ShowMessageBox(); ::wxGetTopLevelParent(this)->Raise(); } // Fix: handle dropping dirs too /// /** Handler for drag-and-drop. */ void McPanel::OnDropFiles(wxDropFilesEvent& event) { int nfiles = event.GetNumberOfFiles(); wxString* dropfiles = event.GetFiles(); for (int i = 0; i < nfiles; ++i) { wxFileName filename(dropfiles[i]); if (filename.FileExists()) { mpConverter->AddFile(filename.GetFullPath()); } else if (filename.DirExists()) { wxArrayString files; wxDir::GetAllFiles(filename.GetFullPath(), &files); mAddSomeFilesDialog(files); } } mpConverter->UpdateOutput(); ResetOutput(); RefreshSourceCtrl(); ShowMessageBox(); ::wxGetTopLevelParent(this)->Raise(); } /// /** Handler for adding files from a user-chosen directory. */ void McPanel::OnAddDir(wxCommandEvent& event) { wxString lastDir; wxConfig::Get()->Read(CFG_lastdir, &lastDir); wxDirDialog dlg(this, _("Select a directory of files to convert"), lastDir, wxRESIZE_BORDER); if (dlg.ShowModal() == wxID_OK) { wxBusyCursor busy; wxLogStatus(_("Searching directories...")); wxArrayString files; wxDir::GetAllFiles(dlg.GetPath(), &files); mAddSomeFilesDialog(files); lastDir = dlg.GetPath(); wxConfig::Get()->Write(CFG_lastdir, dlg.GetPath()); //mpConverter->UpdateOutput(); //RefreshSourceCtrl(); //ResetOutput(); } // The next three lines should happen only on wxID_OK... mpConverter->UpdateOutput(); ResetOutput(); RefreshSourceCtrl(); wxLogStatus(_("Finished.")); ShowMessageBox(); ::wxGetTopLevelParent(this)->Raise(); } /// /** Shows DICOM header information for selected items. */ void McPanel::OnDicom(wxCommandEvent& event) { wxArrayTreeItemIds selecteds; unsigned int n_selected = mpSourceCtrl->GetSelected(selecteds); for (unsigned int i = 0; i < n_selected; ++i) { if (mpSourceCtrl->GetItemType(selecteds[i]) == dtFILE) { wxString filename = mpSourceCtrl->GetStringSelection(selecteds[i]); DicomViewer* viewer = new DicomViewer(this, filename.mb_str(wxConvLocal)); viewer->Show(); } } } /// /** Shows DICOM image for selected items. */ void McPanel::OnImage(wxCommandEvent& event) { wxArrayTreeItemIds selecteds; unsigned int n_selected = mpSourceCtrl->GetSelected(selecteds); for (unsigned int i = 0; i < n_selected; ++i) { if (mpSourceCtrl->GetItemType(selecteds[i]) == dtFILE) { wxString filename = mpSourceCtrl->GetStringSelection(selecteds[i]); DicomFile dfile(filename.mb_str(wxConvLocal)); int frames = 1; dfile.Find("NumberOfFrames", frames); if (frames > 1) { MultiFrameImageViewer* viewer = new MultiFrameImageViewer(this, filename); viewer->Show(); } else { std::vector filenames = mpSourceCtrl->GetFilesInSeries(selecteds[i]); ImageViewer* viewer = new ImageViewer(this, filenames, filename); viewer->Show(); } } // Blank the status bar. wxLogStatus(_T("")); } } /// /** Shows Series information for selected items. */ void McPanel::OnInfo(wxCommandEvent& event) { wxTreeItemId selected; wxArrayTreeItemIds selecteds; unsigned int n_selected = mpSourceCtrl->GetSelected(selecteds); for (unsigned int i = 0; i < n_selected; ++i) { wxTreeItemId selection = selecteds[i]; int type = mpSourceCtrl->GetItemType(selection); if ((type == dtSERIES) || (type == dtFILE)) { wxBusyCursor busy; std::string series_uid; if (type == dtSERIES) { series_uid = mpSourceCtrl->GetItemUid(selection); } else if (type == dtFILE) { wxTreeItemId series = mpSourceCtrl->GetItemParent(selection); series_uid = mpSourceCtrl->GetItemUid(series); } std::vector info = mpConverter->GetStringInfo(series_uid); InfoFrame* infoFrame = new InfoFrame(this, info); infoFrame->Show(); } } } /// /** Processes removal of item(s) selected in the list of added DICOM files and directories. */ void McPanel::OnRemove(wxCommandEvent& event) { wxTreeItemId selected; wxArrayTreeItemIds selecteds; unsigned int n_selected = mpSourceCtrl->GetSelected(selecteds); for (unsigned int i = 0; i < n_selected; ++i) { selected = selecteds[i]; if (selected.IsOk()) { if (mpSourceCtrl->GetSelectionType() == dtFILE) { wxLogError(_("Sorry, you'll have to remove the whole series.")); return; } std::vector series_vector = mpSourceCtrl->GetChildSeries(selected); std::vector::iterator it = series_vector.begin(); std::vector::iterator it_end = series_vector.end(); for (; it < it_end; ++it) { mpConverter->RemoveSeries(*it); mpOutputCtrl->RemoveSeries(*it); } mpSourceCtrl->RemoveBranch(selected); } else { return; } } } /// /** */ void McPanel::OnOptions(wxCommandEvent& event) { if (ShowOptionsDlg(m_output_type, mpConverter->GetOutputter())) { mpConverter->UpdateAllOutput(); ResetOutput(); } } /// /** */ void McPanel::OnDirectory(wxCommandEvent& event) { mpOutputCtrl->ChooseRootDir(); } /// /** */ void McPanel::OnNew(wxCommandEvent& event) { delete mpConverter; mpConverter = new Converter(m_output_type); mpSourceCtrl->Reset(); mpOutputCtrl->Reset(); mpOutputCtrl->SetOutputter(mpConverter->GetOutputter()); mpOutputCtrl->SetItemTextColour(mpOutputCtrl->GetRootItem(), mpOutputCtrl->GetForegroundColour()); } /// /** */ void McPanel::OnConvert(wxCommandEvent& event) { wxWindowDisabler disableAll; wxBusyCursor cursor; wxBusyInfo wait(_("Converting files, please wait...")); mpConverter->ConvertAll(); wxLogStatus(_("Finished.")); ShowMessageBox(); ::wxGetTopLevelParent(this)->Raise(); } /// /** */ void McPanel::OnRename(wxCommandEvent& event) { mpOutputCtrl->OnMenuRename(event); wxString pathInfo = mpOutputCtrl->GetStringSelection(); if (pathInfo != _T("error")) { SetPathInfo(pathInfo); } } /// /** */ void McPanel::OnMenuOverride() { wxCommandEvent nullEvent(0,0); mpOutputCtrl->OnMenuOverride(nullEvent); } /// /** */ void McPanel::OnOverride(const std::string& seriesUid) { if (ShowOverride(m_output_type, mpConverter->GetOutputter(), seriesUid)) { mpConverter->UpdateAllOutput(); ResetOutput(); } } /// /** */ bool McPanel::ShowOptionsDlg(int type, OutputterBase* outputter) { bool needsRebuild = false; switch (type) { case OutputFactory::SPM : { SpmOptionsDlg* dlg = new SpmOptionsDlg(dynamic_cast(outputter)); if (dlg->ShowModal() == wxID_OK) { needsRebuild = dlg->NeedsRebuild(); } dlg->Destroy(); } break; case OutputFactory::META : { MetaOptionsDlg* dlg = new MetaOptionsDlg(dynamic_cast(outputter)); if (dlg->ShowModal() == wxID_OK) { needsRebuild = dlg->NeedsRebuild(); } dlg->Destroy(); } break; case OutputFactory::NIFTI : { NiftiOptionsDlg* dlg = new NiftiOptionsDlg(dynamic_cast(outputter)); if (dlg->ShowModal() == wxID_OK) { needsRebuild = dlg->NeedsRebuild(); } dlg->Destroy(); } break; case OutputFactory::ANALYZE : { AnalyzeOptionsDlg* dlg = new AnalyzeOptionsDlg(dynamic_cast(outputter)); if (dlg->ShowModal() == wxID_OK) { needsRebuild = dlg->NeedsRebuild(); } dlg->Destroy(); } break; case OutputFactory::FSL : { NiftiOptionsDlg* dlg = new NiftiOptionsDlg(dynamic_cast(outputter)); if (dlg->ShowModal() == wxID_OK) { needsRebuild = dlg->NeedsRebuild(); } dlg->Destroy(); } break; case OutputFactory::BV : { BvOptionsDlg* dlg = new BvOptionsDlg(dynamic_cast(outputter)); if (dlg->ShowModal() == wxID_OK) { needsRebuild = dlg->NeedsRebuild(); } dlg->Destroy(); } break; default : { NoOptionsDlg* dlg = new NoOptionsDlg(); dlg->ShowModal(); dlg->Destroy(); } } return needsRebuild; } /// /** */ bool McPanel::ShowOverride(int type, OutputterBase* outputter, const std::string& series_uid) { bool needsRebuild = false; if (type == OutputFactory::BV) { wxLogMessage(_("It is not possible to override default options for BrainVoyager output.")); return needsRebuild; } Basic3DOutputter* basicOutputter = dynamic_cast(outputter); OverrideDlg dlg; dlg.dimCheck->SetValue(basicOutputter->GetDimensionality(series_uid) == 4); dlg.skipSpin->SetValue(basicOutputter->GetSkip(series_uid)); if (dlg.ShowModal() == wxID_OK) { if (dlg.dimCheck->GetValue()) { basicOutputter->SetDimensionality(series_uid, 4); } else { basicOutputter->SetDimensionality(series_uid, 3); } basicOutputter->SetSkip(series_uid, dlg.skipSpin->GetValue()); needsRebuild = true; } return needsRebuild; } mriconvert/OutputFactory.cpp0000640000175000000620000000246112542632317015614 0ustar stevestaff/// OutputFactory.cpp /** */ #include "OutputFactory.h" using namespace jcs; OutputterBase* OutputFactory::CreateNewOutputter(int type) { OutputterBase* pOutputter; switch (type) { case SPM : pOutputter = new NewSpmOutputter(); break; case META : pOutputter = new NewMetaOutputter(); break; case NIFTI : pOutputter = new NiftiOutputter(); break; case ANALYZE : pOutputter = new AnalyzeOutputter(); break; case FSL : pOutputter = new FslNiftiOutputter(); break; case BV : pOutputter = new NewBvOutputter(); break; default : pOutputter = new NewSpmOutputter(); } return pOutputter; } const char* OutputFactory::GetDescription(int type) { switch (type) { case SPM : return "SPM Analyze"; case META: return "Meta Image"; case NIFTI: return "NIfTI"; case ANALYZE: return "Analyze 7.5"; case FSL: return "FSL NIfTI"; case BV: return "BrainVoyager"; default : return "Unknown type"; } } const char* OutputFactory::GetShortDescription(int type) { switch (type) { case SPM : return "spm"; case META: return "meta"; case NIFTI: return "nifti"; case ANALYZE: return "analyze"; case FSL: return "fsl"; case BV: return "bv"; default : return "Unknown type"; } } mriconvert/OutputTreeNew.h0000640000175000000620000000721612542632310015217 0ustar stevestaff/// OutputTreeNew.h /** Classes used to display the folder heirarchy and list of files to be produced. */ #ifndef OUTPUT_TREE_NEW_H #define OUTPUT_TREE_NEW_H #include #include #include #include #include "OutputList.h" class McPanel; namespace jcs { class NewOutputTreeCtrl; class OutputTreeState; class OutputterBase; class OutputTreeItemData : public wxTreeItemData { public: OutputTreeItemData(const std::string& uid, NewOutputTreeCtrl& treeCtrl) : mUid(uid), mTreeCtrl(treeCtrl) {} virtual void FillContextMenu(wxMenu& menu); virtual void OnRename() = 0; virtual bool IsEditable() = 0; const std::string& GetUid() const { return mUid; } virtual std::string GetSeriesUid() const { return ""; } protected: NewOutputTreeCtrl& mTreeCtrl; private: const std::string mUid; }; // only 3 item types: root, file, dir class DirItem : public OutputTreeItemData { public: DirItem(const std::string& uid, NewOutputTreeCtrl& treeCtrl) : OutputTreeItemData(uid, treeCtrl) {} virtual bool IsEditable() { return true; } virtual void OnRename(); }; class FileItem : public OutputTreeItemData { public: FileItem(const std::string& uid, NewOutputTreeCtrl& treeCtrl) : OutputTreeItemData(uid, treeCtrl) {} virtual bool IsEditable() { return false; } virtual void OnRename(); std::string GetSeriesUid() const { return mSeriesUid; } void SetSeriesUid(const std::string& uid) { mSeriesUid = uid; } const std::string& GetPrefix() const { return mPrefix; } void SetPrefix(const std::string& prefix) { mPrefix = prefix; } virtual void FillContextMenu(wxMenu& menu); private: std::string mSeriesUid; std::string mPrefix; }; class RootItem : public OutputTreeItemData { public: RootItem(const char* uid, NewOutputTreeCtrl& treeCtrl) : OutputTreeItemData(uid, treeCtrl) {} virtual bool IsEditable() { return false; } virtual void OnRename(); }; class NewOutputTreeCtrl : public wxTreeCtrl { public: NewOutputTreeCtrl(McPanel* parent, wxWindowID id, const wxString& root); ~NewOutputTreeCtrl(); wxTreeItemId FindTreeItem(wxTreeItemId parent, const std::string& uid); void Reset(); void RemoveBranch(wxTreeItemId branch); void RenameFiles(std::string series_uid, std::string prefix); void RenameDir(wxTreeItemId diritem); std::map GetOutDirs(); void SplitDirectories(bool split = true) {} void SplitSubjects(bool split = true) {} void OnContextMenu(wxTreeEvent& event); void OnContextMenuTest(wxContextMenuEvent& event); void OnMenuOverride(wxCommandEvent& event); void OnMenuOptions(wxCommandEvent& event); void OnMenuRename(wxCommandEvent& event); void OnEditBegin(wxTreeEvent& event); void SetOutputter(OutputterBase* outputter); void RefreshList(); void RemoveSeries(const std::string& seriesUid); void ChooseRootDir(); void SetRoot(const wxString& text); enum { folder_icon, open_folder_icon, file_icon }; // temporary? int GetItemType(const wxTreeItemId& item) const; int GetSelectionType() const; wxString GetStringSelection() const; std::string GetPrefix(const wxTreeItemId& item) const { return ""; } OutputterBase* mOutputter; protected: DECLARE_EVENT_TABLE() private: bool HasVisibleRoot(); void CreateImageList(int size = 16); void CheckChildren(wxTreeItemId& item, std::vector& items, const std::string& seriesUid); McPanel* parentPanel; }; } // end namespace jcs #endif mriconvert/ReadStream.h0000640000175000000620000000251112542632317014454 0ustar stevestaff/// ReadStream.h /** */ #ifndef READSTREAM_H_ #define READSTREAM_H_ #include #include #include #include // Functions for reading a specific length of bytes, // as a specific type, returned as a vector of strings namespace jcs { // todo: add byte swapping template struct ReadStream { static std::vector doit(std::istream& in, std::streamsize length) { T value; std::vector v; std::streamsize bytes_read = 0; while (bytes_read < length) { if ((length - bytes_read) < sizeof(value)) { in.read(reinterpret_cast (&value), (length - bytes_read)); } else { in.read(reinterpret_cast (&value), sizeof(value)); } std::stringstream ss; ss << value; std::string new_value; ss >> new_value; v.push_back(new_value); bytes_read += in.gcount(); } return v; } }; template<> struct ReadStream { static std::vector doit(std::istream& in, std::streamsize length) { std::vector v; v.push_back(std::string()); v.front().reserve(length); for (int i = 0; in.good() && i < length; ++i ) v.front().push_back(in.get()); return v; } }; } #endif mriconvert/nifti1.h0000750000175000000620000020424012542632310013615 0ustar stevestaff/** \file nifti1.h \brief Official definition of the nifti1 header. Written by Bob Cox, SSCC, NIMH. */ #ifndef _NIFTI_HEADER_ #define _NIFTI_HEADER_ /***************************************************************************** ** This file defines the "NIFTI-1" header format. ** ** It is derived from 2 meetings at the NIH (31 Mar 2003 and ** ** 02 Sep 2003) of the Data Format Working Group (DFWG), ** ** chartered by the NIfTI (Neuroimaging Informatics Technology ** ** Initiative) at the National Institutes of Health (NIH). ** **--------------------------------------------------------------** ** Neither the National Institutes of Health (NIH), the DFWG, ** ** nor any of the members or employees of these institutions ** ** imply any warranty of usefulness of this material for any ** ** purpose, and do not assume any liability for damages, ** ** incidental or otherwise, caused by any use of this document. ** ** If these conditions are not acceptable, do not use this! ** **--------------------------------------------------------------** ** Author: Robert W Cox (NIMH, Bethesda) ** ** Advisors: John Ashburner (FIL, London), ** ** Stephen Smith (FMRIB, Oxford), ** ** Mark Jenkinson (FMRIB, Oxford) ** ******************************************************************************/ /*---------------------------------------------------------------------------*/ /* Note that the ANALYZE 7.5 file header (dbh.h) is (c) Copyright 1986-1995 Biomedical Imaging Resource Mayo Foundation Incorporation of components of dbh.h are by permission of the Mayo Foundation. Changes from the ANALYZE 7.5 file header in this file are released to the public domain, including the functional comments and any amusing asides. -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /*! INTRODUCTION TO NIFTI-1: ------------------------ The twin (and somewhat conflicting) goals of this modified ANALYZE 7.5 format are: (a) To add information to the header that will be useful for functional neuroimaging data analysis and display. These additions include: - More basic data types. - Two affine transformations to specify voxel coordinates. - "Intent" codes and parameters to describe the meaning of the data. - Affine scaling of the stored data values to their "true" values. - Optional storage of the header and image data in one file (.nii). (b) To maintain compatibility with non-NIFTI-aware ANALYZE 7.5 compatible software (i.e., such a program should be able to do something useful with a NIFTI-1 dataset -- at least, with one stored in a traditional .img/.hdr file pair). Most of the unused fields in the ANALYZE 7.5 header have been taken, and some of the lesser-used fields have been co-opted for other purposes. Notably, most of the data_history substructure has been co-opted for other purposes, since the ANALYZE 7.5 format describes this substructure as "not required". NIFTI-1 FLAG (MAGIC STRINGS): ---------------------------- To flag such a struct as being conformant to the NIFTI-1 spec, the last 4 bytes of the header must be either the C String "ni1" or "n+1"; in hexadecimal, the 4 bytes 6E 69 31 00 or 6E 2B 31 00 (in any future version of this format, the '1' will be upgraded to '2', etc.). Normally, such a "magic number" or flag goes at the start of the file, but trying to avoid clobbering widely-used ANALYZE 7.5 fields led to putting this marker last. However, recall that "the last shall be first" (Matthew 20:16). If a NIFTI-aware program reads a header file that is NOT marked with a NIFTI magic string, then it should treat the header as an ANALYZE 7.5 structure. NIFTI-1 FILE STORAGE: -------------------- "ni1" means that the image data is stored in the ".img" file corresponding to the header file (starting at file offset 0). "n+1" means that the image data is stored in the same file as the header information. We recommend that the combined header+data filename suffix be ".nii". When the dataset is stored in one file, the first byte of image data is stored at byte location (int)vox_offset in this combined file. The minimum allowed value of vox_offset is 352; for compatibility with some software, vox_offset should be an integral multiple of 16. GRACE UNDER FIRE: ---------------- Most NIFTI-aware programs will only be able to handle a subset of the full range of datasets possible with this format. All NIFTI-aware programs should take care to check if an input dataset conforms to the program's needs and expectations (e.g., check datatype, intent_code, etc.). If the input dataset can't be handled by the program, the program should fail gracefully (e.g., print a useful warning; not crash). SAMPLE CODES: ------------ The associated files nifti1_io.h and nifti1_io.c provide a sample implementation in C of a set of functions to read, write, and manipulate NIFTI-1 files. The file nifti1_test.c is a sample program that uses the nifti1_io.c functions. -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* HEADER STRUCT DECLARATION: ------------------------- In the comments below for each field, only NIFTI-1 specific requirements or changes from the ANALYZE 7.5 format are described. For convenience, the 348 byte header is described as a single struct, rather than as the ANALYZE 7.5 group of 3 substructs. Further comments about the interpretation of various elements of this header are after the data type definition itself. Fields that are marked as ++UNUSED++ have no particular interpretation in this standard. (Also see the UNUSED FIELDS comment section, far below.) The presumption below is that the various C types have particular sizes: sizeof(int) = sizeof(float) = 4 ; sizeof(short) = 2 -----------------------------------------------------------------------------*/ /*=================*/ #ifdef __cplusplus extern "C" { #endif /*=================*/ /*! \struct nifti_1_header \brief Data structure defining the fields in the nifti1 header. This binary header should be found at the beginning of a valid NIFTI-1 header file. */ /*************************/ /************************/ struct nifti_1_header { /* NIFTI-1 usage */ /* ANALYZE 7.5 field(s) */ /*************************/ /************************/ /*--- was header_key substruct ---*/ int sizeof_hdr; /*!< MUST be 348 */ /* int sizeof_hdr; */ char data_type[10]; /*!< ++UNUSED++ */ /* char data_type[10]; */ char db_name[18]; /*!< ++UNUSED++ */ /* char db_name[18]; */ int extents; /*!< ++UNUSED++ */ /* int extents; */ short session_error; /*!< ++UNUSED++ */ /* short session_error; */ char regular; /*!< ++UNUSED++ */ /* char regular; */ char dim_info; /*!< MRI slice ordering. */ /* char hkey_un0; */ /*--- was image_dimension substruct ---*/ short dim[8]; /*!< Data array dimensions.*/ /* short dim[8]; */ float intent_p1 ; /*!< 1st intent parameter. */ /* short unused8; */ /* short unused9; */ float intent_p2 ; /*!< 2nd intent parameter. */ /* short unused10; */ /* short unused11; */ float intent_p3 ; /*!< 3rd intent parameter. */ /* short unused12; */ /* short unused13; */ short intent_code ; /*!< NIFTI_INTENT_* code. */ /* short unused14; */ short datatype; /*!< Defines data type! */ /* short datatype; */ short bitpix; /*!< Number bits/voxel. */ /* short bitpix; */ short slice_start; /*!< First slice index. */ /* short dim_un0; */ float pixdim[8]; /*!< Grid spacings. */ /* float pixdim[8]; */ float vox_offset; /*!< Offset into .nii file */ /* float vox_offset; */ float scl_slope ; /*!< Data scaling: slope. */ /* float funused1; */ float scl_inter ; /*!< Data scaling: offset. */ /* float funused2; */ short slice_end; /*!< Last slice index. */ /* float funused3; */ char slice_code ; /*!< Slice timing order. */ char xyzt_units ; /*!< Units of pixdim[1..4] */ float cal_max; /*!< Max display intensity */ /* float cal_max; */ float cal_min; /*!< Min display intensity */ /* float cal_min; */ float slice_duration;/*!< Time for 1 slice. */ /* float compressed; */ float toffset; /*!< Time axis shift. */ /* float verified; */ int glmax; /*!< ++UNUSED++ */ /* int glmax; */ int glmin; /*!< ++UNUSED++ */ /* int glmin; */ /*--- was data_history substruct ---*/ char descrip[80]; /*!< any text you like. */ /* char descrip[80]; */ char aux_file[24]; /*!< auxiliary filename. */ /* char aux_file[24]; */ short qform_code ; /*!< NIFTI_XFORM_* code. */ /*-- all ANALYZE 7.5 ---*/ short sform_code ; /*!< NIFTI_XFORM_* code. */ /* fields below here */ /* are replaced */ float quatern_b ; /*!< Quaternion b param. */ float quatern_c ; /*!< Quaternion c param. */ float quatern_d ; /*!< Quaternion d param. */ float qoffset_x ; /*!< Quaternion x shift. */ float qoffset_y ; /*!< Quaternion y shift. */ float qoffset_z ; /*!< Quaternion z shift. */ float srow_x[4] ; /*!< 1st row affine transform. */ float srow_y[4] ; /*!< 2nd row affine transform. */ float srow_z[4] ; /*!< 3rd row affine transform. */ char intent_name[16];/*!< 'name' or meaning of data. */ char magic[4] ; /*!< MUST be "ni1\0" or "n+1\0". */ } ; /**** 348 bytes total ****/ typedef struct nifti_1_header nifti_1_header ; /*---------------------------------------------------------------------------*/ /* HEADER EXTENSIONS: ----------------- After the end of the 348 byte header (e.g., after the magic field), the next 4 bytes are a char array field named "extension". By default, all 4 bytes of this array should be set to zero. In a .nii file, these 4 bytes will always be present, since the earliest start point for the image data is byte #352. In a separate .hdr file, these bytes may or may not be present. If not present (i.e., if the length of the .hdr file is 348 bytes), then a NIfTI-1 compliant program should use the default value of extension={0,0,0,0}. The first byte (extension[0]) is the only value of this array that is specified at present. The other 3 bytes are reserved for future use. If extension[0] is nonzero, it indicates that extended header information is present in the bytes following the extension array. In a .nii file, this extended header data is before the image data (and vox_offset must be set correctly to allow for this). In a .hdr file, this extended data follows extension and proceeds (potentially) to the end of the file. The format of extended header data is weakly specified. Each extension must be an integer multiple of 16 bytes long. The first 8 bytes of each extension comprise 2 integers: int esize , ecode ; These values may need to be byte-swapped, as indicated by dim[0] for the rest of the header. * esize is the number of bytes that form the extended header data + esize must be a positive integral multiple of 16 + this length includes the 8 bytes of esize and ecode themselves * ecode is a non-negative integer that indicates the format of the extended header data that follows + different ecode values are assigned to different developer groups + at present, the "registered" values for code are = 0 = unknown private format (not recommended!) = 2 = DICOM format (i.e., attribute tags and values) = 4 = AFNI group (i.e., ASCII XML-ish elements) In the interests of interoperability (a primary rationale for NIfTI), groups developing software that uses this extension mechanism are encouraged to document and publicize the format of their extensions. To this end, the NIfTI DFWG will assign even numbered codes upon request to groups submitting at least rudimentary documentation for the format of their extension; at present, the contact is mailto:rwcox@nih.gov. The assigned codes and documentation will be posted on the NIfTI website. All odd values of ecode (and 0) will remain unassigned; at least, until the even ones are used up, when we get to 2,147,483,646. Note that the other contents of the extended header data section are totally unspecified by the NIfTI-1 standard. In particular, if binary data is stored in such a section, its byte order is not necessarily the same as that given by examining dim[0]; it is incumbent on the programs dealing with such data to determine the byte order of binary extended header data. Multiple extended header sections are allowed, each starting with an esize,ecode value pair. The first esize value, as described above, is at bytes #352-355 in the .hdr or .nii file (files start at byte #0). If this value is positive, then the second (esize2) will be found starting at byte #352+esize1 , the third (esize3) at byte #352+esize1+esize2, et cetera. Of course, in a .nii file, the value of vox_offset must be compatible with these extensions. If a malformed file indicates that an extended header data section would run past vox_offset, then the entire extended header section should be ignored. In a .hdr file, if an extended header data section would run past the end-of-file, that extended header data should also be ignored. With the above scheme, a program can successively examine the esize and ecode values, and skip over each extended header section if the program doesn't know how to interpret the data within. Of course, any program can simply ignore all extended header sections simply by jumping straight to the image data using vox_offset. -----------------------------------------------------------------------------*/ /*! \struct nifti1_extender \brief This structure represents a 4-byte string that should follow the binary nifti_1_header data in a NIFTI-1 header file. If the char values are {1,0,0,0}, the file is expected to contain extensions, values of {0,0,0,0} imply the file does not contain extensions. Other sequences of values are not currently defined. */ struct nifti1_extender { char extension[4] ; } ; typedef struct nifti1_extender nifti1_extender ; /*! \struct nifti1_extension \brief Data structure defining the fields of a header extension. */ struct nifti1_extension { int esize ; /*!< size of extension, in bytes (must be multiple of 16) */ int ecode ; /*!< extension code, one of the NIFTI_ECODE_ values */ char * edata ; /*!< raw data, with no byte swapping */ } ; typedef struct nifti1_extension nifti1_extension ; /*---------------------------------------------------------------------------*/ /* DATA DIMENSIONALITY (as in ANALYZE 7.5): --------------------------------------- dim[0] = number of dimensions; - if dim[0] is outside range 1..7, then the header information needs to be byte swapped appropriately - ANALYZE supports dim[0] up to 7, but NIFTI-1 reserves dimensions 1,2,3 for space (x,y,z), 4 for time (t), and 5,6,7 for anything else needed. dim[i] = length of dimension #i, for i=1..dim[0] (must be positive) - also see the discussion of intent_code, far below pixdim[i] = voxel width along dimension #i, i=1..dim[0] (positive) - cf. ORIENTATION section below for use of pixdim[0] - the units of pixdim can be specified with the xyzt_units field (also described far below). Number of bits per voxel value is in bitpix, which MUST correspond with the datatype field. The total number of bytes in the image data is dim[1] * ... * dim[dim[0]] * bitpix / 8 In NIFTI-1 files, dimensions 1,2,3 are for space, dimension 4 is for time, and dimension 5 is for storing multiple values at each spatiotemporal voxel. Some examples: - A typical whole-brain FMRI experiment's time series: - dim[0] = 4 - dim[1] = 64 pixdim[1] = 3.75 xyzt_units = NIFTI_UNITS_MM - dim[2] = 64 pixdim[2] = 3.75 | NIFTI_UNITS_SEC - dim[3] = 20 pixdim[3] = 5.0 - dim[4] = 120 pixdim[4] = 2.0 - A typical T1-weighted anatomical volume: - dim[0] = 3 - dim[1] = 256 pixdim[1] = 1.0 xyzt_units = NIFTI_UNITS_MM - dim[2] = 256 pixdim[2] = 1.0 - dim[3] = 128 pixdim[3] = 1.1 - A single slice EPI time series: - dim[0] = 4 - dim[1] = 64 pixdim[1] = 3.75 xyzt_units = NIFTI_UNITS_MM - dim[2] = 64 pixdim[2] = 3.75 | NIFTI_UNITS_SEC - dim[3] = 1 pixdim[3] = 5.0 - dim[4] = 1200 pixdim[4] = 0.2 - A 3-vector stored at each point in a 3D volume: - dim[0] = 5 - dim[1] = 256 pixdim[1] = 1.0 xyzt_units = NIFTI_UNITS_MM - dim[2] = 256 pixdim[2] = 1.0 - dim[3] = 128 pixdim[3] = 1.1 - dim[4] = 1 pixdim[4] = 0.0 - dim[5] = 3 intent_code = NIFTI_INTENT_VECTOR - A single time series with a 3x3 matrix at each point: - dim[0] = 5 - dim[1] = 1 xyzt_units = NIFTI_UNITS_SEC - dim[2] = 1 - dim[3] = 1 - dim[4] = 1200 pixdim[4] = 0.2 - dim[5] = 9 intent_code = NIFTI_INTENT_GENMATRIX - intent_p1 = intent_p2 = 3.0 (indicates matrix dimensions) -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* DATA STORAGE: ------------ If the magic field is "n+1", then the voxel data is stored in the same file as the header. In this case, the voxel data starts at offset (int)vox_offset into the header file. Thus, vox_offset=352.0 means that the data starts immediately after the NIFTI-1 header. If vox_offset is greater than 352, the NIFTI-1 format does not say much about the contents of the dataset file between the end of the header and the start of the data. FILES: ----- If the magic field is "ni1", then the voxel data is stored in the associated ".img" file, starting at offset 0 (i.e., vox_offset is not used in this case, and should be set to 0.0). When storing NIFTI-1 datasets in pairs of files, it is customary to name the files in the pattern "name.hdr" and "name.img", as in ANALYZE 7.5. When storing in a single file ("n+1"), the file name should be in the form "name.nii" (the ".nft" and ".nif" suffixes are already taken; cf. http://www.icdatamaster.com/n.html ). BYTE ORDERING: ------------- The byte order of the data arrays is presumed to be the same as the byte order of the header (which is determined by examining dim[0]). Floating point types are presumed to be stored in IEEE-754 format. -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* DETAILS ABOUT vox_offset: ------------------------ In a .nii file, the vox_offset field value is interpreted as the start location of the image data bytes in that file. In a .hdr/.img file pair, the vox_offset field value is the start location of the image data bytes in the .img file. * If vox_offset is less than 352 in a .nii file, it is equivalent to 352 (i.e., image data never starts before byte #352 in a .nii file). * The default value for vox_offset in a .nii file is 352. * In a .hdr file, the default value for vox_offset is 0. * vox_offset should be an integer multiple of 16; otherwise, some programs may not work properly (e.g., SPM). This is to allow memory-mapped input to be properly byte-aligned. Note that since vox_offset is an IEEE-754 32 bit float (for compatibility with the ANALYZE-7.5 format), it effectively has a 24 bit mantissa. All integers from 0 to 2^24 can be represented exactly in this format, but not all larger integers are exactly storable as IEEE-754 32 bit floats. However, unless you plan to have vox_offset be potentially larger than 16 MB, this should not be an issue. (Actually, any integral multiple of 16 up to 2^27 can be represented exactly in this format, which allows for up to 128 MB of random information before the image data. If that isn't enough, then perhaps this format isn't right for you.) In a .img file (i.e., image data stored separately from the NIfTI-1 header), data bytes between #0 and #vox_offset-1 (inclusive) are completely undefined and unregulated by the NIfTI-1 standard. One potential use of having vox_offset > 0 in the .hdr/.img file pair storage method is to make the .img file be a copy of (or link to) a pre-existing image file in some other format, such as DICOM; then vox_offset would be set to the offset of the image data in this file. (It may not be possible to follow the "multiple-of-16 rule" with an arbitrary external file; using the NIfTI-1 format in such a case may lead to a file that is incompatible with software that relies on vox_offset being a multiple of 16.) In a .nii file, data bytes between #348 and #vox_offset-1 (inclusive) may be used to store user-defined extra information; similarly, in a .hdr file, any data bytes after byte #347 are available for user-defined extra information. The (very weak) regulation of this extra header data is described elsewhere. -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* DATA SCALING: ------------ If the scl_slope field is nonzero, then each voxel value in the dataset should be scaled as y = scl_slope * x + scl_inter where x = voxel value stored y = "true" voxel value Normally, we would expect this scaling to be used to store "true" floating values in a smaller integer datatype, but that is not required. That is, it is legal to use scaling even if the datatype is a float type (crazy, perhaps, but legal). - However, the scaling is to be ignored if datatype is DT_RGB24. - If datatype is a complex type, then the scaling is to be applied to both the real and imaginary parts. The cal_min and cal_max fields (if nonzero) are used for mapping (possibly scaled) dataset values to display colors: - Minimum display intensity (black) corresponds to dataset value cal_min. - Maximum display intensity (white) corresponds to dataset value cal_max. - Dataset values below cal_min should display as black also, and values above cal_max as white. - Colors "black" and "white", of course, may refer to any scalar display scheme (e.g., a color lookup table specified via aux_file). - cal_min and cal_max only make sense when applied to scalar-valued datasets (i.e., dim[0] < 5 or dim[5] = 1). -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* TYPE OF DATA (acceptable values for datatype field): --------------------------------------------------- Values of datatype smaller than 256 are ANALYZE 7.5 compatible. Larger values are NIFTI-1 additions. These are all multiples of 256, so that no bits below position 8 are set in datatype. But there is no need to use only powers-of-2, as the original ANALYZE 7.5 datatype codes do. The additional codes are intended to include a complete list of basic scalar types, including signed and unsigned integers from 8 to 64 bits, floats from 32 to 128 bits, and complex (float pairs) from 64 to 256 bits. Note that most programs will support only a few of these datatypes! A NIFTI-1 program should fail gracefully (e.g., print a warning message) when it encounters a dataset with a type it doesn't like. -----------------------------------------------------------------------------*/ #undef DT_UNKNOWN /* defined in dirent.h on some Unix systems */ /*! \defgroup NIFTI1_DATATYPES \brief nifti1 datatype codes @{ */ /*--- the original ANALYZE 7.5 type codes ---*/ #define DT_NONE 0 #define DT_UNKNOWN 0 /* what it says, dude */ #define DT_BINARY 1 /* binary (1 bit/voxel) */ #define DT_UNSIGNED_CHAR 2 /* unsigned char (8 bits/voxel) */ #define DT_SIGNED_SHORT 4 /* signed short (16 bits/voxel) */ #define DT_SIGNED_INT 8 /* signed int (32 bits/voxel) */ #define DT_FLOAT 16 /* float (32 bits/voxel) */ #define DT_COMPLEX 32 /* complex (64 bits/voxel) */ #define DT_DOUBLE 64 /* double (64 bits/voxel) */ #define DT_RGB 128 /* RGB triple (24 bits/voxel) */ #define DT_ALL 255 /* not very useful (?) */ /*----- another set of names for the same ---*/ #define DT_UINT8 2 #define DT_INT16 4 #define DT_INT32 8 #define DT_FLOAT32 16 #define DT_COMPLEX64 32 #define DT_FLOAT64 64 #define DT_RGB24 128 /*------------------- new codes for NIFTI ---*/ #define DT_INT8 256 /* signed char (8 bits) */ #define DT_UINT16 512 /* unsigned short (16 bits) */ #define DT_UINT32 768 /* unsigned int (32 bits) */ #define DT_INT64 1024 /* long long (64 bits) */ #define DT_UINT64 1280 /* unsigned long long (64 bits) */ #define DT_FLOAT128 1536 /* long double (128 bits) */ #define DT_COMPLEX128 1792 /* double pair (128 bits) */ #define DT_COMPLEX256 2048 /* long double pair (256 bits) */ /* @} */ /*------- aliases for all the above codes ---*/ /*! \defgroup NIFTI1_DATATYPE_ALIASES \brief aliases for the nifti1 datatype codes @{ */ /*! unsigned char. */ #define NIFTI_TYPE_UINT8 2 /*! signed short. */ #define NIFTI_TYPE_INT16 4 /*! signed int. */ #define NIFTI_TYPE_INT32 8 /*! 32 bit float. */ #define NIFTI_TYPE_FLOAT32 16 /*! 64 bit complex = 2 32 bit floats. */ #define NIFTI_TYPE_COMPLEX64 32 /*! 64 bit float = double. */ #define NIFTI_TYPE_FLOAT64 64 /*! 3 8 bit bytes. */ #define NIFTI_TYPE_RGB24 128 /*! signed char. */ #define NIFTI_TYPE_INT8 256 /*! unsigned short. */ #define NIFTI_TYPE_UINT16 512 /*! unsigned int. */ #define NIFTI_TYPE_UINT32 768 /*! signed long long. */ #define NIFTI_TYPE_INT64 1024 /*! unsigned long long. */ #define NIFTI_TYPE_UINT64 1280 /*! 128 bit float = long double. */ #define NIFTI_TYPE_FLOAT128 1536 /*! 128 bit complex = 2 64 bit floats. */ #define NIFTI_TYPE_COMPLEX128 1792 /*! 256 bit complex = 2 128 bit floats */ #define NIFTI_TYPE_COMPLEX256 2048 /* @} */ /*-------- sample typedefs for complicated types ---*/ #if 0 typedef struct { float r,i; } complex_float ; typedef struct { double r,i; } complex_double ; typedef struct { long double r,i; } complex_longdouble ; typedef struct { unsigned char r,g,b; } rgb_byte ; #endif /*---------------------------------------------------------------------------*/ /* INTERPRETATION OF VOXEL DATA: ---------------------------- The intent_code field can be used to indicate that the voxel data has some particular meaning. In particular, a large number of codes is given to indicate that the the voxel data should be interpreted as being drawn from a given probability distribution. VECTOR-VALUED DATASETS: ---------------------- The 5th dimension of the dataset, if present (i.e., dim[0]=5 and dim[5] > 1), contains multiple values (e.g., a vector) to be stored at each spatiotemporal location. For example, the header values - dim[0] = 5 - dim[1] = 64 - dim[2] = 64 - dim[3] = 20 - dim[4] = 1 (indicates no time axis) - dim[5] = 3 - datatype = DT_FLOAT - intent_code = NIFTI_INTENT_VECTOR mean that this dataset should be interpreted as a 3D volume (64x64x20), with a 3-vector of floats defined at each point in the 3D grid. A program reading a dataset with a 5th dimension may want to reformat the image data to store each voxels' set of values together in a struct or array. This programming detail, however, is beyond the scope of the NIFTI-1 file specification! Uses of dimensions 6 and 7 are also not specified here. STATISTICAL PARAMETRIC DATASETS (i.e., SPMs): -------------------------------------------- Values of intent_code from NIFTI_FIRST_STATCODE to NIFTI_LAST_STATCODE (inclusive) indicate that the numbers in the dataset should be interpreted as being drawn from a given distribution. Most such distributions have auxiliary parameters (e.g., NIFTI_INTENT_TTEST has 1 DOF parameter). If the dataset DOES NOT have a 5th dimension, then the auxiliary parameters are the same for each voxel, and are given in header fields intent_p1, intent_p2, and intent_p3. If the dataset DOES have a 5th dimension, then the auxiliary parameters are different for each voxel. For example, the header values - dim[0] = 5 - dim[1] = 128 - dim[2] = 128 - dim[3] = 1 (indicates a single slice) - dim[4] = 1 (indicates no time axis) - dim[5] = 2 - datatype = DT_FLOAT - intent_code = NIFTI_INTENT_TTEST mean that this is a 2D dataset (128x128) of t-statistics, with the t-statistic being in the first "plane" of data and the degrees-of-freedom parameter being in the second "plane" of data. If the dataset 5th dimension is used to store the voxel-wise statistical parameters, then dim[5] must be 1 plus the number of parameters required by that distribution (e.g., intent_code=NIFTI_INTENT_TTEST implies dim[5] must be 2, as in the example just above). Note: intent_code values 2..10 are compatible with AFNI 1.5x (which is why there is no code with value=1, which is obsolescent in AFNI). OTHER INTENTIONS: ---------------- The purpose of the intent_* fields is to help interpret the values stored in the dataset. Some non-statistical values for intent_code and conventions are provided for storing other complex data types. The intent_name field provides space for a 15 character (plus 0 byte) 'name' string for the type of data stored. Examples: - intent_code = NIFTI_INTENT_ESTIMATE; intent_name = "T1"; could be used to signify that the voxel values are estimates of the NMR parameter T1. - intent_code = NIFTI_INTENT_TTEST; intent_name = "House"; could be used to signify that the voxel values are t-statistics for the significance of 'activation' response to a House stimulus. - intent_code = NIFTI_INTENT_DISPVECT; intent_name = "ToMNI152"; could be used to signify that the voxel values are a displacement vector that transforms each voxel (x,y,z) location to the corresponding location in the MNI152 standard brain. - intent_code = NIFTI_INTENT_SYMMATRIX; intent_name = "DTI"; could be used to signify that the voxel values comprise a diffusion tensor image. If no data name is implied or needed, intent_name[0] should be set to 0. -----------------------------------------------------------------------------*/ /*! default: no intention is indicated in the header. */ #define NIFTI_INTENT_NONE 0 /*-------- These codes are for probability distributions ---------------*/ /* Most distributions have a number of parameters, below denoted by p1, p2, and p3, and stored in - intent_p1, intent_p2, intent_p3 if dataset doesn't have 5th dimension - image data array if dataset does have 5th dimension Functions to compute with many of the distributions below can be found in the CDF library from U Texas. Formulas for and discussions of these distributions can be found in the following books: [U] Univariate Discrete Distributions, NL Johnson, S Kotz, AW Kemp. [C1] Continuous Univariate Distributions, vol. 1, NL Johnson, S Kotz, N Balakrishnan. [C2] Continuous Univariate Distributions, vol. 2, NL Johnson, S Kotz, N Balakrishnan. */ /*----------------------------------------------------------------------*/ /*! [C2, chap 32] Correlation coefficient R (1 param): p1 = degrees of freedom R/sqrt(1-R*R) is t-distributed with p1 DOF. */ /*! \defgroup NIFTI1_INTENT_CODES \brief nifti1 intent codes, to describe intended meaning of dataset contents @{ */ #define NIFTI_INTENT_CORREL 2 /*! [C2, chap 28] Student t statistic (1 param): p1 = DOF. */ #define NIFTI_INTENT_TTEST 3 /*! [C2, chap 27] Fisher F statistic (2 params): p1 = numerator DOF, p2 = denominator DOF. */ #define NIFTI_INTENT_FTEST 4 /*! [C1, chap 13] Standard normal (0 params): Density = N(0,1). */ #define NIFTI_INTENT_ZSCORE 5 /*! [C1, chap 18] Chi-squared (1 param): p1 = DOF. Density(x) proportional to exp(-x/2) * x^(p1/2-1). */ #define NIFTI_INTENT_CHISQ 6 /*! [C2, chap 25] Beta distribution (2 params): p1=a, p2=b. Density(x) proportional to x^(a-1) * (1-x)^(b-1). */ #define NIFTI_INTENT_BETA 7 /*! [U, chap 3] Binomial distribution (2 params): p1 = number of trials, p2 = probability per trial. Prob(x) = (p1 choose x) * p2^x * (1-p2)^(p1-x), for x=0,1,...,p1. */ #define NIFTI_INTENT_BINOM 8 /*! [C1, chap 17] Gamma distribution (2 params): p1 = shape, p2 = scale. Density(x) proportional to x^(p1-1) * exp(-p2*x). */ #define NIFTI_INTENT_GAMMA 9 /*! [U, chap 4] Poisson distribution (1 param): p1 = mean. Prob(x) = exp(-p1) * p1^x / x! , for x=0,1,2,.... */ #define NIFTI_INTENT_POISSON 10 /*! [C1, chap 13] Normal distribution (2 params): p1 = mean, p2 = standard deviation. */ #define NIFTI_INTENT_NORMAL 11 /*! [C2, chap 30] Noncentral F statistic (3 params): p1 = numerator DOF, p2 = denominator DOF, p3 = numerator noncentrality parameter. */ #define NIFTI_INTENT_FTEST_NONC 12 /*! [C2, chap 29] Noncentral chi-squared statistic (2 params): p1 = DOF, p2 = noncentrality parameter. */ #define NIFTI_INTENT_CHISQ_NONC 13 /*! [C2, chap 23] Logistic distribution (2 params): p1 = location, p2 = scale. Density(x) proportional to sech^2((x-p1)/(2*p2)). */ #define NIFTI_INTENT_LOGISTIC 14 /*! [C2, chap 24] Laplace distribution (2 params): p1 = location, p2 = scale. Density(x) proportional to exp(-abs(x-p1)/p2). */ #define NIFTI_INTENT_LAPLACE 15 /*! [C2, chap 26] Uniform distribution: p1 = lower end, p2 = upper end. */ #define NIFTI_INTENT_UNIFORM 16 /*! [C2, chap 31] Noncentral t statistic (2 params): p1 = DOF, p2 = noncentrality parameter. */ #define NIFTI_INTENT_TTEST_NONC 17 /*! [C1, chap 21] Weibull distribution (3 params): p1 = location, p2 = scale, p3 = power. Density(x) proportional to ((x-p1)/p2)^(p3-1) * exp(-((x-p1)/p2)^p3) for x > p1. */ #define NIFTI_INTENT_WEIBULL 18 /*! [C1, chap 18] Chi distribution (1 param): p1 = DOF. Density(x) proportional to x^(p1-1) * exp(-x^2/2) for x > 0. p1 = 1 = 'half normal' distribution p1 = 2 = Rayleigh distribution p1 = 3 = Maxwell-Boltzmann distribution. */ #define NIFTI_INTENT_CHI 19 /*! [C1, chap 15] Inverse Gaussian (2 params): p1 = mu, p2 = lambda Density(x) proportional to exp(-p2*(x-p1)^2/(2*p1^2*x)) / x^3 for x > 0. */ #define NIFTI_INTENT_INVGAUSS 20 /*! [C2, chap 22] Extreme value type I (2 params): p1 = location, p2 = scale cdf(x) = exp(-exp(-(x-p1)/p2)). */ #define NIFTI_INTENT_EXTVAL 21 /*! Data is a 'p-value' (no params). */ #define NIFTI_INTENT_PVAL 22 /*! Data is ln(p-value) (no params). To be safe, a program should compute p = exp(-abs(this_value)). The nifti_stats.c library returns this_value as positive, so that this_value = -log(p). */ #define NIFTI_INTENT_LOGPVAL 23 /*! Data is log10(p-value) (no params). To be safe, a program should compute p = pow(10.,-abs(this_value)). The nifti_stats.c library returns this_value as positive, so that this_value = -log10(p). */ #define NIFTI_INTENT_LOG10PVAL 24 /*! Smallest intent_code that indicates a statistic. */ #define NIFTI_FIRST_STATCODE 2 /*! Largest intent_code that indicates a statistic. */ #define NIFTI_LAST_STATCODE 24 /*---------- these values for intent_code aren't for statistics ----------*/ /*! To signify that the value at each voxel is an estimate of some parameter, set intent_code = NIFTI_INTENT_ESTIMATE. The name of the parameter may be stored in intent_name. */ #define NIFTI_INTENT_ESTIMATE 1001 /*! To signify that the value at each voxel is an index into some set of labels, set intent_code = NIFTI_INTENT_LABEL. The filename with the labels may stored in aux_file. */ #define NIFTI_INTENT_LABEL 1002 /*! To signify that the value at each voxel is an index into the NeuroNames labels set, set intent_code = NIFTI_INTENT_NEURONAME. */ #define NIFTI_INTENT_NEURONAME 1003 /*! To store an M x N matrix at each voxel: - dataset must have a 5th dimension (dim[0]=5 and dim[5]>1) - intent_code must be NIFTI_INTENT_GENMATRIX - dim[5] must be M*N - intent_p1 must be M (in float format) - intent_p2 must be N (ditto) - the matrix values A[i][[j] are stored in row-order: - A[0][0] A[0][1] ... A[0][N-1] - A[1][0] A[1][1] ... A[1][N-1] - etc., until - A[M-1][0] A[M-1][1] ... A[M-1][N-1] */ #define NIFTI_INTENT_GENMATRIX 1004 /*! To store an NxN symmetric matrix at each voxel: - dataset must have a 5th dimension - intent_code must be NIFTI_INTENT_SYMMATRIX - dim[5] must be N*(N+1)/2 - intent_p1 must be N (in float format) - the matrix values A[i][[j] are stored in row-order: - A[0][0] - A[1][0] A[1][1] - A[2][0] A[2][1] A[2][2] - etc.: row-by-row */ #define NIFTI_INTENT_SYMMATRIX 1005 /*! To signify that the vector value at each voxel is to be taken as a displacement field or vector: - dataset must have a 5th dimension - intent_code must be NIFTI_INTENT_DISPVECT - dim[5] must be the dimensionality of the displacment vector (e.g., 3 for spatial displacement, 2 for in-plane) */ #define NIFTI_INTENT_DISPVECT 1006 /* specifically for displacements */ #define NIFTI_INTENT_VECTOR 1007 /* for any other type of vector */ /*! To signify that the vector value at each voxel is really a spatial coordinate (e.g., the vertices or nodes of a surface mesh): - dataset must have a 5th dimension - intent_code must be NIFTI_INTENT_POINTSET - dim[0] = 5 - dim[1] = number of points - dim[2] = dim[3] = dim[4] = 1 - dim[5] must be the dimensionality of space (e.g., 3 => 3D space). - intent_name may describe the object these points come from (e.g., "pial", "gray/white" , "EEG", "MEG"). */ #define NIFTI_INTENT_POINTSET 1008 /*! To signify that the vector value at each voxel is really a triple of indexes (e.g., forming a triangle) from a pointset dataset: - dataset must have a 5th dimension - intent_code must be NIFTI_INTENT_TRIANGLE - dim[0] = 5 - dim[1] = number of triangles - dim[2] = dim[3] = dim[4] = 1 - dim[5] = 3 - datatype should be an integer type (preferably DT_INT32) - the data values are indexes (0,1,...) into a pointset dataset. */ #define NIFTI_INTENT_TRIANGLE 1009 /*! To signify that the vector value at each voxel is a quaternion: - dataset must have a 5th dimension - intent_code must be NIFTI_INTENT_QUATERNION - dim[0] = 5 - dim[5] = 4 - datatype should be a floating point type */ #define NIFTI_INTENT_QUATERNION 1010 /*! Dimensionless value - no params - although, as in _ESTIMATE the name of the parameter may be stored in intent_name. */ #define NIFTI_INTENT_DIMLESS 1011 /* @} */ /*---------------------------------------------------------------------------*/ /* 3D IMAGE (VOLUME) ORIENTATION AND Location IN SPACE: --------------------------------------------------- There are 3 different methods by which continuous coordinates can attached to voxels. The discussion below emphasizes 3D volumes, and the continuous coordinates are referred to as (x,y,z). The voxel index coordinates (i.e., the array indexes) are referred to as (i,j,k), with valid ranges: i = 0 .. dim[1]-1 j = 0 .. dim[2]-1 (if dim[0] >= 2) k = 0 .. dim[3]-1 (if dim[0] >= 3) The (x,y,z) coordinates refer to the CENTER of a voxel. In methods 2 and 3, the (x,y,z) axes refer to a subject-based coordinate system, with +x = Right +y = Anterior +z = Superior. This is a right-handed coordinate system. However, the exact direction these axes point with respect to the subject depends on qform_code (Method 2) and sform_code (Method 3). N.B.: The i index varies most rapidly, j index next, k index slowest. Thus, voxel (i,j,k) is stored starting at location (i + j*dim[1] + k*dim[1]*dim[2]) * (bitpix/8) into the dataset array. N.B.: The ANALYZE 7.5 coordinate system is +x = Left +y = Anterior +z = Superior which is a left-handed coordinate system. This backwardness is too difficult to tolerate, so this NIFTI-1 standard specifies the coordinate order which is most common in functional neuroimaging. N.B.: The 3 methods below all give the locations of the voxel centers in the (x,y,z) coordinate system. In many cases, programs will wish to display image data on some other grid. In such a case, the program will need to convert its desired (x,y,z) values into (i,j,k) values in order to extract (or interpolate) the image data. This operation would be done with the inverse transformation to those described below. N.B.: Method 2 uses a factor 'qfac' which is either -1 or 1; qfac is stored in the otherwise unused pixdim[0]. If pixdim[0]=0.0 (which should not occur), we take qfac=1. Of course, pixdim[0] is only used when reading a NIFTI-1 header, not when reading an ANALYZE 7.5 header. N.B.: The units of (x,y,z) can be specified using the xyzt_units field. METHOD 1 (the "old" way, used only when qform_code = 0): ------------------------------------------------------- The coordinate mapping from (i,j,k) to (x,y,z) is the ANALYZE 7.5 way. This is a simple scaling relationship: x = pixdim[1] * i y = pixdim[2] * j z = pixdim[3] * k No particular spatial orientation is attached to these (x,y,z) coordinates. (NIFTI-1 does not have the ANALYZE 7.5 orient field, which is not general and is often not set properly.) This method is not recommended, and is present mainly for compatibility with ANALYZE 7.5 files. METHOD 2 (used when qform_code > 0, which should be the "normal" case): --------------------------------------------------------------------- The (x,y,z) coordinates are given by the pixdim[] scales, a rotation matrix, and a shift. This method is intended to represent "scanner-anatomical" coordinates, which are often embedded in the image header (e.g., DICOM fields (0020,0032), (0020,0037), (0028,0030), and (0018,0050)), and represent the nominal orientation and location of the data. This method can also be used to represent "aligned" coordinates, which would typically result from some post-acquisition alignment of the volume to a standard orientation (e.g., the same subject on another day, or a rigid rotation to true anatomical orientation from the tilted position of the subject in the scanner). The formula for (x,y,z) in terms of header parameters and (i,j,k) is: [ x ] [ R11 R12 R13 ] [ pixdim[1] * i ] [ qoffset_x ] [ y ] = [ R21 R22 R23 ] [ pixdim[2] * j ] + [ qoffset_y ] [ z ] [ R31 R32 R33 ] [ qfac * pixdim[3] * k ] [ qoffset_z ] The qoffset_* shifts are in the NIFTI-1 header. Note that the center of the (i,j,k)=(0,0,0) voxel (first value in the dataset array) is just (x,y,z)=(qoffset_x,qoffset_y,qoffset_z). The rotation matrix R is calculated from the quatern_* parameters. This calculation is described below. The scaling factor qfac is either 1 or -1. The rotation matrix R defined by the quaternion parameters is "proper" (has determinant 1). This may not fit the needs of the data; for example, if the image grid is i increases from Left-to-Right j increases from Anterior-to-Posterior k increases from Inferior-to-Superior Then (i,j,k) is a left-handed triple. In this example, if qfac=1, the R matrix would have to be [ 1 0 0 ] [ 0 -1 0 ] which is "improper" (determinant = -1). [ 0 0 1 ] If we set qfac=-1, then the R matrix would be [ 1 0 0 ] [ 0 -1 0 ] which is proper. [ 0 0 -1 ] This R matrix is represented by quaternion [a,b,c,d] = [0,1,0,0] (which encodes a 180 degree rotation about the x-axis). METHOD 3 (used when sform_code > 0): ----------------------------------- The (x,y,z) coordinates are given by a general affine transformation of the (i,j,k) indexes: x = srow_x[0] * i + srow_x[1] * j + srow_x[2] * k + srow_x[3] y = srow_y[0] * i + srow_y[1] * j + srow_y[2] * k + srow_y[3] z = srow_z[0] * i + srow_z[1] * j + srow_z[2] * k + srow_z[3] The srow_* vectors are in the NIFTI_1 header. Note that no use is made of pixdim[] in this method. WHY 3 METHODS? -------------- Method 1 is provided only for backwards compatibility. The intention is that Method 2 (qform_code > 0) represents the nominal voxel locations as reported by the scanner, or as rotated to some fiducial orientation and location. Method 3, if present (sform_code > 0), is to be used to give the location of the voxels in some standard space. The sform_code indicates which standard space is present. Both methods 2 and 3 can be present, and be useful in different contexts (method 2 for displaying the data on its original grid; method 3 for displaying it on a standard grid). In this scheme, a dataset would originally be set up so that the Method 2 coordinates represent what the scanner reported. Later, a registration to some standard space can be computed and inserted in the header. Image display software can use either transform, depending on its purposes and needs. In Method 2, the origin of coordinates would generally be whatever the scanner origin is; for example, in MRI, (0,0,0) is the center of the gradient coil. In Method 3, the origin of coordinates would depend on the value of sform_code; for example, for the Talairach coordinate system, (0,0,0) corresponds to the Anterior Commissure. QUATERNION REPRESENTATION OF ROTATION MATRIX (METHOD 2) ------------------------------------------------------- The orientation of the (x,y,z) axes relative to the (i,j,k) axes in 3D space is specified using a unit quaternion [a,b,c,d], where a*a+b*b+c*c+d*d=1. The (b,c,d) values are all that is needed, since we require that a = sqrt(1.0-(b*b+c*c+d*d)) be nonnegative. The (b,c,d) values are stored in the (quatern_b,quatern_c,quatern_d) fields. The quaternion representation is chosen for its compactness in representing rotations. The (proper) 3x3 rotation matrix that corresponds to [a,b,c,d] is [ a*a+b*b-c*c-d*d 2*b*c-2*a*d 2*b*d+2*a*c ] R = [ 2*b*c+2*a*d a*a+c*c-b*b-d*d 2*c*d-2*a*b ] [ 2*b*d-2*a*c 2*c*d+2*a*b a*a+d*d-c*c-b*b ] [ R11 R12 R13 ] = [ R21 R22 R23 ] [ R31 R32 R33 ] If (p,q,r) is a unit 3-vector, then rotation of angle h about that direction is represented by the quaternion [a,b,c,d] = [cos(h/2), p*sin(h/2), q*sin(h/2), r*sin(h/2)]. Requiring a >= 0 is equivalent to requiring -Pi <= h <= Pi. (Note that [-a,-b,-c,-d] represents the same rotation as [a,b,c,d]; there are 2 quaternions that can be used to represent a given rotation matrix R.) To rotate a 3-vector (x,y,z) using quaternions, we compute the quaternion product [0,x',y',z'] = [a,b,c,d] * [0,x,y,z] * [a,-b,-c,-d] which is equivalent to the matrix-vector multiply [ x' ] [ x ] [ y' ] = R [ y ] (equivalence depends on a*a+b*b+c*c+d*d=1) [ z' ] [ z ] Multiplication of 2 quaternions is defined by the following: [a,b,c,d] = a*1 + b*I + c*J + d*K where I*I = J*J = K*K = -1 (I,J,K are square roots of -1) I*J = K J*K = I K*I = J J*I = -K K*J = -I I*K = -J (not commutative!) For example [a,b,0,0] * [0,0,0,1] = [0,0,-b,a] since this expands to (a+b*I)*(K) = (a*K+b*I*K) = (a*K-b*J). The above formula shows how to go from quaternion (b,c,d) to rotation matrix and direction cosines. Conversely, given R, we can compute the fields for the NIFTI-1 header by a = 0.5 * sqrt(1+R11+R22+R33) (not stored) b = 0.25 * (R32-R23) / a => quatern_b c = 0.25 * (R13-R31) / a => quatern_c d = 0.25 * (R21-R12) / a => quatern_d If a=0 (a 180 degree rotation), alternative formulas are needed. See the nifti1_io.c function mat44_to_quatern() for an implementation of the various cases in converting R to [a,b,c,d]. Note that R-transpose (= R-inverse) would lead to the quaternion [a,-b,-c,-d]. The choice to specify the qoffset_x (etc.) values in the final coordinate system is partly to make it easy to convert DICOM images to this format. The DICOM attribute "Image Position (Patient)" (0020,0032) stores the (Xd,Yd,Zd) coordinates of the center of the first voxel. Here, (Xd,Yd,Zd) refer to DICOM coordinates, and Xd=-x, Yd=-y, Zd=z, where (x,y,z) refers to the NIFTI coordinate system discussed above. (i.e., DICOM +Xd is Left, +Yd is Posterior, +Zd is Superior, whereas +x is Right, +y is Anterior , +z is Superior. ) Thus, if the (0020,0032) DICOM attribute is extracted into (px,py,pz), then qoffset_x = -px qoffset_y = -py qoffset_z = pz is a reasonable setting when qform_code=NIFTI_XFORM_SCANNER_ANAT. That is, DICOM's coordinate system is 180 degrees rotated about the z-axis from the neuroscience/NIFTI coordinate system. To transform between DICOM and NIFTI, you just have to negate the x- and y-coordinates. The DICOM attribute (0020,0037) "Image Orientation (Patient)" gives the orientation of the x- and y-axes of the image data in terms of 2 3-vectors. The first vector is a unit vector along the x-axis, and the second is along the y-axis. If the (0020,0037) attribute is extracted into the value (xa,xb,xc,ya,yb,yc), then the first two columns of the R matrix would be [ -xa -ya ] [ -xb -yb ] [ xc yc ] The negations are because DICOM's x- and y-axes are reversed relative to NIFTI's. The third column of the R matrix gives the direction of displacement (relative to the subject) along the slice-wise direction. This orientation is not encoded in the DICOM standard in a simple way; DICOM is mostly concerned with 2D images. The third column of R will be either the cross-product of the first 2 columns or its negative. It is possible to infer the sign of the 3rd column by examining the coordinates in DICOM attribute (0020,0032) "Image Position (Patient)" for successive slices. However, this method occasionally fails for reasons that I (RW Cox) do not understand. -----------------------------------------------------------------------------*/ /* [qs]form_code value: */ /* x,y,z coordinate system refers to: */ /*-----------------------*/ /*---------------------------------------*/ /*! \defgroup NIFTI1_XFORM_CODES \brief nifti1 xform codes to describe the "standard" coordinate system @{ */ /*! Arbitrary coordinates (Method 1). */ #define NIFTI_XFORM_UNKNOWN 0 /*! Scanner-based anatomical coordinates */ #define NIFTI_XFORM_SCANNER_ANAT 1 /*! Coordinates aligned to another file's, or to anatomical "truth". */ #define NIFTI_XFORM_ALIGNED_ANAT 2 /*! Coordinates aligned to Talairach- Tournoux Atlas; (0,0,0)=AC, etc. */ #define NIFTI_XFORM_TALAIRACH 3 /*! MNI 152 normalized coordinates. */ #define NIFTI_XFORM_MNI_152 4 /* @} */ /*---------------------------------------------------------------------------*/ /* UNITS OF SPATIAL AND TEMPORAL DIMENSIONS: ---------------------------------------- The codes below can be used in xyzt_units to indicate the units of pixdim. As noted earlier, dimensions 1,2,3 are for x,y,z; dimension 4 is for time (t). - If dim[4]=1 or dim[0] < 4, there is no time axis. - A single time series (no space) would be specified with - dim[0] = 4 (for scalar data) or dim[0] = 5 (for vector data) - dim[1] = dim[2] = dim[3] = 1 - dim[4] = number of time points - pixdim[4] = time step - xyzt_units indicates units of pixdim[4] - dim[5] = number of values stored at each time point Bits 0..2 of xyzt_units specify the units of pixdim[1..3] (e.g., spatial units are values 1..7). Bits 3..5 of xyzt_units specify the units of pixdim[4] (e.g., temporal units are multiples of 8). This compression of 2 distinct concepts into 1 byte is due to the limited space available in the 348 byte ANALYZE 7.5 header. The macros XYZT_TO_SPACE and XYZT_TO_TIME can be used to mask off the undesired bits from the xyzt_units fields, leaving "pure" space and time codes. Inversely, the macro SPACE_TIME_TO_XYZT can be used to assemble a space code (0,1,2,...,7) with a time code (0,8,16,32,...,56) into the combined value for xyzt_units. Note that codes are provided to indicate the "time" axis units are actually frequency in Hertz (_HZ), in part-per-million (_PPM) or in radians-per-second (_RADS). The toffset field can be used to indicate a nonzero start point for the time axis. That is, time point #m is at t=toffset+m*pixdim[4] for m=0..dim[4]-1. -----------------------------------------------------------------------------*/ /*! \defgroup NIFTI1_UNITS \brief nifti1 units codes to describe the unit of measurement for each dimension of the dataset @{ */ /*! NIFTI code for unspecified units. */ #define NIFTI_UNITS_UNKNOWN 0 /** Space codes are multiples of 1. **/ /*! NIFTI code for meters. */ #define NIFTI_UNITS_METER 1 /*! NIFTI code for millimeters. */ #define NIFTI_UNITS_MM 2 /*! NIFTI code for micrometers. */ #define NIFTI_UNITS_MICRON 3 /** Time codes are multiples of 8. **/ /*! NIFTI code for seconds. */ #define NIFTI_UNITS_SEC 8 /*! NIFTI code for milliseconds. */ #define NIFTI_UNITS_MSEC 16 /*! NIFTI code for microseconds. */ #define NIFTI_UNITS_USEC 24 /*** These units are for spectral data: ***/ /*! NIFTI code for Hertz. */ #define NIFTI_UNITS_HZ 32 /*! NIFTI code for ppm. */ #define NIFTI_UNITS_PPM 40 /*! NIFTI code for radians per second. */ #define NIFTI_UNITS_RADS 48 /* @} */ #undef XYZT_TO_SPACE #undef XYZT_TO_TIME #define XYZT_TO_SPACE(xyzt) ( (xyzt) & 0x07 ) #define XYZT_TO_TIME(xyzt) ( (xyzt) & 0x38 ) #undef SPACE_TIME_TO_XYZT #define SPACE_TIME_TO_XYZT(ss,tt) ( (((char)(ss)) & 0x07) \ | (((char)(tt)) & 0x38) ) /*---------------------------------------------------------------------------*/ /* MRI-SPECIFIC SPATIAL AND TEMPORAL INFORMATION: --------------------------------------------- A few fields are provided to store some extra information that is sometimes important when storing the image data from an FMRI time series experiment. (After processing such data into statistical images, these fields are not likely to be useful.) { freq_dim } = These fields encode which spatial dimension (1,2, or 3) { phase_dim } = corresponds to which acquisition dimension for MRI data. { slice_dim } = Examples: Rectangular scan multi-slice EPI: freq_dim = 1 phase_dim = 2 slice_dim = 3 (or some permutation) Spiral scan multi-slice EPI: freq_dim = phase_dim = 0 slice_dim = 3 since the concepts of frequency- and phase-encoding directions don't apply to spiral scan slice_duration = If this is positive, AND if slice_dim is nonzero, indicates the amount of time used to acquire 1 slice. slice_duration*dim[slice_dim] can be less than pixdim[4] with a clustered acquisition method, for example. slice_code = If this is nonzero, AND if slice_dim is nonzero, AND if slice_duration is positive, indicates the timing pattern of the slice acquisition. The following codes are defined: NIFTI_SLICE_SEQ_INC == sequential increasing NIFTI_SLICE_SEQ_DEC == sequential decreasing NIFTI_SLICE_ALT_INC == alternating increasing NIFTI_SLICE_ALT_DEC == alternating decreasing NIFTI_SLICE_ALT_INC2 == alternating increasing #2 NIFTI_SLICE_ALT_DEC2 == alternating decreasing #2 { slice_start } = Indicates the start and end of the slice acquisition { slice_end } = pattern, when slice_code is nonzero. These values are present to allow for the possible addition of "padded" slices at either end of the volume, which don't fit into the slice timing pattern. If there are no padding slices, then slice_start=0 and slice_end=dim[slice_dim]-1 are the correct values. For these values to be meaningful, slice_start must be non-negative and slice_end must be greater than slice_start. Otherwise, they should be ignored. The following table indicates the slice timing pattern, relative to time=0 for the first slice acquired, for some sample cases. Here, dim[slice_dim]=7 (there are 7 slices, labeled 0..6), slice_duration=0.1, and slice_start=1, slice_end=5 (1 padded slice on each end). slice index SEQ_INC SEQ_DEC ALT_INC ALT_DEC ALT_INC2 ALT_DEC2 6 : n/a n/a n/a n/a n/a n/a n/a = not applicable 5 : 0.4 0.0 0.2 0.0 0.4 0.2 (slice time offset 4 : 0.3 0.1 0.4 0.3 0.1 0.0 doesn't apply to 3 : 0.2 0.2 0.1 0.1 0.3 0.3 slices outside 2 : 0.1 0.3 0.3 0.4 0.0 0.1 the range 1 : 0.0 0.4 0.0 0.2 0.2 0.4 slice_start .. 0 : n/a n/a n/a n/a n/a n/a slice_end) The SEQ slice_codes are sequential ordering (uncommon but not unknown), either increasing in slice number or decreasing (INC or DEC), as illustrated above. The ALT slice codes are alternating ordering. The 'standard' way for these to operate (without the '2' on the end) is for the slice timing to start at the edge of the slice_start .. slice_end group (at slice_start for INC and at slice_end for DEC). For the 'ALT_*2' slice_codes, the slice timing instead starts at the first slice in from the edge (at slice_start+1 for INC2 and at slice_end-1 for DEC2). This latter acquisition scheme is found on some Siemens scanners. The fields freq_dim, phase_dim, slice_dim are all squished into the single byte field dim_info (2 bits each, since the values for each field are limited to the range 0..3). This unpleasantness is due to lack of space in the 348 byte allowance. The macros DIM_INFO_TO_FREQ_DIM, DIM_INFO_TO_PHASE_DIM, and DIM_INFO_TO_SLICE_DIM can be used to extract these values from the dim_info byte. The macro FPS_INTO_DIM_INFO can be used to put these 3 values into the dim_info byte. -----------------------------------------------------------------------------*/ #undef DIM_INFO_TO_FREQ_DIM #undef DIM_INFO_TO_PHASE_DIM #undef DIM_INFO_TO_SLICE_DIM #define DIM_INFO_TO_FREQ_DIM(di) ( ((di) ) & 0x03 ) #define DIM_INFO_TO_PHASE_DIM(di) ( ((di) >> 2) & 0x03 ) #define DIM_INFO_TO_SLICE_DIM(di) ( ((di) >> 4) & 0x03 ) #undef FPS_INTO_DIM_INFO #define FPS_INTO_DIM_INFO(fd,pd,sd) ( ( ( ((char)(fd)) & 0x03) ) | \ ( ( ((char)(pd)) & 0x03) << 2 ) | \ ( ( ((char)(sd)) & 0x03) << 4 ) ) /*! \defgroup NIFTI1_SLICE_ORDER \brief nifti1 slice order codes, describing the acquisition order of the slices @{ */ #define NIFTI_SLICE_UNKNOWN 0 #define NIFTI_SLICE_SEQ_INC 1 #define NIFTI_SLICE_SEQ_DEC 2 #define NIFTI_SLICE_ALT_INC 3 #define NIFTI_SLICE_ALT_DEC 4 #define NIFTI_SLICE_ALT_INC2 5 /* 05 May 2005: RWCox */ #define NIFTI_SLICE_ALT_DEC2 6 /* 05 May 2005: RWCox */ /* @} */ /*---------------------------------------------------------------------------*/ /* UNUSED FIELDS: ------------- Some of the ANALYZE 7.5 fields marked as ++UNUSED++ may need to be set to particular values for compatibility with other programs. The issue of interoperability of ANALYZE 7.5 files is a murky one -- not all programs require exactly the same set of fields. (Unobscuring this murkiness is a principal motivation behind NIFTI-1.) Some of the fields that may need to be set for other (non-NIFTI aware) software to be happy are: extents dbh.h says this should be 16384 regular dbh.h says this should be the character 'r' glmin, } dbh.h says these values should be the min and max voxel glmax } values for the entire dataset It is best to initialize ALL fields in the NIFTI-1 header to 0 (e.g., with calloc()), then fill in what is needed. -----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* MISCELLANEOUS C MACROS -----------------------------------------------------------------------------*/ /*.................*/ /*! Given a nifti_1_header struct, check if it has a good magic number. Returns NIFTI version number (1..9) if magic is good, 0 if it is not. */ #define NIFTI_VERSION(h) \ ( ( (h).magic[0]=='n' && (h).magic[3]=='\0' && \ ( (h).magic[1]=='i' || (h).magic[1]=='+' ) && \ ( (h).magic[2]>='1' && (h).magic[2]<='9' ) ) \ ? (h).magic[2]-'0' : 0 ) /*.................*/ /*! Check if a nifti_1_header struct says if the data is stored in the same file or in a separate file. Returns 1 if the data is in the same file as the header, 0 if it is not. */ #define NIFTI_ONEFILE(h) ( (h).magic[1] == '+' ) /*.................*/ /*! Check if a nifti_1_header struct needs to be byte swapped. Returns 1 if it needs to be swapped, 0 if it does not. */ #define NIFTI_NEEDS_SWAP(h) ( (h).dim[0] < 0 || (h).dim[0] > 7 ) /*.................*/ /*! Check if a nifti_1_header struct contains a 5th (vector) dimension. Returns size of 5th dimension if > 1, returns 0 otherwise. */ #define NIFTI_5TH_DIM(h) ( ((h).dim[0]>4 && (h).dim[5]>1) ? (h).dim[5] : 0 ) /*****************************************************************************/ /*=================*/ #ifdef __cplusplus } #endif /*=================*/ #endif /* _NIFTI_HEADER_ */ mriconvert/CMakeLists.txt0000640000175000000620000001536512542632333015025 0ustar stevestaff##################################################### ## CMakeLists.txt for MRIConvert and mcverter ##################################################### PROJECT(MRIConvert) cmake_minimum_required( VERSION 2.8 ) if (WIN32) set( wxWidgets_ROOT_DIR C:/wxWidgets-3.0.0 ) add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS) else (WIN32) set( wxWidgets_ROOT_DIR /usr ) ## Uncomment for gnu debug. ##set( CMAKE_CXX_FLAGS " -ggdb ${CMAKE_CXX_FLAGS} " ) endif (WIN32) set( wxWidgets_USE_DEBUG OFF ) set( wxWidgets_USE_UNICODE ON ) set( wxWidgets_USE_SHARED OFF ) set( wxWidgets_USE_UNIVERSAL OFF ) set(CMAKE_VERBOSE_MAKEFILE TRUE) set(EXECUTABLE_OUTPUT_PATH "release") ## Setup for wxWidgets, order is important, see ## http://docs.wxwidgets.org/stable/wx_librarieslist.html set( wxWidgets_USE_LIBS adv core base ) find_package(wxWidgets REQUIRED) if (wxWidgets_FOUND) include( ${wxWidgets_USE_FILE} ) endif (wxWidgets_FOUND) message ( "wxWidgets libraries: ${wxWidgets_LIBRARIES}" ) message( "System name ${CMAKE_HOST_SYSTEM_NAME}" ) if ( ${CMAKE_HOST_APPLE} ) message( "OS X build" ) set( CMAKE_OSX_ARCHITECTURES "x86_64") set( MACOSX_BUNDLE_INFO_STRING "MRIConvert-mcverter" ) set( MACOSX_BUNDLE_ICON_FILE "MRIConvert.icns" ) set( MACOSX_BUNDLE_GUI_IDENTIFIER "edu.uoregon.lcni.MRIConvert" ) set( MACOSX_BUNDLE_LONG_VERSION_STRING "version 2.0.x" ) set( MACOSX_BUNDLE_BUNDLE_NAME "MRIConvert" ) set( MACOSX_BUNDLE_SHORT_VERSION_STRING "2.0.x" ) set( MACOSX_BUNDLE_BUNDLE_VERSION "2.0" ) set( MACOSX_BUNDLE_COPYRIGHT "copyright" ) set_source_files_properties( MRIConvert.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) endif ( ${CMAKE_HOST_APPLE} ) ADD_EXECUTABLE ( MRIConvert WIN32 MACOSX_BUNDLE AchievaDtiHandler.cpp AnalyzeOptionsDlg.cpp AnalyzeOutputter.cpp AnalyzeVolume.cpp Basic3DOutputter.cpp BasicOptionsDlg.cpp BasicVolumeFormat.cpp BvFiles.cpp BvOptionsDlg.cpp Converter.cpp DicomElement.cpp DicomElementInstance.cpp DicomFile.cpp DicomTag.cpp DicomTree.cpp DicomViewer.cpp Dictionary.cpp EnhancedMrHandler.cpp FslNiftiOutputter.cpp GeDti2Handler.cpp GeDtiRbHandler.cpp GeEpiHandler.cpp Globals.cpp HandlerFactory.cpp ImageView.cpp InfoFrame.cpp MainHeader.cpp MRIConvert.cpp McFrame.cpp McPanel.cpp MessageList.cpp MetaHeader.cpp MetaOptionsDlg.cpp NewBvOutputter.cpp NewMetaOutputter.cpp NewMetaVolume.cpp NewSpmOutputter.cpp NewSpmVolume.cpp NiftiOptionsDlg.cpp NiftiOutputter.cpp NiftiOutputterBase.cpp NiftiVolume.cpp NoOptionsDlg.cpp NumarisMosaicHandler.cpp OutputFactory.cpp OutputList.cpp OutputTreeNew.cpp OutputterBase.cpp OverrideDlg.cpp OverwriteDlg.cpp Preamble.cpp SeriesHandler.cpp SpmOptionsDlg.cpp StringConvert.cpp SyngoHandler.cpp SyngoMosaicHandler.cpp TextFileViewer.cpp ValueRepresentations.cpp Volume.cpp jcsTree.cpp AchievaDtiHandler.h AnalyzeOptionsDlg.h AnalyzeOutputter.h AnalyzeVolume.h Basic3DOutputter.h BasicOptionsDlg.h BasicVolumeFormat.h BvFiles.h BvOptionsDlg.h ByteSwap.h ConfigValues.h Converter.h DicomElement.h DicomElementInstance.h DicomFile.h DicomTag.h DicomTags.h DicomTree.h DicomViewer.h Dictionary.h EnhancedMrHandler.h FslNiftiOutputter.h GeDti2Handler.h GeDtiRbHandler.h GeEpiHandler.h Globals.h HandlerFactory.h ImageView.h InfoFrame.h MainHeader.h MRIConvert.h McFrame.h McPanel.h MessageList.h MetaHeader.h MetaOptionsDlg.h NewBvOutputter.h NewMetaOutputter.h NewMetaVolume.h NewSpmOutputter.h NewSpmVolume.h NiftiOptionsDlg.h NiftiOutputter.h NiftiOutputterBase.h NiftiVolume.h NoOptionsDlg.h NumarisMosaicHandler.h OutputFactory.h OutputList.h OutputTreeNew.h OutputterBase.h OverrideDlg.h OverwriteDlg.h Preamble.h ReadStream.h SeriesHandler.h SpmOptionsDlg.h StringConvert.h SyngoHandler.h SyngoMosaicHandler.h TextFileViewer.h ValueRepresentations.h Volume.h jcsTree.h nifti1.h metaTypes.h resource.h fileformats.h version_string.h utf8proc-v1.1.6/utf8proc.h DicomFile.txx SeriesHandler.txx NewBvOutputter.txx Basic3DConversion.txx MRIConvert.rc MRIConvert.ico MRIConvert.icns ) ADD_EXECUTABLE ( mcverter McVerter.cpp AchievaDtiHandler.cpp AnalyzeOutputter.cpp AnalyzeVolume.cpp Basic3DOutputter.cpp BasicVolumeFormat.cpp BvFiles.cpp Converter.cpp DicomElement.cpp DicomElementInstance.cpp DicomFile.cpp DicomTag.cpp Dictionary.cpp EnhancedMrHandler.cpp FslNiftiOutputter.cpp GeDti2Handler.cpp GeDtiRbHandler.cpp GeEpiHandler.cpp Globals.cpp HandlerFactory.cpp MainHeader.cpp MetaHeader.cpp NewBvOutputter.cpp NewMetaOutputter.cpp NewMetaVolume.cpp NewSpmOutputter.cpp NewSpmVolume.cpp NiftiOutputter.cpp NiftiOutputterBase.cpp NiftiVolume.cpp NumarisMosaicHandler.cpp OutputFactory.cpp OutputList.cpp OutputterBase.cpp Preamble.cpp SeriesHandler.cpp StringConvert.cpp SyngoHandler.cpp SyngoMosaicHandler.cpp ValueRepresentations.cpp Volume.cpp McVerter.h AchievaDtiHandler.h AnalyzeOutputter.h AnalyzeVolume.h Basic3DOutputter.h BasicVolumeFormat.h BvFiles.h ByteSwap.h ConfigValues.h Converter.h DicomElement.h DicomElementInstance.h DicomFile.h DicomTag.h DicomTags.h Dictionary.h EnhancedMrHandler.h FslNiftiOutputter.h GeDti2Handler.h GeDtiRbHandler.h GeEpiHandler.h Globals.h HandlerFactory.h MainHeader.h MetaHeader.h NewBvOutputter.h NewMetaOutputter.h NewMetaVolume.h NewSpmOutputter.h NewSpmVolume.h NiftiOutputter.h NiftiOutputterBase.h NiftiVolume.h NumarisMosaicHandler.h OutputFactory.h OutputterBase.h Preamble.h ReadStream.h SeriesHandler.h StringConvert.h SyngoHandler.h SyngoMosaicHandler.h ValueRepresentations.h Volume.h nifti1.h metaTypes.h resource.h fileformats.h version_string.h utf8proc-v1.1.6/utf8proc.h DicomFile.txx SeriesHandler.txx NewBvOutputter.txx Basic3DConversion.txx ) ## Need to get this working to support automated ## build of the utf8proc library. 20150312cdt ##add_library ( utf8proc ## utf8proc-v1.1.6/utf8proc.c ## utf8proc-v1.1.6/utf8proc_data.c ## utf8proc-v1.1.6/utf8proc.h ##) if (WIN32) TARGET_LINK_LIBRARIES ( MRIConvert comctl32 rpcrt4 ${wxWidgets_LIBRARIES} c:/utf8proc-v1.1.6/utf8proc ) TARGET_LINK_LIBRARIES ( mcverter comctl32 rpcrt4 ${wxWidgets_LIBRARIES} c:/utf8proc-v1.1.6/utf8proc ) else (WIN32) TARGET_LINK_LIBRARIES( MRIConvert ${wxWidgets_LIBRARIES} ${CMAKE_SOURCE_DIR}/utf8proc-v1.1.6/libutf8proc.a ) TARGET_LINK_LIBRARIES( mcverter ${wxWidgets_LIBRARIES} ${CMAKE_SOURCE_DIR}/utf8proc-v1.1.6/libutf8proc.a ) endif (WIN32) mriconvert/NiftiVolume.h0000640000175000000620000000275612542632332014676 0ustar stevestaff/// NiftiVolume.h /** */ #ifndef NIFTI_VOLUME_H_ #define NIFTI_VOLUME_H_ #include #include #include #include #include #include #include #include "StringConvert.h" #include "Globals.h" #include "Volume.h" #include "BasicVolumeFormat.h" // nifti.h must be included last to avoid clash with dirent.h! #include "nifti1.h" namespace jcs { struct NiftiHeader:public Basic3DHeader { NiftiHeader() { InitHeader(); } nifti_1_header hdr; nifti1_extender extender; std::vector extended_header; virtual void SetNumberOfSlices(int slices) { hdr.dim[3] = slices; } virtual void SetSliceSpacing(double spacing) { hdr.pixdim[3] = static_cast(spacing); } virtual int GetNumberOfSlices() { return hdr.dim[3]; } void SetDimInfo(char freq_dim, char phase_dim, char slice_dim); void InitHeader(); }; class NiftiVolume: public BasicVolumeFormat { public : NiftiVolume(const char* filename, const char* header_extension, const char* raw_extension); ~NiftiVolume(); NiftiHeader GetHeader() { return mHeader; } void WriteHeader(Basic3DHeader* header); private : NiftiHeader mHeader; void mInitHeader() { mHeader.InitHeader(); } enum aEndianType { aLITTLE_ENDIAN, aBIG_ENDIAN } ; aEndianType mByteOrder; int mWriteHeaderFile(); }; } #endif mriconvert/SpmOptionsDlg.cpp0000640000175000000620000000223512542632311015517 0ustar stevestaff/// SpmOptionsDlg.cpp /** */ #include #include #include #include "SpmOptionsDlg.h" #include "NewSpmOutputter.h" using namespace jcs; BEGIN_EVENT_TABLE(SpmOptionsDlg, BasicOptionsDlg) EVT_BUTTON(wxID_OK, SpmOptionsDlg::OnOkay) END_EVENT_TABLE() SpmOptionsDlg::SpmOptionsDlg(NewSpmOutputter* outputter) : BasicOptionsDlg(_("SPM Analyze options"), outputter), mOutputter(outputter) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dlgSizer->Add(myPanel); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxButton* okayButton = new wxButton(this, wxID_OK, _("Okay")); buttonSizer->Add(okayButton, 0, wxRIGHT, 10); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); okayButton->SetDefault(); dlgSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); mNeedsRebuild = false; } void SpmOptionsDlg::OnOkay(wxCommandEvent& event) { bool rbld = Rebuild(); bool nfSave = SaveNameFields(); mNeedsRebuild = rbld || nfSave; BasicOptionsDlg::OnOkay(event); EndModal(event.GetId()); } mriconvert/OverwriteDlg.h0000640000175000000620000000051512542632311015036 0ustar stevestaff#ifndef OVERWRITE_DLG_H_ #define OVERWRITE_DLG_H_ #include #include namespace jcs { class OverwriteDlg : public wxDialog { public: OverwriteDlg(wxWindow* parent, const char* filename); void OnButton(wxCommandEvent& event); protected: DECLARE_EVENT_TABLE() }; } #endif mriconvert/NewSpmVolume.cpp0000640000175000000620000003634612542632311015370 0ustar stevestaff/// NewSpmVolume.cpp /** */ #include "NewSpmVolume.h" using namespace jcs; /// /** */ NewSpmVolume::NewSpmVolume(const char* filename, const char* he, const char* re) : BasicVolumeFormat(filename, he, re), mByteOrder(aLITTLE_ENDIAN) { // Need to fix things if we want to add reading files back to this class. // if (!mReadHeaderFile()) mInitHeader(); mInitHeader(); } /// /** */ NewSpmVolume::~NewSpmVolume() { if (mMatFile.is_open()) { mCloseMatFile(); } } /// /** */ void NewSpmVolume::WriteHeader(Basic3DHeader* header) { NewSpmHeader* spm_header = dynamic_cast(header); mHeader = *spm_header; if (mWriteHeaderFile() == 1) { if (verbose && !quiet) { std::cout << "Wrote " << mFileName.GetFullPath() << std::endl; //.mb_str(wxConvLocal) << std::endl; } } } /// /** */ int NewSpmVolume::mOpenMatFile(std::ios::openmode mode) { // if (!mFileName.IsOk()) return 0; // if (mMatFile.is_open()) mMatFile.close(); // mMatFile.clear(); // std::string filename = mFileName = ".mat"; // mMatFile.open(filename.c_str(), mode); return mMatFile.good(); } /// /** */ int NewSpmVolume::mReadHeaderFile() { if (!mOpenHeaderFile(std::ios::in|std::ios::binary)) { return 0; } mHeaderFile.read(reinterpret_cast (&mHeader.hk.sizeof_hdr), sizeof(mHeader.hk.sizeof_hdr)); // If the header size isn't 348, set the byte order to big endian if (mHeader.hk.sizeof_hdr != 348) { mByteOrder = aBIG_ENDIAN; } // Reset get pointer mHeaderFile.seekg(0); mHeaderFile.read(reinterpret_cast (&mHeader.hk.sizeof_hdr), sizeof(mHeader.hk.sizeof_hdr)); mHeaderFile.read(reinterpret_cast (&mHeader.hk.data_type), sizeof(mHeader.hk.data_type)); mHeaderFile.read(reinterpret_cast (&mHeader.hk.db_name), sizeof(mHeader.hk.db_name)); mHeaderFile.read(reinterpret_cast (&mHeader.hk.extents), sizeof(mHeader.hk.extents)); mHeaderFile.read(reinterpret_cast (&mHeader.hk.session_error), sizeof(mHeader.hk.session_error)); mHeaderFile.read(reinterpret_cast (&mHeader.hk.regular), sizeof(mHeader.hk.regular)); mHeaderFile.read(reinterpret_cast (&mHeader.hk.hkey_un0), sizeof(mHeader.hk.hkey_un0)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.dim), sizeof(mHeader.dime.dim)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused8), sizeof(mHeader.dime.unused8)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused9), sizeof(mHeader.dime.unused9)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused10), sizeof(mHeader.dime.unused10)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused11), sizeof(mHeader.dime.unused11)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused12), sizeof(mHeader.dime.unused12)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused13), sizeof(mHeader.dime.unused13)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.unused14), sizeof(mHeader.dime.unused14)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.datatype), sizeof(mHeader.dime.datatype)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.bitpix), sizeof(mHeader.dime.bitpix)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.dim_un0), sizeof(mHeader.dime.dim_un0)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.pixdim), sizeof(mHeader.dime.pixdim)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.vox_offset), sizeof(mHeader.dime.vox_offset)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.scale), sizeof(mHeader.dime.scale)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.intercept), sizeof(mHeader.dime.intercept)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.funused3), sizeof(mHeader.dime.funused3)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.cal_max), sizeof(mHeader.dime.cal_max)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.cal_min), sizeof(mHeader.dime.cal_min)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.compressed), sizeof(mHeader.dime.compressed)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.verified), sizeof(mHeader.dime.verified)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.glmax), sizeof(mHeader.dime.glmax)); mHeaderFile.read(reinterpret_cast (&mHeader.dime.glmin), sizeof(mHeader.dime.glmin)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.descrip), sizeof(mHeader.hist.descrip)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.aux_file), sizeof(mHeader.hist.aux_file)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.orient), sizeof(mHeader.hist.orient)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.origin), sizeof(mHeader.hist.origin)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.generated), sizeof(mHeader.hist.generated)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.scannum), sizeof(mHeader.hist.scannum)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.patient_id), sizeof(mHeader.hist.patient_id)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.exp_date), sizeof(mHeader.hist.exp_date)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.exp_time), sizeof(mHeader.hist.exp_time)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.hist_un0), sizeof(mHeader.hist.hist_un0)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.views), sizeof(mHeader.hist.views)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.vols_added), sizeof(mHeader.hist.vols_added)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.start_field), sizeof(mHeader.hist.start_field)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.field_skip), sizeof(mHeader.hist.field_skip)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.omax), sizeof(mHeader.hist.omax)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.omin), sizeof(mHeader.hist.omin)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.smax), sizeof(mHeader.hist.smax)); mHeaderFile.read(reinterpret_cast (&mHeader.hist.smin), sizeof(mHeader.hist.smin)); if (mByteOrder != aLITTLE_ENDIAN) { ByteSwap(mHeader.hk.sizeof_hdr, sizeof(wxInt32)); ByteSwap(mHeader.hk.extents, sizeof(wxInt32)); ByteSwap(mHeader.hk.session_error, sizeof(wxInt16)); ByteSwap(mHeader.dime.dim, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused8, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused9, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused10, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused11, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused12, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused13, sizeof(wxInt16)); ByteSwap(mHeader.dime.unused14, sizeof(wxInt16)); ByteSwap(mHeader.dime.datatype, sizeof(wxInt16)); ByteSwap(mHeader.dime.bitpix, sizeof(wxInt16)); ByteSwap(mHeader.dime.dim_un0, sizeof(wxInt16)); ByteSwap(mHeader.dime.pixdim, sizeof(float)); ByteSwap(mHeader.dime.vox_offset, sizeof(float)); ByteSwap(mHeader.dime.scale, sizeof(float)); ByteSwap(mHeader.dime.intercept, sizeof(float)); ByteSwap(mHeader.dime.funused3, sizeof(float)); ByteSwap(mHeader.dime.cal_max, sizeof(float)); ByteSwap(mHeader.dime.cal_min, sizeof(float)); ByteSwap(mHeader.dime.compressed, sizeof(float)); ByteSwap(mHeader.dime.verified, sizeof(float)); ByteSwap(mHeader.dime.glmax, sizeof(wxInt32)); ByteSwap(mHeader.dime.glmin, sizeof(wxInt32)); ByteSwap(mHeader.hist.origin, sizeof(wxInt16)); ByteSwap(mHeader.hist.views, sizeof(wxInt32)); ByteSwap(mHeader.hist.vols_added, sizeof(wxInt32)); ByteSwap(mHeader.hist.start_field, sizeof(wxInt32)); ByteSwap(mHeader.hist.field_skip, sizeof(wxInt32)); ByteSwap(mHeader.hist.omax, sizeof(wxInt32)); ByteSwap(mHeader.hist.omin, sizeof(wxInt32)); ByteSwap(mHeader.hist.smax, sizeof(wxInt32)); ByteSwap(mHeader.hist.smin, sizeof(wxInt32)); } mCloseHeaderFile(); return 1; } /// /** */ int NewSpmVolume::mWriteHeaderFile() { if (!mOpenHeaderFile(std::ios::out|std::ios::binary)) { wxLogError(_T("Cannot create header file %s"), mFileName.GetFullName().c_str()); return 0; } mHeaderFile.write(reinterpret_cast (&mHeader.hk.sizeof_hdr), sizeof(mHeader.hk.sizeof_hdr)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.data_type), sizeof(mHeader.hk.data_type)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.db_name), sizeof(mHeader.hk.db_name)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.extents), sizeof(mHeader.hk.extents)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.session_error), sizeof(mHeader.hk.session_error)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.regular), sizeof(mHeader.hk.regular)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.hkey_un0), sizeof(mHeader.hk.hkey_un0)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.dim), sizeof(mHeader.dime.dim)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused8), sizeof(mHeader.dime.unused8)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused9), sizeof(mHeader.dime.unused9)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused10), sizeof(mHeader.dime.unused10)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused11), sizeof(mHeader.dime.unused11)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused12), sizeof(mHeader.dime.unused12)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused13), sizeof(mHeader.dime.unused13)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused14), sizeof(mHeader.dime.unused14)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.datatype), sizeof(mHeader.dime.datatype)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.bitpix), sizeof(mHeader.dime.bitpix)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.dim_un0), sizeof(mHeader.dime.dim_un0)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.pixdim), sizeof(mHeader.dime.pixdim)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.vox_offset), sizeof(mHeader.dime.vox_offset)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.scale), sizeof(mHeader.dime.scale)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.intercept), sizeof(mHeader.dime.intercept)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.funused3), sizeof(mHeader.dime.funused3)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.cal_max), sizeof(mHeader.dime.cal_max)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.cal_min), sizeof(mHeader.dime.cal_min)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.compressed), sizeof(mHeader.dime.compressed)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.verified), sizeof(mHeader.dime.verified)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.glmax), sizeof(mHeader.dime.glmax)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.glmin), sizeof(mHeader.dime.glmin)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.descrip), sizeof(mHeader.hist.descrip)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.aux_file), sizeof(mHeader.hist.aux_file)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.orient), sizeof(mHeader.hist.orient)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.origin), sizeof(mHeader.hist.origin)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.generated), sizeof(mHeader.hist.generated)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.scannum), sizeof(mHeader.hist.scannum)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.patient_id), sizeof(mHeader.hist.patient_id)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.exp_date), sizeof(mHeader.hist.exp_date)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.exp_time), sizeof(mHeader.hist.exp_time)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.hist_un0), sizeof(mHeader.hist.hist_un0)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.views), sizeof(mHeader.hist.views)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.vols_added), sizeof(mHeader.hist.vols_added)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.start_field), sizeof(mHeader.hist.start_field)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.field_skip), sizeof(mHeader.hist.field_skip)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.omax), sizeof(mHeader.hist.omax)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.omin), sizeof(mHeader.hist.omin)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.smax), sizeof(mHeader.hist.smax)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.smin), sizeof(mHeader.hist.smin)); mCloseHeaderFile(); return 1; } /// /** */ void NewSpmVolume::ViewHeader() { std::cout << "Scan number: "; std::cout.write(mHeader.hist.scannum, sizeof(mHeader.hist.scannum)); std::cout << std::endl; std::cout << "Patient name: "; std::cout.write(mHeader.hist.patient_id, sizeof(mHeader.hist.patient_id)); std::cout << std::endl; std::cout << "Study date: "; std::cout.write(mHeader.hist.exp_date, sizeof(mHeader.hist.exp_date)); std::cout << std::endl; std::cout << "Study time: "; std::cout.write(mHeader.hist.exp_time, sizeof(mHeader.hist.exp_time)); std::cout << std::endl; std::cout << "Repetition time: " << mHeader.dime.pixdim[4] << std::endl; std::cout << "Header size: " << mHeader.hk.sizeof_hdr << " bytes" << std::endl; std::cout << "Image Columns: " << mHeader.dime.dim[1] << " voxels" << std::endl; std::cout << "Image Rows: " << mHeader.dime.dim[2] << " voxels" << std::endl; std::cout << "Slices: " << mHeader.dime.dim[3] << std::endl; std::cout << "Voxel size (x): " << mHeader.dime.pixdim[1] << " mm" << std::endl; std::cout << "Voxel size (y): " << mHeader.dime.pixdim[2] << " mm" << std::endl; std::cout << "Slice size: " << mHeader.dime.pixdim[3] << " mm" << std::endl; std::cout << "Data type: " << mHeader.dime.datatype << std::endl; std::cout << "Scale: " << mHeader.dime.scale << std::endl; std::cout << "Voxel offset: " << mHeader.dime.vox_offset << " bytes" << std::endl; std::cout << "Origin (x): " << mHeader.hist.origin[0] << " voxels" << std::endl; std::cout << "Origin (y): " << mHeader.hist.origin[1] << " voxels" << std::endl; std::cout << "Origin (z): " << mHeader.hist.origin[2] << " voxels" << std::endl; std::cout << "Description: "; std::cout.write(mHeader.hist.descrip, sizeof(mHeader.hist.descrip)); std::cout << std::endl << std::endl; } /// /** */ void NewSpmHeader::InitHeader() { memset(&hist, 0, sizeof(hist)); memset(&dime, 0, sizeof(dime)); memset(&hk, 0, sizeof(hk)); } mriconvert/StringConvert.cpp0000640000175000000620000000612112542632333015566 0ustar stevestaff/// StringConvert.cpp /** */ #include "StringConvert.h" /// /** */ float jcs::stof(const std::string& rString) { //float retval = 0; //if (!rString.empty()) { // retval = stof(rString, 0); //} //return retval; if (rString.empty()) { return 0; } return stof(rString, 0); } /// /** \param rString std::string reference to convert to float. \param n \return A float. */ float jcs::stof(const std::string& rString, int n) { std::stringstream ss; ss << rString; float f; for (int i = 0; i <= n; ++i) { ss >> f; ss.get(); } return f; } /// /** \param rString std::string reference to convert to int. \return An int. */ int jcs::stoi(const std::string& rString) { int value; //std::istringstream(rString) >> value; std::string tmp_string = rString; tmp_string.erase(0, tmp_string.find_first_not_of(' ')); std::stringstream ss; ss << tmp_string; ss >> value; return value; } /// /** */ int jcs::stoi(const std::string& rString, int n) { std::stringstream ss; ss << rString; int f; for (int i = 0; i <= n; ++i) { ss >> f; ss.get(); } return f; } /// /** */ std::string jcs::itos(const int i, int width) { std::stringstream ss; ss.fill('0'); ss.width(width); ss << i; std::string s; ss >> s; return s; } /// /** */ std::string jcs::ftos(const float f) { std::stringstream ss; std::string str; ss << f; ss >> str; return str; } /// /** */ std::string jcs::Date(const std::string& date) { std::string retval = date; if (date.size() > 6) { std::string newdate; newdate.reserve(10); newdate.append(date.begin() + 4, date.begin() + 6); newdate.append("/"); newdate.append(date.begin() + 6, date.end()); newdate.append("/"); newdate.append(date.begin(), date.begin() + 4); return newdate; } else { return date; } } /// /** */ std::string jcs::RemoveInvalidChars(const std::string& name) { const std::string forbidden("\\/:*?\"<>|;, .#^"); // this initialization will drop any NULL terminator std::string new_name(name.c_str()); std::replace_if( new_name.begin(), new_name.end(), std::bind2nd(member_of(), forbidden), '_'); // remove trailing underscores std::string::size_type length = new_name.find_last_not_of('_'); if (length != std::string::npos) { length += 1; new_name.resize(length); } return new_name; } /// /** */ std::vector jcs::ParseDicomString(const std::string& str) { std::vector v; std::string::size_type pos1 = 0; std::string::size_type pos2 = str.find_first_of('/'); v.push_back(str.substr(0, pos2)); while (pos2 != std::string::npos) { pos1 = pos2 + 1; pos2 = str.find_first_of('/', pos1); if (pos2 != std::string::npos) { int nchars = pos2 - pos1; v.push_back(str.substr(pos1, nchars)); } else { v.push_back(str.substr(pos1)); } } return v; } mriconvert/NewSpmVolume.h0000640000175000000620000000456312542632317015037 0ustar stevestaff/// NewSpmVolume.h /** */ #ifndef NEW_SPM_VOLUME_H_ #define NEW_SPM_VOLUME_H_ #include #include #include #include #include #include #include "ByteSwap.h" #include "StringConvert.h" #include "Globals.h" #include "Volume.h" #include "BasicVolumeFormat.h" namespace jcs { struct NewSpmHeader:public Basic3DHeader { struct header_key{ wxInt32 sizeof_hdr; char data_type[10]; char db_name[18]; wxInt32 extents; wxInt16 session_error; char regular; char hkey_un0; } hk; struct image_dimension { wxInt16 dim[8]; wxInt16 unused8; wxInt16 unused9; wxInt16 unused10; wxInt16 unused11; wxInt16 unused12; wxInt16 unused13; wxInt16 unused14; wxInt16 datatype; wxInt16 bitpix; wxInt16 dim_un0; float pixdim[8]; float vox_offset; float scale; // funused1 float intercept; // funused2 float funused3; float cal_max; float cal_min; float compressed; float verified; wxInt32 glmax, glmin; } dime; struct data_history { char descrip[80]; char aux_file[24]; char orient; wxInt16 origin[5]; char generated[10]; char scannum[10]; char patient_id[10]; char exp_date[10]; char exp_time[10]; char hist_un0[3]; wxInt32 views; wxInt32 vols_added; wxInt32 start_field; wxInt32 field_skip; wxInt32 omax, omin; wxInt32 smax, smin; } hist; virtual void SetNumberOfSlices(int slices) { dime.dim[3] = slices; } virtual void SetSliceSpacing(double spacing) { dime.pixdim[3] = static_cast(spacing); } virtual int GetNumberOfSlices() { return dime.dim[3]; } void InitHeader(); }; class NewSpmVolume: public BasicVolumeFormat { public : NewSpmVolume(const char* filename, const char* header_extension, const char* raw_extension); ~NewSpmVolume(); NewSpmHeader GetHeader() { return mHeader; } void WriteHeader(Basic3DHeader* header); void ViewHeader(); protected: private : std::fstream mMatFile; NewSpmHeader mHeader; enum aEndianType { aLITTLE_ENDIAN, aBIG_ENDIAN } ; aEndianType mByteOrder; void mInitHeader() { mHeader.InitHeader(); } int mOpenMatFile(std::ios::openmode mode); void mCloseMatFile() { mMatFile.close(); } int mReadHeaderFile(); int mWriteHeaderFile(); }; } #endif mriconvert/SyngoHandler.h0000640000175000000620000000202712542632325015023 0ustar stevestaff/// SyngoHandler.h /** */ #ifndef SYNGO_HANDLER_H #define SYNGO_HANDLER_H #include #include #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "SeriesHandler.h" namespace jcs { class SyngoHandler : public SeriesHandler { public: SyngoHandler(const std::string& seriesUid); virtual double GetSliceDuration() const; virtual AoCode GetAcquisitionOrder() const; virtual double GetVolumeInterval() const; virtual GradientInfo GetGradientInfo(); virtual bool IsDti() const; virtual bool IsMoCo() const; virtual std::vector GetStringInfo(); protected: int ReadCSAImageHeader(const std::string& tag, std::string& value) const; int ReadCSASeriesHeader(const std::string& tag, std::string& value) const; virtual VolListType ReadVolIds(DicomFile& file); }; }; #endif mriconvert/DicomElement.cpp0000640000175000000620000000003712542632315015324 0ustar stevestaff/// DicomElement.cpp /** */ mriconvert/Dictionary.cpp0000640000175000000620000000576312542632322015075 0ustar stevestaff/// Dictionary.cpp /** */ /* Main workhorse for getting field definitions for various formats. */ #include "Dictionary.h" using namespace jcs; /// /** Dictionary class, used to maintain tuples of DICOM field definitions. Parent class of more-specific Dictionaries. Field definitions are maintained as a TagMap and a StringMap. */ Dictionary::Dictionary(const std::string& dname) : mDictionaryName(dname) { NULL_ENTRY = DicomElement(DicomTag(0x0000, 0x0000), ""); if (mDictionaryName.compare (fnDicom) == 0) { #include "DicomDictionary.h" } else if (mDictionaryName.compare (fnExcite) == 0) { #include "ExciteDictionary.h" } else if (mDictionaryName.compare (fnNumaris) == 0) { #include "NumarisDictionary.h" } else if (mDictionaryName.compare (fnPhilips) == 0) { #include "PhilipsDictionary.h" } else { wxLogError (_T("Error initializing dictionary.")); } } /// /** Look up a DICOM element in mTagMap. \param tag A reference to a DicomTag. \return A DicomElement object. */ const DicomElement Dictionary::Lookup(const DicomTag& tag) const { if (mTagMap.size() == 0) { wxLogError(_T("Error: dictionary tag map %s is of zero size."), wxString(mDictionaryName.c_str(), wxConvLocal).c_str()); return DicomElement(tag, "unknown"); } if (mTagMap.count(tag) == 0) { return DicomElement(tag, "unknown"); } else { DicomElement e = (*mTagMap.find(tag)).second; return e; } } /// /** Look up a DICOM element in mStringMap. \param desc Key to seek. \return A DicomElement object. */ const DicomElement Dictionary::Lookup(const std::string& desc) const { if (mStringMap.size() == 0) { wxLogError(_T("Error: dictionary string map %s is of zero size."), wxString(mDictionaryName.c_str(), wxConvLocal).c_str()); return NULL_ENTRY; } if (mStringMap.count(desc) == 0) { wxLogError(_T("%s not in dictionary"), wxString(desc.c_str(), wxConvLocal).c_str()); return NULL_ENTRY; } else { DicomElement e = (*mStringMap.find(desc)).second; return e; } } /// /** */ static std::string GetDescription(std::pair tag_pair) { return tag_pair.second.description; } /// /** Look up tag identified by string 's' in dictionary 'dict'. \param s A string to seek. \param dict The dictionary in which to seek. \return A DicomTag object. */ DicomTag jcs::Tag(const std::string& s, const Dictionary* dict) { return dict->Lookup(s).tag; } /// /** */ std::vector Dictionary::TagList() const { std::vector v; v.reserve(mTagMap.size()); std::transform(mTagMap.begin(), mTagMap.end(), std::back_inserter(v), GetDescription); return v; } /// /** Add the given DicomElement to mTagMap and mStringMap. \param e A reference to the DicomElement to be added. */ void Dictionary::mAddEntry(const DicomElement& e) { mTagMap[e.tag] = e; mStringMap[e.description] = e; } mriconvert/FslNiftiOutputter.h0000750000175000000620000000705512542632317016111 0ustar stevestaff/// FslNiftiOutputter.h /** */ #ifndef FSL_NIFTI_OUTPUTTER_H_ #define FSL_NIFTI_OUTPUTTER_H_ #include #include #include "NiftiOutputterBase.h" #include "NiftiOutputter.h" #include "NiftiVolume.h" namespace jcs { struct NiftiHeader; class FslNiftiOutputter : public NiftiOutputterBase { public : FslNiftiOutputter(); virtual int ConvertSeries(SeriesHandler* handler); virtual void UpdateOutputForSeries(SeriesHandler* handler); protected: private: static Options CreateOptions(); }; template class FslNiftiConversion: public NiftiConversion { public: FslNiftiConversion(NiftiOutputterBase* outputter, SeriesHandler* handler); ~FslNiftiConversion(); protected: virtual void GetHeaderForSeries(); virtual void ProcessSlice(std::vector& slice); virtual std::vector GetRotationMatrix(const VolId& id); private: }; template FslNiftiConversion::FslNiftiConversion(NiftiOutputterBase* outputter, SeriesHandler* handler) : NiftiConversion(outputter, handler) { } template FslNiftiConversion::~FslNiftiConversion() { } template void FslNiftiConversion::GetHeaderForSeries() { NiftiConversion::GetHeaderForSeries(); if (this->mHeader->hdr.datatype == DT_UINT16) { int bits; this->mHandler->Find("BitsStored", bits); if (bits == 16) { // it would be better to name the actual output file but that is // more complicated to do than it should be and I'm not fixing it now std::string patient_name; this->mHandler->Find("PatientName", patient_name); int series_number; this->mHandler->Find("SeriesNumber", series_number); wxLogMessage(_("%s series %d: output will be unsigned 16 bit."), patient_name, series_number); } else this->mHeader->hdr.datatype = DT_INT16; } } template void FslNiftiConversion::ProcessSlice(std::vector& slice) { // rotate 180 reverse(slice.begin(), slice.end()); // flip L/R unsigned int row_size = this->mHeader->hdr.dim[1]; if (this->mHeader->hdr.datatype == DT_RGB) { row_size *= 3; } typename std::vector::iterator row_begin = slice.begin(); while (row_begin < slice.end()) { typename std::vector::iterator row_end = row_begin + row_size; reverse(row_begin, row_end); row_begin = row_end; } } template std::vector FslNiftiConversion::GetRotationMatrix(const VolId& id) { double voxel_size_y = this->mHandler->GetVoxelSize()[1]; double image_size_y = this->mHandler->GetRows() * voxel_size_y; std::vector ipp = this->mHandler->GetIppForFirstSlice(id); std::vector rotation = this->mHandler->GetRotationMatrix(id); std::vector r4; r4.push_back(-rotation.at(0)); r4.push_back(-rotation.at(1)); r4.push_back(rotation.at(2)); r4.push_back(0); r4.push_back(rotation.at(3)); r4.push_back(rotation.at(4)); r4.push_back(-rotation.at(5)); r4.push_back(0); r4.push_back(-rotation.at(6)); r4.push_back(-rotation.at(7)); r4.push_back(rotation.at(8)); r4.push_back(0); r4.push_back(-rotation.at(3) * image_size_y - ipp.at(0)); r4.push_back(-rotation.at(4) * image_size_y - ipp.at(1) + voxel_size_y); r4.push_back(rotation.at(5) * image_size_y + ipp.at(2)); r4.push_back(1); return r4; } } #endif mriconvert/NewBvOutputter.cpp0000640000175000000620000001337012542632317015742 0ustar stevestaff/// NewBvOutputter.cpp /** */ #include #include #include #include #include #include #include #include "StringConvert.h" #include "DicomFile.h" #include "SeriesHandler.h" #include "Converter.h" #include "NewBvOutputter.h" using namespace jcs; /// /** */ NewBvOutputter::NewBvOutputter(): OutputterBase(CreateOptions()) { mSaveV16 = mOptions.boolOptions["savev16"]; mSkip = mOptions.intOptions["skip"]; } /// /** */ NewBvOutputter::~NewBvOutputter() { mOptions.boolOptions["savev16"] = mSaveV16; mOptions.intOptions["skip"] = mSkip; } /// /** */ Options NewBvOutputter::CreateOptions() { Options options = GetBaseOptions(); options.pathname = "BrainVoyager"; options.boolOptions["savev16"] = false; options.intOptions["skip"] = 0; return options; } /// /** */ void NewBvOutputter::RemoveSeries(const std::string& seriesUid) { std::set keys; OutputList::ListType::iterator it = mOutputList.fileNameList.begin(); OutputList::ListType::iterator it_end = mOutputList.fileNameList.end(); for (;it != it_end; ++it) { if (it->second.seriesUid == seriesUid) { keys.insert(it->first); } } std::set::iterator key_it = keys.begin(); std::set::iterator key_it_end = keys.end(); for (;key_it != key_it_end; ++key_it) { mOutputList.fileNameList.erase(*key_it); } } /// /** \param handler A pointer to a SeriesHandler. \return 1 */ int NewBvOutputter::ConvertSeries(SeriesHandler* handler) { int bits_allocated, pixel_rep = 0; handler->Find("BitsAllocated", bits_allocated); handler->Find("PixelRepresentation", pixel_rep); // Note that mosaic == functional is assumed if (handler->IsMosaic()) { int nVolumes = handler->GetNumberOfVolumes(); mConvertFmr(handler); switch (bits_allocated + pixel_rep) { case 8 : mConvertStc(handler); break; case 9 : mConvertStc(handler); break; case 16 : mConvertStc(handler); break; case 17 : mConvertStc(handler); break; case 32 : mConvertStc(handler); break; case 33 : mConvertStc(handler); break; default : mConvertStc(handler); } } else { switch (bits_allocated + pixel_rep) { case 8 : mConvertAnat(handler); break; case 9 : mConvertAnat(handler); break; case 16 : mConvertAnat(handler); break; case 17 : mConvertAnat(handler); break; case 32 : mConvertAnat(handler); break; case 33 : mConvertAnat(handler); break; default : mConvertAnat(handler); } } return 1; } /// /** */ void NewBvOutputter::mConvertFmr(SeriesHandler* handler) { wxFileName file = GetFileName(handler->GetSeriesUid()); wxFileName::Mkdir(file.GetPath(wxPATH_GET_VOLUME), 0777, wxPATH_MKDIR_FULL); file.SetExt(_T("")); std::string fname(static_cast(file.GetFullPath())); //.mb_str(wxConvLocal))); FmrHeader header; header.volumes = handler->GetNumberOfVolumes() - mSkip; header.slices = handler->GetNumberOfSlices(); header.skipVolumes = mSkip; header.prefix = fname + "_"; handler->Find("RepetitionTime", header.tr); header.interSliceT = header.tr/header.slices; header.columns = handler->GetColumns(); header.rows = handler->GetRows(); std::vector res = handler->GetVoxelSize(); header.IpResX = static_cast(res[0]); header.IpResY = static_cast(res[1]); int layout = static_cast(sqrtf(header.slices)); if ((layout * layout) < header.slices) { ++layout; } header.layoutColumns = layout; header.layoutRows = layout; handler->Find("SliceThickness", header.sliceThickness); header.sliceGap = res[2] - header.sliceThickness; if (header.sliceGap < 0) { header.sliceGap = 0.0; } BvFmr fmr_file(fname); fmr_file.WriteFmr(header); } /// /** */ void NewBvOutputter::UpdateOutputForSeries(SeriesHandler* handler) { std::string series_uid(handler->GetSeriesUid()); RemoveSeries(series_uid); ImageFileName name; name.seriesUid = series_uid; name.SetPrefix(GenerateDefaultPrefix(handler)); // fill in default dirs FillInDefaultDirs(name, handler); std::string output_file_uid = series_uid; //Currently we assume that mosaics == BOLD images.... if (handler->IsMosaic()) { name.SetExt("fmr"); mOutputList.fileNameList.insert(make_pair(output_file_uid, name)); name.SetExt("stc"); int n_slices = handler->GetNumberOfSlices(); int ndigits = itos(n_slices).size(); for (int i = 1; i <= n_slices; ++i) { std::string postfix = "_"; postfix.append(itos(i, ndigits)); name.SetPostfix((postfix)); mOutputList.fileNameList.insert(make_pair(output_file_uid + postfix, name)); } } else { name.SetExt("vmr"); mOutputList.fileNameList.insert(make_pair(output_file_uid, name)); if (mSaveV16) { name.SetExt("v16"); mOutputList.fileNameList.insert(make_pair(output_file_uid, name)); } } } /// /** */ void NewBvOutputter::SetOption(const std::string& name, int value) { OutputterBase::SetOption(name, value); if (name.find("skip") != std::string::npos) { mSkip = value; } } /// /** */ void NewBvOutputter::SetOption(const std::string& name, bool value) { OutputterBase::SetOption(name, value); if (name.find("v16") != std::string::npos) { mSaveV16 = value; } } mriconvert/FslNiftiOutputter.cpp0000750000175000000620000000363012542632312016432 0ustar stevestaff/// FslNiftiOutputter.cpp /** */ #include #include #include "SeriesHandler.h" #include "NiftiOutputterBase.h" #include "FslNiftiOutputter.h" using namespace jcs; /// /** */ FslNiftiOutputter::FslNiftiOutputter() : NiftiOutputterBase(CreateOptions()) { } /// /** */ Options FslNiftiOutputter::CreateOptions() { Options options = Get3DOptions(); options.pathname = "FslNifti"; return options; } /// /** */ void FslNiftiOutputter::UpdateOutputForSeries(SeriesHandler* handler) { Basic3DOutputter::UpdateOutputForSeries(handler); } /// /** Perform the conversion on the given series. * \param handler A pointer to a SeriesHandler. * \return Status code. */ int FslNiftiOutputter::ConvertSeries(SeriesHandler* handler) { int bits_allocated, pixel_rep = 0; handler->Find("BitsAllocated", bits_allocated); handler->Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 8 : { FslNiftiConversion conversion(this, handler); conversion.Convert(); break; } case 9 : { FslNiftiConversion conversion(this, handler); conversion.Convert(); break; } case 16 : { FslNiftiConversion conversion(this, handler); conversion.Convert(); break; } case 17 : { FslNiftiConversion conversion(this, handler); conversion.Convert(); break; } case 32 : { FslNiftiConversion conversion(this, handler); conversion.Convert(); break; } case 33 : { FslNiftiConversion conversion(this, handler); conversion.Convert(); break; } default : { wxLogMessage(_("BitsAllocated and PixelRepresentation values (%d, %d) not supported."), bits_allocated, pixel_rep); } } return 1; } mriconvert/GeEpiHandler.cpp0000640000175000000620000000212312542632311015240 0ustar stevestaff/// GeEpiHandler.cpp /** */ #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "SeriesHandler.h" #include "GeEpiHandler.h" using namespace jcs; /// /** */ GeEpiHandler::GeEpiHandler(const std::string& seriesUid) : SeriesHandler(seriesUid) { } /// /** */ SeriesHandler::VolListType GeEpiHandler::ReadVolIds(DicomFile& file) { VolListType v = SeriesHandler::ReadVolIds(file); int image_number, number_of_slices; if (!file.Find("InstanceNumber", image_number)) { wxLogError(_("Instance number not found")); } Dictionary* Excite = Excite_Dictionary::Instance(); if (!file.Find(Excite->Lookup("Locations_in_acquisition"), number_of_slices)) { wxLogError(_("Locations_in_acquisition not found")); } int vol_no = static_cast(floor(static_cast((image_number - 1)) /number_of_slices) + 1); v.front().ids.push_back(itos(vol_no, 3)); return v; } mriconvert/metaTypes.h0000640000175000000620000001471612542632311014404 0ustar stevestaff/*! * File: * MetaTypes (.h and .cpp) * * Description: * This file provides the definition of the enumerated types used by * metaObjects as well as the record structured used to describe the * fields to be read and written by MetaObjects. * * * \author Stephen R. Aylward * \date August 29, 1999 * */ #ifndef METATYPES_H #define METATYPES_H typedef char MET_ASCII_CHAR_TYPE; typedef char MET_CHAR_TYPE; typedef unsigned char MET_UCHAR_TYPE; typedef short MET_SHORT_TYPE; typedef unsigned short MET_USHORT_TYPE; // 32 bits on 32- and 64-bit Unix typedef int MET_INT_TYPE; typedef unsigned int MET_UINT_TYPE; // 32 bits on 32-bit Unix, 64 bits on 64-bit Unix typedef int MET_LONG_TYPE; typedef unsigned int MET_ULONG_TYPE; #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MING_W32__) typedef __int64 MET_LONG_LONG_TYPE; typedef unsigned __int64 MET_ULONG_LONG_TYPE; #else // 64 bits on 32- and 64-bit Unix typedef long long MET_LONG_LONG_TYPE; typedef unsigned long long MET_ULONG_LONG_TYPE; #endif typedef float MET_FLOAT_TYPE; typedef double MET_DOUBLE_TYPE; typedef char * MET_STRING_TYPE; // Value types for the variables in a metaFile // Format for variables defined in a metaFile is // = // where is a designated fieldname/keyword (e.g., NDims) // and value is an instance of that fieldname's associated valueType #define MET_NUM_VALUE_TYPES 29 typedef enum { MET_NONE, MET_ASCII_CHAR, MET_CHAR, MET_UCHAR, MET_SHORT, MET_USHORT, MET_INT, MET_UINT, MET_LONG, MET_ULONG, MET_LONG_LONG, MET_ULONG_LONG, MET_FLOAT, MET_DOUBLE, MET_STRING, MET_CHAR_ARRAY, MET_UCHAR_ARRAY, MET_SHORT_ARRAY, MET_USHORT_ARRAY, MET_INT_ARRAY, MET_UINT_ARRAY, MET_LONG_ARRAY, MET_ULONG_ARRAY, MET_LONG_LONG_ARRAY, MET_ULONG_LONG_ARRAY, MET_FLOAT_ARRAY, MET_DOUBLE_ARRAY, MET_FLOAT_MATRIX, MET_OTHER } MET_ValueEnumType; const unsigned char MET_ValueTypeSize[MET_NUM_VALUE_TYPES] = { 0, 1, 1, 1, 2, 2, 4, 4, 4, 4, 8, 8, 4, 8, 1, 1, 1, 2, 2, 4, 4, 4, 4, 8, 8, 4, 8, 4, 0 }; const char MET_ValueTypeName[MET_NUM_VALUE_TYPES][21] = { {'M','E','T','_','N','O','N','E','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','A','S','C','I','I','_','C','H','A','R','\0',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','C','H','A','R','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','C','H','A','R','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','S','H','O','R','T','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','S','H','O','R','T','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','I','N','T','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','I','N','T','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','L','O','N','G','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','L','O','N','G','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','L','O','N','G','_','L','O','N','G','\0',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','L','O','N','G','_','L','O','N','G','\0',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','F','L','O','A','T','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','D','O','U','B','L','E','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','S','T','R','I','N','G','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','C','H','A','R','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','C','H','A','R','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' '}, {'M','E','T','_','S','H','O','R','T','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' '}, {'M','E','T','_','U','S','H','O','R','T','_','A','R','R','A','Y','\0',' ',' ',' ',' '}, {'M','E','T','_','I','N','T','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','I','N','T','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','L','O','N','G','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' ',' '}, {'M','E','T','_','U','L','O','N','G','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' '}, {'M','E','T','_','L','O','N','G','_','L','O','N','G','_','A','R','R','A','Y','\0',' '}, {'M','E','T','_','U','L','O','N','G','_','L','O','N','G','_','A','R','R','A','Y','\0'}, {'M','E','T','_','F','L','O','A','T','_','A','R','R','A','Y','\0',' ',' ',' ',' ',' '}, {'M','E','T','_','D','O','U','B','L','E','_','A','R','R','A','Y','\0',' ',' ',' ',' '}, {'M','E','T','_','F','L','O','A','T','_','M','A','T','R','I','X','\0',' ',' ',' ',' '}, {'M','E','T','_','O','T','H','E','R','\0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}}; typedef enum { MET_ORIENTATION_RL, MET_ORIENTATION_LR, MET_ORIENTATION_AP, MET_ORIENTATION_PA, MET_ORIENTATION_SI, MET_ORIENTATION_IS, MET_ORIENTATION_UNKNOWN } MET_OrientationEnumType; #define MET_NUM_ORIENTATION_TYPES 7 const char MET_OrientationTypeName[MET_NUM_ORIENTATION_TYPES][3] = { {'R','L','\0'}, {'L','R','\0'}, {'A','P','\0'}, {'P','A','\0'}, {'S','I','\0'}, {'I','S','\0'}, {'?','?','\0'}}; // Structure used to define a field (variable = value definition) in a MetaFile typedef struct { char name[255]; // Fieldname / keyword to designate a variable MET_ValueEnumType type; // Expected value type of the field bool required; // Is this field a required field in a metaFile int dependsOn; // If value type is an array, the size of this // array can be defined by a different field // (e.g., DimSize array depends on NDims) bool defined; // Has this field already been defined in the // MetaFile being parsed int length; // Actual/expect length of an array double value[255]; // Memory and pointers for the field's value(s). bool terminateRead; // Set to true if field indicates end of // meta data } MET_FieldRecordType; #endif mriconvert/fileformats.h0000750000175000000620000001255612542632322014750 0ustar stevestaff// fileformats.h // Note explicit newlines and line continuation characters, // required to allow proper interaction with wxTextCtrl. std::string fileformats_h = "About medical image coordinate systems \n \n \ \n \ Medical image data can be (and is) stored in a variety of ways. In order to orient a two-dimensional image or three-dimensional volume in space, one needs to know how the order of the data on disk relates to a standard set of axes. For medical imaging, these axes are generally chosen to correspond to the directions left/right, posterior/anterior, and superior/inferior. \n \ \n \ \n \ DICOM \n \ \n \ The DICOM standard uses a patient-centric LPS, coordinate system, where +x = left, +y = posterior, and +z = superior. The direction cosines between the rows and columns of the image and these axes are stored in the Image Orientation Patient field. For axial images with no rotation, this field will be 1/0/0/0/1/0. \ This may be read as \"image rows increase from right to left, image columns increase from anterior to posterior\". Most DICOM viewers follow the convention of plotting the data starting in the upper left corner of the view. For axial brain images, this will place the left side of the brain on the right side of the view, and the posterior of the brain toward the bottom of the view. This point of view is sometimes refered to as \"radiological\". \ \n \n \ Sagital images will have an Image Orientation Patient field of 0/1/0/0/0/-1, indicating that rows increase from anterior to posterior, and columns increase from superior to inferior. In this case, the posterior will be toward the right, and the inferior toward the bottom (as one well might wish). Coronal images will have an Image Orientation Patient field of 1/0/0/0/0/-1. \n \ \n \ MRIConvert uses the Image Orientation Patient field to calculate the normal to the image plane, and the Image Position Patient to determine the position of each slice along the normal. This is the only method of ordering slices that will always work with any DICOM-compliant files. \n \ \n \ Only the NIfTI output formats preserve the full orientation information. For BrainVoyager and the Analyze variants, the data is assumed to represent axial slices, and the order of the data is changed to match the standard orientation of these formats. For Metaimage output, no assumptions are made about data order, and no orientation information is stored. \n \ \n \ \n \ Analyze 7.5 \n \ \n \ Analyze 7.5 files are output in the LAS coordinate system. The image data is flipped in the column direction before writing. Currently, the orient field is always set to the value 0, indicating transverse unflipped data, regardless of whether the data represents transverse, sagital, coronal, or oblique slices. \n \ \n \ Most Analyze viewers plot image data starting from the lower left corner of the view. For \"LA\" axial images, this results in a \"radiological\" view identical to the original DICOM view. Note the \"LAS\" is a left-handed coordinate system. Left-handed data ordering is sometimes refered to as \"radiological\" ordering, and right-handed ordering as \"neurological\". Those terms can be misleading and should probably be restricted to their original context: describing the appearance of two-dimensional transverse brain images. \n \ \n \ \n \ SPM99/Analyze \n \ \n \ The SPM99/Analyze output of MRIConvert is similar to the Analyze 7.5 output, with a few important distinctions. In the header, the \"originator\" field, left blank for Analyze 7.5, is now defined as the \"origin\" field. MRIConvert sets this to the middle of the volume. More importantly, the image data is rotated 180 degrees before writing. This means that transverse slices are stored RAS. \n \ \n \ \n \ NIfTI \n \ \n \ NIfTI output is based on the most straightforward conversion of DICOM to NIfTI according to the NIfTI standard. Image data is not rewritten, and the image orientation relative to NIfTI's standard RAS axes is given by the qform fields. You can expect axial images to be stored LPS. How they are displayed and interpreted will (as always) depend entirely on the software you use to read them, its assumption about data order, and its support (or lack thereof) for the qform information. Any software fully compliant with the NIfTI standard should be able to read these files and their orientations. \n \ \n \ \n \ FSL/NIfTI \n \ \n \ This is an output format specifically designed for use with FSL. It should be emphasized that this is a fully compliant NIfTI file, and not an FSL-specific variant. However, data order and some header fields have been modified to make use with FSL a bit smoother. Data is flipped top bottom, as in the Analyze 7.5 output, to avoid problems with FSL's coordinate system. This will also result in a more intuitive view in FSLView and other FSL-generated reports. All transformations are accounted for in the qform fields. Also, the data type for unsigned 16 bit data has been changed to signed 16 bit, as FSL does not yet support the unsigned 16 bit data type. This should not be a problem for MRI data, as it uses only the lower 12 bits. Also, for Siemen's diffusion images, bvals and bvecs files will be created automically. The values in these files will reflect any rotation of the image volume relative to the gradient coordinates, and will be correspond to the order of the data on disk. \n \ \n \ "; mriconvert/InfoFrame.cpp0000640000175000000620000000210412542632312014617 0ustar stevestaff/// InfoFrame.cpp /** */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include #include #include "InfoFrame.h" /// /** */ InfoFrame::InfoFrame(wxWindow* parent, std::vector info) : wxFrame(parent, -1, _T("Series info")) { wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL); mTextCtrl = new wxTextCtrl(this, -1, _T(""), wxDefaultPosition, wxSize(400,400), wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH); frameSizer->Add(mTextCtrl, 1, wxEXPAND); std::vector::iterator it = info.begin(); std::vector::iterator it_end = info.end(); for (; it != it_end; ++it) { AddString(*it); } SetSizer(frameSizer); frameSizer->Fit(this); mTextCtrl->SetInsertionPoint(0); } /// /** */ int InfoFrame::AddString(std::string& s) { mTextCtrl->AppendText(wxString(s.c_str(), wxConvLocal)); mTextCtrl->AppendText(_T("\n")); return 1; } mriconvert/DicomElement.h0000640000175000000620000000146012542632326014774 0ustar stevestaff/// DicomElement.h /** */ #ifndef DICOMELEMENT_H_ #define DICOMELEMENT_H_ #include #include #include #include #include #include #include "DicomTag.h" namespace jcs { /// /** Provides the relationship between a DICOM tag and text description of the tag. */ struct DicomElement { DicomElement() {} DicomElement(const DicomTag& tag, const char* desc = "", const char* vr = "UN") : tag(tag), description(desc), vr(vr) {} /// The DICOM group and element numbers. DicomTag tag; /// The DICOM field name. std::string description; /// The DICOM field data type identifier. std::string vr; std::string value; wxUint32 value_length; }; } #endif mriconvert/MessageList.h0000640000175000000620000000114712542632314014646 0ustar stevestaff#ifndef MESSAGE_LIST_H_ #define MESSAGE_LIST_H_ #include #include class wxListView; namespace jcs { typedef std::vector Message; typedef std::vector MessageList; class MessageListDlg : public wxDialog { public: MessageListDlg(const wxString& title); void AddMessages(const MessageList& messages); void SetColumns(const Message& columns); void OnSave (wxCommandEvent& event); protected: DECLARE_EVENT_TABLE() private: wxListView* mpListView; wxString mGetItemText(long index, int column) const; }; } #endif mriconvert/AnalyzeVolume.h0000750000175000000620000000467312542632315015233 0ustar stevestaff/// AnalyzeVolume.h /** Implements the structure of the Analyze format. */ #ifndef ANALYZE_VOLUME_H_ #define ANALYZE_VOLUME_H_ #include #include #include #include "Volume.h" #include "Globals.h" #include "BasicVolumeFormat.h" namespace jcs { struct AnalyzeHeader:public Basic3DHeader { struct header_key{ wxInt32 sizeof_hdr; char data_type[10]; char db_name[18]; wxInt32 extents; wxInt16 session_error; char regular; char hkey_un0; } hk; struct image_dimension { wxInt16 dim[8]; wxInt16 unused8; wxInt16 unused9; wxInt16 unused10; wxInt16 unused11; wxInt16 unused12; wxInt16 unused13; wxInt16 unused14; wxInt16 datatype; wxInt16 bitpix; wxInt16 dim_un0; float pixdim[8]; float vox_offset; float funused1; float funused2; float funused3; float cal_max; float cal_min; float compressed; float verified; wxInt32 glmax, glmin; } dime; struct data_history { char descrip[80]; char aux_file[24]; char orient; char originator[10]; char generated[10]; char scannum[10]; char patient_id[10]; char exp_date[10]; char exp_time[10]; char hist_un0[3]; wxInt32 views; wxInt32 vols_added; wxInt32 start_field; wxInt32 field_skip; wxInt32 omax, omin; wxInt32 smax, smin; } hist; virtual void SetNumberOfSlices(int slices) { dime.dim[3] = slices; } virtual void SetSliceSpacing(double spacing) { dime.pixdim[3] = static_cast(spacing); } virtual int GetNumberOfSlices() { return dime.dim[3]; } void InitHeader(); }; class AnalyzeVolume: public BasicVolumeFormat { public : AnalyzeVolume(const char* filename, const char* header_extension, const char* raw_extension); ~AnalyzeVolume(); AnalyzeHeader GetHeader() { return mHeader; } void WriteHeader(Basic3DHeader* header); protected: private : AnalyzeHeader mHeader; enum aEndianType { aLITTLE_ENDIAN, aBIG_ENDIAN }; aEndianType mByteOrder; void mInitHeader(); int mWriteHeaderFile(); }; } #endif mriconvert/SyngoHandler.cpp0000640000175000000620000002315212542632315015357 0ustar stevestaff/// SyngoHandler.cpp /** */ #include "SyngoHandler.h" using namespace jcs; /// /** */ SyngoHandler::SyngoHandler(const std::string& seriesUid):SeriesHandler(seriesUid) { } /// /** */ int SyngoHandler::ReadCSAImageHeader(const std::string& tag, std::string& value) const { int retval = 0; if (!mFileMap.empty()) { DicomFile dicomFile((*mFileMap.begin()).first.c_str()); retval = dicomFile.ReadCSAImageHeader(tag, value); } return retval; } /// /** */ int SyngoHandler::ReadCSASeriesHeader(const std::string& tag, std::string& value) const { int retval = 0; if (!mFileMap.empty()) { DicomFile dicomFile((*mFileMap.begin()).first.c_str()); retval = dicomFile.ReadCSASeriesHeader(tag, value); } return retval; } /// /** Returns slice duration as calculated from the MosaicRefAcqTimes tag. \return Average difference between times in MosaicRefAcqTimes. */ double SyngoHandler::GetSliceDuration() const { double duration = 0; std::string str, mos_acq, word; mos_acq = Find(DicomTag(0x0019, 0x1029)); std::stringstream stream(mos_acq); std::vector acq_times; while(getline(stream, word, '/')) { acq_times.push_back(stof(word)); } sort(acq_times.begin(), acq_times.end()); duration = SeriesHandler::GetMeanVolumeInterval(acq_times); //int err = ReadCSAImageHeader("SliceMeasurementDuration", str); //if (err > 0) { // duration = stof(str); //} //std::cout << "GetSliceDuration: " << str << std::endl; return duration; } /// /** */ AoCode SyngoHandler::GetAcquisitionOrder() const { AoCode retval = UNKNOWN; std::string protocol; int err = ReadCSASeriesHeader("MrProtocol", protocol); if (err == -1) { err = ReadCSASeriesHeader("MrPhoenixProtocol", protocol); } if (err > 0) { std::string::size_type pos = protocol.find("sSliceArray.ucMode"); pos = protocol.find('=', pos); pos = protocol.find_first_not_of(' ', pos+1); if (pos != std::string::npos) { std::string acquisition = protocol.substr(pos, 3); if (acquisition == "0x1") { return ASCENDING; } if (acquisition == "0x2") { return DESCENDING; } if (acquisition == "0x4") { if (GetNumberOfSlices() % 2 == 0) { return INTERLEAVED_EVEN; } else { return INTERLEAVED_ODD; } } else { return OTHER; } } } return UNKNOWN; } /// /** */ bool SyngoHandler::IsMoCo() const { if (!mFileMap.empty()) { std::string imageType; DicomFile dicomFile((*mFileMap.begin()).first.c_str()); dicomFile.Find("ImageType", imageType); if (imageType.find("MOCO") != std::string::npos) { return true; } } return false; } /// /** Add more qualifiers to the unique volume id. \param file A DicomFile reference. \return A VolListType object. */ SeriesHandler::VolListType SyngoHandler::ReadVolIds(DicomFile& file) { VolListType v = SeriesHandler::ReadVolIds(file); // needed for DTI std::string str; file.Find("SequenceName", str); std::string::size_type pos = str.find('#'); if (pos != std::string::npos) { int zeros_to_add = 4 + pos - str.length(); str.insert(pos+1, zeros_to_add, '0'); pos = str.find('b') + 1; if (pos != std::string::npos) { std::string::size_type pos2 = str.find_first_not_of("0123456789", pos); zeros_to_add = 4 + pos - pos2; str.insert(pos, zeros_to_add, '0'); } } str = RemoveInvalidChars(str); v.front().ids.push_back(str); int an; file.Find("AcquisitionNumber", an); int width = 4; str = itos(an, width); v.front().ids.push_back(str); str.clear(); file.ReadCSAImageHeader("UsedChannelMask", str); v.front().ids.push_back(RemoveInvalidChars(str)); return v; } /// /** */ bool SyngoHandler::IsDti() const { std::string bValue; int err = ReadCSAImageHeader("B_value", bValue); return (err > 0); } /// /** */ GradientInfo SyngoHandler::GetGradientInfo() { GradientInfo info; std::map volFileMap = GetVolIdsAndFiles(); std::map::iterator it = volFileMap.begin(); std::map::iterator it_end = volFileMap.end(); DicomFile first_file(it->second.c_str()); std::string version; //first_file.Find("SoftwareVersion", version); first_file.Find("SoftwareVersions", version); if (version.find("B15") != std::string::npos) { wxLogWarning(_("Warning: Polarity of the bvecs may be wrong for VB15 data.")); } if (version.find("B13") != std::string::npos) { wxLogWarning(_("Warning: bvecs are sometimes wrong for VB13 data, due to a bug in the algorithm by which Siemen's converted the B_matrix to a principle eigendirection. Use with caution.")); } for (; it != it_end; ++it) { std::string bValue; std::string directionality; std::vector gradDir; DicomFile file(it->second.c_str()); int err = file.ReadCSAImageHeader("B_value", bValue); if (err > 0) { info.values.push_back(stof(bValue)); } err = file.ReadCSAImageHeader("DiffusionGradientDirection", gradDir); if ((err < 0) || (gradDir.size() != 3)) { info.xGrads.push_back(0); info.yGrads.push_back(0); info.zGrads.push_back(0); } else { info.xGrads.push_back(stof(gradDir.at(0))); info.yGrads.push_back(stof(gradDir.at(1))); info.zGrads.push_back(stof(gradDir.at(2))); } } std::vector r = GetRotationMatrix(volFileMap.begin()->first); RotateGradInfo(info, r); return info; } /// /** Calculates time interval between volumes using Siemens shadow header element TimeAfterStart. \return Time difference between two consecutive volume or 0 on failure retrieving TimeAfterStart. */ double SyngoHandler::GetVolumeInterval() const { double retval = 0; FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator it_end = mFileMap.end(); std::map > vtmap; for (double time = 0; it != it_end; ++it) { DicomFile file(it->first.c_str()); std::string str; if (file.ReadCSAImageHeader("TimeAfterStart", str) <= 0) { return retval; } time = stof(str); vtmap[it->second.front()].push_back(time); } retval = CalculateVolIntVal(vtmap, 3); return retval; } std::vector SyngoHandler::GetStringInfo() { std::vector v = SeriesHandler::GetStringInfo(); DicomElement BandwidthPerPixelPhaseEncode(DicomTag(0x0019,0x1028)); float bwPerPixPhasEnc = 1; if (Find(BandwidthPerPixelPhaseEncode, bwPerPixPhasEnc)) { DicomFile dicomFile((*mFileMap.begin()).first.c_str()); int phaseEncodingLines, accelFact; std::string protocol; int err = ReadCSASeriesHeader("MrProtocol", protocol); if (err == -1) { err = ReadCSASeriesHeader("MrPhoenixProtocol", protocol); } if (err > 0) { std::string::size_type pos = protocol.find("sKSpace.lPhaseEncodingLines"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> phaseEncodingLines; } pos = protocol.find("sPat.lAccelFactPE"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> accelFact; } } std::string phaseEncodeDirection = Find("InPlanePhaseEncodingDirection"); int reconstructedPhaseLines = 1; if (phaseEncodeDirection == "COL") reconstructedPhaseLines = GetRows(); if (phaseEncodeDirection == "ROW") reconstructedPhaseLines = GetColumns(); int echoTrainLength; Find("EchoTrainLength", echoTrainLength); float phaseRes; Find("PercentSampling", phaseRes); v.push_back(std::string("Acceleration factor: " + itos(accelFact))); float echoSpacing = 10*accelFact*phaseRes/(phaseEncodingLines * bwPerPixPhasEnc); float effectiveEchoSpacing = 1000/(reconstructedPhaseLines * bwPerPixPhasEnc); // this is almost the same but not quite // float totalReadoutTime = (reconstructedPhaseLines - 1) * effectiveEchoSpacing/1000; float totalReadoutTime = (phaseEncodingLines - 1) * echoSpacing/1000; float totalRoTimeSpm = (phaseEncodingLines) * echoSpacing/1000; v.push_back(std::string("Echo spacing (ms): " + ftos(echoSpacing))); v.push_back(std::string("Effective echo spacing (ms): " + ftos(effectiveEchoSpacing))); v.push_back(std::string("Total readout time (FSL definition) (s): " + ftos(totalReadoutTime))); v.push_back(std::string("Total readout time (SPM definition) (s): " + ftos(totalRoTimeSpm))); /* std::string acqMatText; Find(AcquisitionMatrixText, acqMatText); float acqMatPhase = stof(acqMatText); if (acqMatPhase != 0 && bwPerPixPhasEnc != 0) { float effectiveEchoSpacing = 1000/(acqMatPhase * bwPerPixPhasEnc); int echoTrainLength; Find("EchoTrainLength", echoTrainLength); v.push_back(std::string("Acquisition Matrix Text " + acqMatText)); v.push_back(std::string("Echo train length " + itos(echoTrainLength))); float actualEchoSpacing = 1000/(echoTrainLength * bwPerPixPhasEnc); float totalReadoutTime = (echoTrainLength - 1) * actualEchoSpacing/1000; v.push_back(std::string("Echo spacing (ms): " + ftos(actualEchoSpacing))); v.push_back(std::string("Effective echo spacing (ms): " + ftos(effectiveEchoSpacing))); v.push_back(std::string("Total readout time (s): " + ftos(totalReadoutTime))); } */ } return v; }mriconvert/Basic3DOutputter.h0000640000175000000620000000615612542632311015574 0ustar stevestaff/// Basic3DOutputter.h /** */ #ifndef BASIC_3D_OUTPUTTER_H_ #define BASIC_3D_OUTPUTTER_H_ #include #include "OutputterBase.h" #include "SeriesHandler.h" namespace jcs { class BasicVolumeFormat; struct Basic3DHeader; /// Handles header+raw volume types /** */ class Basic3DOutputter : public OutputterBase { public : Basic3DOutputter(const Options& options); virtual ~Basic3DOutputter(); virtual void UpdateOutputForSeries(SeriesHandler* handler); virtual int ConvertSeries(SeriesHandler* handler) = 0; virtual void RemoveSeries(const std::string& seriesUid); virtual BasicVolumeFormat* GetOutputVolume(const char* file) = 0; // following only used internally or by basic conversion wxFileName GetFileNameFromVolId(const VolId& VolId); int GetDimensionality() const { return dim_; } int GetDimensionality(const std::string& series_uid); void SetDimensionality(int dim) { dim_ = dim; } void SetDimensionality(const std::string& series_uid, int dim); int GetSkip() const { return skip_; } int GetSkip(const std::string& series_uid); void SetSkip(int skip) { skip_ = skip; } void SetSkip(const std::string& series_uid, int skip); bool GetRescale() const { return rescale; } bool GetRescale(const std::string& series_uid); void SetRescale(bool value) { rescale = value; } void SetRescale(const std::string& series_uid, bool value); virtual void SetOption(const std::string& name, int value); virtual void SetOption(const std::string& name, bool value); /// Filename extension for header file. wxString headerExtension; /// Filename extension for image/raw data file. wxString rawExtension; bool rescale; std::string bvecs_postfix; std::string bvals_postfix; std::string moco_postfix; std::string info_postfix; std::string txt_ext; protected: std::map volKeyMap; static Options Get3DOptions(); private: int dim_; int skip_; void RegisterOutputFile(std::string series_uid, std::string ext, std::string postfix, SeriesHandler* handler); }; template class Basic3DConversion { public: Basic3DConversion(Basic3DOutputter* outputter, SeriesHandler* handler); ~Basic3DConversion() {} virtual void Convert(); typedef std::map > vMapType; protected: virtual void GetHeaderForSeries() = 0; virtual void CompleteHeaderForVolume(std::pair > volPair) { } virtual void ProcessSlice(std::vector& slice) { } virtual Basic3DHeader* GetHeader() = 0; int GetSkip(); int GetNumberOfVolumes(); void ProcessSlicesAndAppend(BasicVolumeFormat* outputVolume, typename vMapType::iterator it); Basic3DOutputter* mOutputter; SeriesHandler* mHandler; void WriteGradientFiles(); private: void WriteMoCoFiles(); void WriteStringInfo(); void IterativeWrite(wxFileName fileName, std::vector src); }; } #include "Basic3DConversion.txx" #endif mriconvert/ByteSwap.h0000640000175000000620000000117212542632332014162 0ustar stevestaff#ifndef BYTESWAP_H_ #define BYTESWAP_H_ /* This function template byte swap numbers or elements in an array. The first argument is a reference to the number or array; the second argument is the size of the array elements that need to be rearranged. */ namespace jcs { template void ByteSwap(T& rBuffer, int n) { char* bp = reinterpret_cast(&rBuffer); char* sp = new char[n]; for (int j = 0; j < sizeof(rBuffer); j += n) { for (int i = 0; i < n; ++i) *sp++ = *bp++; bp -= n; for (int j = 0; j < n; ++j) *bp++ = *--sp; } delete sp; } } #endif mriconvert/Preamble.cpp0000640000175000000620000000130212542632322014500 0ustar stevestaff/// Preamble.cpp /** Encapsulates DICOM preamble. \author Chuck Theobald */ #include "Preamble.h" using namespace jcs; /// /** Reads the input stream assuming a DICOM preamble. Also reads the four-character magic sequence. */ std::istream & jcs::operator>> (std::istream &in, Preamble &p) { in.ignore(128); in.read(p.buff, sizeof(p.buff)); p.magic.assign(p.buff); return in; } /// /** Tests whether the input stream is DICOM. \return True if magic identifies a DICOM file stream. False if magic is not "DICM". */ bool Preamble::IsDICOM() { bool retval = false; if (magic == "DICM") { retval = true; } return retval; } mriconvert/Converter.h0000640000175000000620000000276312542632317014405 0ustar stevestaff/// Converter.h /** */ #ifndef CONVERTER_H_ #define CONVERTER_H_ #include #include #include #include #include "SeriesHandler.h" #include "OutputterBase.h" namespace jcs { typedef std::vector Message; typedef std::vector MessageList; class Converter { private : typedef std::vector StringVector; typedef std::map StringMap; typedef std::map HandlerMap; public : Converter() {} Converter(int type); ~Converter(); OutputList* GetOutputList() { return &mpOutputter->mOutputList; } OutputterBase* GetOutputter() { return mpOutputter; } const StringVector GetStringInfo(const std::string& s) const; const StringVector GetSeriesList(); SeriesHandler* GetHandler(const std::string& s) { return mHandlerMap[s]; } void SetOutput(int type); int AddFile(const wxString& path, const wxString& match = _T("")); void UpdateOutput(); void UpdateAllOutput(); void UpdateOutput(const std::string& seriesUid); void RemoveSeries(const std::string& seriesUid); void Cancel() { mCancel = true; } bool IsCancelled() { return mCancel; } void ConvertAll(); MessageList messages; private : bool mAddFile(const wxString& path, const wxString& match, wxString& message); // Indexed by SeriesUID. HandlerMap mHandlerMap; bool mCancel; OutputterBase* mpOutputter; std::set mSeriesToUpdate; }; } #endif mriconvert/HandlerFactory.h0000640000175000000620000000053512542632322015332 0ustar stevestaff/// HandlerFactory.h /** */ #ifndef HANDLER_FACTORY_H_ #define HANDLER_FACTORY_H_ #include "DicomFile.h" #include "SeriesHandler.h" namespace jcs { class HandlerFactory { public: static SeriesHandler* CreateHandler(const char* filename); private: static int GetSeriesType(DicomFile& file); }; } #endif mriconvert/NewSpmOutputter.h0000640000175000000620000000175712542632333015603 0ustar stevestaff#ifndef NEW_SPM_OUTPUTTER_H_ #define NEW_SPM_OUTPUTTER_H_ #include #include #include "Basic3DOutputter.h" #include "BasicVolumeFormat.h" namespace jcs { struct NewSpmHeader; class NewSpmOutputter : public Basic3DOutputter { public : NewSpmOutputter(); virtual int ConvertSeries(SeriesHandler* handler); protected: virtual BasicVolumeFormat* GetOutputVolume(const char* file); // virtual Basic3DHeader* GetHeader(SeriesHandler* handler); private: static Options CreateOptions(); }; template class SpmConversion: public Basic3DConversion { public: SpmConversion(Basic3DOutputter* outputter, SeriesHandler* handler); ~SpmConversion(); protected: virtual void GetHeaderForSeries(); virtual void CompleteHeaderForVolume(std::pair > volPair); virtual void ProcessSlice(std::vector& slice); NewSpmHeader* GetHeader() { return mHeader; } private: NewSpmHeader* mHeader; }; } #endif mriconvert/ToshibaDictionary.h0000640000175000000620000000217012542632311016037 0ustar stevestaff/// /** As defined in Toshiba conformance Statement MIIMR0005EA (2006). Excelart series. Note that MIIM0006EAB (2011, 0xVantage-Titan) specifies no private tags. */ //group, 0xelement name VR VM mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0x00xx ), "Private Creator Code", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx00 ), "Scale Factor", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx01 ), "Acquisition Order", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx02 ), "Orientation Vector", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx03 ), "Flip Flag", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx04 ), "Rotate Information", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx05 ), "FOV", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx06 ), "Image Matrix", "US" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx07 ), "Image Information", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx08 ), "Original Data", "OB" )); mAddEntry ( DicomElement ( DicomTag ( 0x700D, 0xxx09 ), "Original Data Flag", "SS" )); mriconvert/AnalyzeOptionsDlg.h0000640000175000000620000000103612542632311016026 0ustar stevestaff/// AnalyzeOptionsDlg.h /** */ #ifndef ANALYZE_OPTIONS_DLG_H_ #define ANALYZE_OPTIONS_DLG_H_ #include "BasicOptionsDlg.h" namespace jcs { class AnalyzeOutputter; class AnalyzeOptionsDlg: public BasicOptionsDlg { public: AnalyzeOptionsDlg(AnalyzeOutputter* outputter); void OnOkay(wxCommandEvent& event); bool NeedsRebuild() const { return mNeedsRebuild; } protected: DECLARE_EVENT_TABLE() private: AnalyzeOutputter* mOutputter; bool mNeedsRebuild; }; } #endif mriconvert/README-SRC.txt0000640000175000000620000000501312542632773014405 0ustar stevestaffBuilding MRIConvert/mcverter From Source ======================================== This document details the packages and configuration needed to build MRIConvert and mcverter from source. It applies to versions prior to 2.1.0. Requirements ============ The MRIConvert source package A C++ development system CMake 2.8.2 or greater wxWidgets 2.8.12, or 2.9.4 for OS X Boost 1.52.0 CMake ===== The generic installation is suitable in most cases. If your platform application manager does not provide version 2.8.2 or greater, installation from source is recommended. wxWidgets ========= We recommend building this package from source. This must be built with Unicode support. Building as a static library is also recommended. Configuration details for different platforms are listed below. Linux ----- Install with the wxGTK source package. ./configure --prefix=/usr --disable-shared --enable-unicode --with-libjpeg=builtin --with-libregex=builtin --with-libexpat=builtin --with-libtiff=builtin --with-libpng=builtin --with-zlib=builtin make make install OS X ---- Install with the wxWidgets source package. ./configure --disable-shared --enable-universal_binary=x86_64 --enable-cmdline --enable-dnd --enable-checkbox --enable-checklst --enable-button --with-osx_cocoa --prefix=/usr make make install Windows ------- 1) Run installer wxMSW-2.8.12-Setup.exe. Recommended location is the root of the system drive. 2) Create wxWidgets-2.8.12/include/wx/setup.h, add a single line: #include 3) Modify wxWidgets-2.8.12/include/wx/msw/setup.h to set appropriate options: #define WXWIN_COMPATIBILITY_2_6 0 and #ifndef wxUSE_UNICODE #define wxUSE_UNICODE 1 #endif 4) Load project wxWidgets-2.8.12/build/msw/wx.dsw into Visual Studio. 5) Use Configuration Manager to change the Configuration for all sub-projects to Unicode Release. 6) Run Build->Build Solution. Boost ===== Installation from source is recommended for all platforms. A g++ development environment is assumed for the steps below. Download and extract the boost_1_52_0 archive to a convenient location. Then run commands to accomplish the following tasks: cd run the bootstrap script run "b2 --with-program_options" MRIConvert and mcverter ======================= Extract the tarball to a convenient location: tar xzf MRIConvert-n.n.n-src.tar.gz cd MRIConvert-n.n.n cmake make To install the files for general use, copy them to the location for your binaries, e.g. /usr/bin or /usr/local/bin. You will need administrator privileges for this step. mriconvert/OutputTreeNew.cpp0000640000175000000620000002702212542632333015554 0ustar stevestaff/// OutputTreeNew.cpp /** Classes used to display the folder heirarchy and list of files to be produced. */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include "file.xpm" #include "folder.xpm" #include "open_folder.xpm" #include "OutputterBase.h" #include "OutputList.h" #include "OutputTreeNew.h" #include "StringConvert.h" #include "McPanel.h" #include "Converter.h" using namespace jcs; enum { MENU_RENAME, MENU_OPTIONS, MENU_OVERRIDE }; BEGIN_EVENT_TABLE(NewOutputTreeCtrl, wxTreeCtrl) EVT_TREE_ITEM_RIGHT_CLICK(-1, NewOutputTreeCtrl::OnContextMenu) EVT_MENU(MENU_OVERRIDE, NewOutputTreeCtrl::OnMenuOverride) EVT_MENU(MENU_RENAME, NewOutputTreeCtrl::OnMenuRename) EVT_MENU(MENU_OPTIONS, NewOutputTreeCtrl::OnMenuOptions) // EVT_TREE_BEGIN_LABEL_EDIT(-1, NewOutputTreeCtrl::OnEditBegin) END_EVENT_TABLE() /// /** */ NewOutputTreeCtrl::NewOutputTreeCtrl(McPanel* parent, wxWindowID id, const wxString& root) : wxTreeCtrl(parent, id, wxDefaultPosition, wxDefaultSize, /*wxTR_EDIT_LABELS |*/ wxTR_HAS_BUTTONS | wxSUNKEN_BORDER), parentPanel(parent) { CreateImageList(); AddRoot(root, folder_icon, -1, new RootItem(root, *this)); SetItemImage(GetRootItem(), open_folder_icon, wxTreeItemIcon_Expanded); } /// /** */ NewOutputTreeCtrl::~NewOutputTreeCtrl() { } /// /** */ void NewOutputTreeCtrl::SetOutputter(OutputterBase* outputter) { mOutputter = outputter; mOutputter->mOutputList.rootDir = GetItemText(GetRootItem()); Reset(); RefreshList(); } /// /** */ void NewOutputTreeCtrl::CreateImageList(int size) { wxImageList* images = new wxImageList(size, size, true); images->Add(wxIcon(folder_xpm)); images->Add(wxIcon(open_folder_xpm)); images->Add(wxIcon(file_xpm)); AssignImageList(images); } /// /** */ void NewOutputTreeCtrl::RemoveBranch(wxTreeItemId branch) { if (branch != GetRootItem()) { if (dynamic_cast (GetItemData(branch))) { return; } wxTreeItemId parent = GetItemParent(branch); Delete(branch); if (parent != GetRootItem() && !ItemHasChildren(parent)) { RemoveBranch(parent); } } } /// /** */ void NewOutputTreeCtrl::Reset() { Collapse(GetRootItem()); DeleteChildren(GetRootItem()); } /// /** */ void NewOutputTreeCtrl::OnMenuOverride(wxCommandEvent& event) { wxTreeItemId item = GetSelection(); if (!item.IsOk()) { return; } // this is lame...this control is such a mess OutputTreeItemData* data = dynamic_cast(GetItemData(item)); std::string seriesUid = data->GetSeriesUid(); if (seriesUid.empty()) { return; } parentPanel->OnOverride(seriesUid); parentPanel->mpConverter->UpdateOutput(seriesUid); Reset(); RefreshList(); } /// /** */ // Find an item in a tree given a parent and unique ID. // If not found, return invalid item. wxTreeItemId NewOutputTreeCtrl::FindTreeItem(wxTreeItemId parent, const std::string& uid) { wxTreeItemIdValue cookie; wxTreeItemId item = GetFirstChild(parent, cookie); while (item.IsOk()) { OutputTreeItemData* itemData = dynamic_cast (GetItemData(item)); if (itemData->GetUid() == uid) { return item; } item = GetNextChild(parent, cookie); } return item; } /// /** */ wxString NewOutputTreeCtrl::GetStringSelection() const { wxString retval = "error"; wxTreeItemId item = GetSelection(); if (item.IsOk()) { retval = GetItemText(item); return GetItemText(item); } else { return _("error"); } } /// /** */ void NewOutputTreeCtrl::OnMenuOptions(wxCommandEvent& event) { parentPanel->OnOptions(event); } /// /** */ void NewOutputTreeCtrl::OnMenuRename(wxCommandEvent& event) { wxTreeItemId item = GetSelection(); if (item.IsOk()) { OutputTreeItemData* data = dynamic_cast(GetItemData(item)); data->OnRename(); parentPanel->SetPathInfo(GetStringSelection()); } } /// /** */ void NewOutputTreeCtrl::OnContextMenu(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); if (item.IsOk()) { SelectItem(item); OutputTreeItemData* data = dynamic_cast(GetItemData(item)); wxMenu menu; data->FillContextMenu(menu); wxPoint pos = ::wxGetMousePosition(); PopupMenu(&menu, ScreenToClient(pos)); } } /// /** */ void NewOutputTreeCtrl::OnContextMenuTest(wxContextMenuEvent& event) { wxLogMessage(_("Got context menu event")); } /// /** */ void NewOutputTreeCtrl::OnEditBegin(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); assert (item.IsOk()); OutputTreeItemData* data = dynamic_cast(GetItemData(item)); if (!data->IsEditable()) { event.Veto(); } } /// /** */ void OutputTreeItemData::FillContextMenu(wxMenu& menu) { menu.Append(MENU_RENAME, _("Rename")); menu.Append(MENU_OPTIONS, _("Default format options")); } /// /** */ void RootItem::OnRename() { mTreeCtrl.ChooseRootDir(); } /// /** */ void FileItem::FillContextMenu(wxMenu& menu) { OutputTreeItemData::FillContextMenu(menu); menu.Append(MENU_OVERRIDE, _("Override default options")); ImageFileName name = mTreeCtrl.mOutputter->GetImageFileName(GetSeriesUid(), mTreeCtrl.GetStringSelection().ToStdString()); if (!name.isRenameable) { wxMenuItem* item = menu.FindItem(MENU_RENAME); item->Enable(false); } } /// /** */ void FileItem::OnRename() { ImageFileName name = mTreeCtrl.mOutputter->GetImageFileName(GetSeriesUid(), mTreeCtrl.GetStringSelection().ToStdString()); if (!name.isRenameable) { return; } mTreeCtrl.RenameFiles(GetSeriesUid(), name.GetPrefix()); } /// /** */ void DirItem::OnRename() { mTreeCtrl.RenameDir(GetId()); } /// /** */ void NewOutputTreeCtrl::RenameFiles(std::string series_uid, std::string prefix) { wxTextEntryDialog* te_dlg = new wxTextEntryDialog(this, _("Please enter new name"), _("Rename output files"), prefix); //wxString(prefix.c_str(), wxConvLocal)); if (te_dlg->ShowModal() == wxID_OK) { mOutputter->ChangeFileName(series_uid, te_dlg->GetValue().ToStdString()); Reset(); RefreshList(); } te_dlg->Destroy(); } /// /** */ void NewOutputTreeCtrl::RenameDir(wxTreeItemId diritem) { wxTextEntryDialog* te_dlg = new wxTextEntryDialog(this, _T("Please enter new name"), _T("Rename directory"), GetItemText(diritem)); if (te_dlg->ShowModal() == wxID_OK) { int position = 0; wxTreeItemId parent = GetItemParent(diritem); while ((parent != GetRootItem()) && (position < 20)) { parent = GetItemParent(parent); ++position; } // get all series_uids affected by change -- // only necessary for top-level directories std::vector uids; if (position == 0) { wxTreeItemIdValue cookie; wxTreeItemId item = GetFirstChild(diritem, cookie); while (item.IsOk()) { OutputTreeItemData* data = dynamic_cast(GetItemData(item)); uids.push_back(data->GetUid()); item = GetNextChild(diritem, cookie); } } else { OutputTreeItemData* data = dynamic_cast(GetItemData(diritem)); uids.push_back(data->GetUid()); } mOutputter->ChangeDirName(uids, te_dlg->GetValue().ToStdString(), position); Reset(); RefreshList(); } } /// /** */ void NewOutputTreeCtrl::ChooseRootDir() { wxDirDialog *dlg = new wxDirDialog(this, _("Select a directory for converted files"), GetItemText(GetRootItem()), wxDD_DEFAULT_STYLE); if (dlg->ShowModal() == wxID_OK) { SetRoot(dlg->GetPath()); } dlg->Destroy(); } /// /** */ void NewOutputTreeCtrl::SetRoot(const wxString& text) { SetItemText(GetRootItem(), text); mOutputter->mOutputList.rootDir = text; } /// /** */ // todo -- partial update by series? // this does conversion using wxString::From8BitData, perhaps the OutputList // should hold this in proper UTF8 form rather than Unicode? void NewOutputTreeCtrl::RefreshList() { OutputList::ListType::iterator it = mOutputter->mOutputList.fileNameList.begin(); OutputList::ListType::iterator it_end = mOutputter->mOutputList.fileNameList.end(); for (;it != it_end; ++it) { int nDirs = it->second.GetDirCount(); wxTreeItemId parent = GetRootItem(); for (int i = 0; i < nDirs; ++i) { std::string dirUid = it->second.GetDirUid(i); wxTreeItemIdValue cookie; wxTreeItemId item = GetFirstChild(parent, cookie); while (item.IsOk()) { OutputTreeItemData* data = dynamic_cast(GetItemData(item)); if (data->GetUid() == dirUid) { it->second.SetDirName(i, std::string(GetItemText(item).mb_str(wxConvLocal))); break; } item = GetNextChild(parent, cookie); } if (!item.IsOk()) { DirItem* new_item = new DirItem(dirUid, *this); AppendItem(parent, wxString(it->second.GetDirName(i)), folder_icon, -1, new_item); item = new_item->GetId(); } parent = item; } // Only add if file isn't already there wxTreeItemIdValue cookie; wxTreeItemId item = GetFirstChild(parent, cookie); std::string file_uid = it->first + it->second.GetExt(); while (item.IsOk()) { OutputTreeItemData* data = dynamic_cast(GetItemData(item)); if (data->GetUid() == file_uid) { break; } item = GetNextChild(parent, cookie); } if (!item.IsOk()) { FileItem* new_file_item = new FileItem(file_uid, *this); new_file_item->SetSeriesUid(it->second.seriesUid); AppendItem(parent, wxString(it->second.GetFullName()), file_icon, -1, new_file_item); } } if (!mOutputter->mOutputList.fileNameList.empty()) { Expand(GetRootItem()); } } /// Removes a specific series /** Used to remove a series from the list of series to be processed. \param seriesUid String representation of the series. */ void NewOutputTreeCtrl::RemoveSeries(const std::string& seriesUid) { std::vector items_to_delete; wxTreeItemId root = GetRootItem(); CheckChildren(root, items_to_delete, seriesUid); while (!items_to_delete.empty()) { std::vector::iterator it = items_to_delete.begin(); std::vector::iterator it_end = items_to_delete.end(); for (; it != it_end; ++it) { Delete(*it); } items_to_delete.clear(); CheckChildren(root, items_to_delete, seriesUid); } } /// /** */ void NewOutputTreeCtrl::CheckChildren(wxTreeItemId& parent, std::vector& items, const std::string& seriesUid) { wxTreeItemIdValue cookie; wxTreeItemId item = GetFirstChild(parent, cookie); while (item.IsOk()) { if (!ItemHasChildren(item)) { FileItem* data = dynamic_cast(GetItemData(item)); if (data == 0) { // a childless directory items.push_back(item); } else if (data->GetSeriesUid() == seriesUid) { items.push_back(item); } } else { CheckChildren(item, items, seriesUid); } item = GetNextChild(parent, cookie); } } mriconvert/AnalyzeOptionsDlg.cpp0000640000175000000620000000241012542632333016362 0ustar stevestaff/// AnalyzeOptionsDlg.cpp /** */ #include #include #include #include #include #include #include "AnalyzeOptionsDlg.h" #include "AnalyzeOutputter.h" using namespace jcs; BEGIN_EVENT_TABLE(AnalyzeOptionsDlg, BasicOptionsDlg) EVT_BUTTON(wxID_OK, AnalyzeOptionsDlg::OnOkay) END_EVENT_TABLE() AnalyzeOptionsDlg::AnalyzeOptionsDlg(AnalyzeOutputter* outputter) : BasicOptionsDlg(_("Analyze 7.5 options"), outputter), mOutputter(outputter) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dlgSizer->Add(myPanel, 0, wxEXPAND); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxButton* okayButton = new wxButton(this, wxID_OK, _("Okay")); buttonSizer->Add(okayButton, 0, wxRIGHT, 10); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); okayButton->SetDefault(); dlgSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); mNeedsRebuild = false; } void AnalyzeOptionsDlg::OnOkay(wxCommandEvent& event) { bool nfSave = SaveNameFields(); bool rbld = Rebuild(); mNeedsRebuild = nfSave || rbld; BasicOptionsDlg::OnOkay(event); EndModal(event.GetId()); } mriconvert/MessageList.cpp0000640000175000000620000000644112542632322015202 0ustar stevestaff/// MessageList.cpp /** */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include #include "MessageList.h" using namespace jcs; BEGIN_EVENT_TABLE(MessageListDlg, wxDialog) EVT_BUTTON(wxID_SAVE, MessageListDlg::OnSave) END_EVENT_TABLE() /// /** */ MessageListDlg::MessageListDlg(const wxString& title) : wxDialog(NULL, -1, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); mpListView = new wxListView(this, -1, wxDefaultPosition, wxSize(600, 400), wxLC_REPORT); dlgSizer->Add(mpListView, 1, wxEXPAND|wxALL, 20); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); // buttonSizer->Add(new wxButton(this, wxID_SAVE, _T("Save")), 0, wxRIGHT, 20); buttonSizer->Add(new wxButton(this, wxID_OK, _T("Okay")), 0); dlgSizer->Add(buttonSizer, 0, wxRIGHT | wxBOTTOM | wxALIGN_RIGHT, 20); SetSizer(dlgSizer); dlgSizer->Fit(this); } /// /** */ void MessageListDlg::SetColumns(const Message& columns) { for (unsigned int i = 0; i < columns.size(); ++i) mpListView->InsertColumn(i, columns[i].c_str()); } /// /** */ void MessageListDlg::AddMessages(const MessageList& messages) { MessageList::const_iterator list_it = messages.begin(); MessageList::const_iterator list_end = messages.end(); while (list_it != list_end) { int row = mpListView->GetItemCount(); int column = 0; Message::const_iterator it = list_it->begin(); Message::const_iterator it_end = list_it->end(); if (mpListView->GetColumnCount() <= column) { mpListView->InsertColumn(column, _T("")); } mpListView->InsertItem(row, it->c_str()); ++column; ++it; while (it != it_end) { if (mpListView->GetColumnCount() <= column) { mpListView->InsertColumn(column, _T("")); } mpListView->SetItem(row, column, it->c_str()); ++column; ++it; } ++list_it; } for (int i = 0; i < mpListView->GetColumnCount(); ++i) { mpListView->SetColumnWidth(i, wxLIST_AUTOSIZE); if (mpListView->GetColumnWidth(i) > 450) { mpListView->SetColumnWidth(i, 450); } } } /// /** */ void MessageListDlg::OnSave (wxCommandEvent& event) { wxFileDialog* dlg = new wxFileDialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.txt"), wxFD_SAVE); if (dlg->ShowModal() == wxID_OK) { wxString path = dlg->GetPath(); std::ofstream output(path.mb_str(wxConvLocal)); for (int i = 0; i < mpListView->GetItemCount(); ++i) { for (int j = 0; j < mpListView->GetColumnCount(); ++j) { output << mGetItemText(i, j).mb_str(wxConvLocal); output << '\t'; } output << std::endl; } output.close(); } dlg->Destroy(); } /// /** */ wxString MessageListDlg::mGetItemText(long index, int column) const { wxListItem item; item.SetId(index); item.SetColumn(column); item.SetMask(wxLIST_MASK_TEXT); mpListView->GetItem(item); return item.GetText(); } mriconvert/InfoFrame.h0000640000175000000620000000054112542632317014274 0ustar stevestaff#ifndef INFO_FRAME_H #define INFO_FRAME_H #include #include #include #include class wxTextCtrl; class InfoFrame : public wxFrame { public: InfoFrame(wxWindow* parent, std::vector info); private: int AddString(std::string& s); wxTextCtrl* mTextCtrl; }; #endif mriconvert/NiftiOutputterBase.cpp0000640000175000000620000000213512542632315016560 0ustar stevestaff/// NiftiOutputterBase.cpp /** */ #include "NiftiOutputterBase.h" #include "NiftiVolume.h" using namespace jcs; NiftiOutputterBase::NiftiOutputterBase(const Options& options) : Basic3DOutputter(options) { saveNii = (rawExtension == _T("")) ? true : false; } /// /* */ BasicVolumeFormat* NiftiOutputterBase::GetOutputVolume(const char* file) { return new NiftiVolume(file, headerExtension.mb_str(wxConvLocal), rawExtension.mb_str(wxConvLocal)); } /// /** */ void NiftiOutputterBase::SetSaveNii(bool value) { saveNii = value; if (saveNii) { headerExtension = _T("nii"); rawExtension = _T(""); } else { headerExtension = _T("hdr"); rawExtension = _T("img"); } } /// Sets a boolean option. /** Calls parent SetOption and sets "nii" option. \param name The name of the option. \param value The new value of the option. */ void NiftiOutputterBase::SetOption(const std::string& name, bool value) { Basic3DOutputter::SetOption(name, value); if (name.find("nii") != std::string::npos) { SetSaveNii(value); } } mriconvert/BasicVolumeFormat.h0000640000175000000620000000247512542632311016012 0ustar stevestaff/// BasicVolumeFormat.h /** Handles the task of writing information to header and data files. */ #ifndef BASIC_VOLUME_FORMAT_H_ #define BASIC_VOLUME_FORMAT_H_ #include #include #include #include #include #include "Volume.h" namespace jcs { struct Basic3DHeader { virtual ~Basic3DHeader() {} virtual void SetNumberOfSlices(int slices) = 0; virtual void SetSliceSpacing(double spacing) = 0; virtual int GetNumberOfSlices() = 0; }; class BasicVolumeFormat { public : BasicVolumeFormat(const char* filename, const char* header_extension, const char* raw_extension = ""); virtual ~BasicVolumeFormat(); virtual void WriteHeader(Basic3DHeader* header) = 0; int AppendRawData(char* data, size_t n_bytes); protected: wxString mHeaderExtension; wxString mRawExtension; wxFileName mFileName; std::fstream mHeaderFile; std::fstream mRawDataFile; int mOpenHeaderFile(std::ios::openmode mode); void mCloseHeaderFile() { mHeaderFile.close(); } int mReadHeaderFile(); int mWriteHeaderFile(); int mOpenRawDataFile(std::ios::openmode mode); void mCloseRawDataFile() { mRawDataFile.close(); } }; } #endif mriconvert/BasicOptionsDlg.h0000640000175000000620000000323512542632317015455 0ustar stevestaff/// BasicOptionsDlg.h /** */ #ifndef BASIC_OPTIONS_DLG_H_ #define BASIC_OPTIONS_DLG_H_ #include #include #include #include namespace jcs { class OutputterBase; class Basic3DOutputter; /// Base class for most options dialogs. class BasicOptionsDlg : public wxDialog { public: BasicOptionsDlg(const wxString& title, Basic3DOutputter* outputter); bool SplitDirs() const; bool SplitSubj() const; bool Rescale() const; bool Rebuild() const; int Dimensionality() const; int Skip() const; void OnOkay(wxCommandEvent& event); void OnClose(wxCloseEvent& event); std::vector NameFields() const; protected: DECLARE_EVENT_TABLE() void CmdEvtHandler(wxCommandEvent &evt); void OnRightClick(wxMouseEvent &event); class BasicPanel : public wxPanel { public: BasicPanel(wxWindow* parent); /// If true, will create a sub-directory for each series & subject wxCheckBox* mpSplitDirsCheck; // If true, will create a sub-drectory for each subject wxCheckBox* mpSplitSubjCheck; /// If true, dimensionality is 4, else 3. wxCheckBox* mpDimCheck; /// Number of volumes to skip for multi-volume series. wxSpinCtrl* mpSkipSpin; /// DICOM field names to use in output file names. wxCheckListBox* mpNameFields; /// If true, apply rescale slope and intercept processing. wxCheckBox* mpRescaleCheck; }; bool SaveNameFields(); BasicPanel* myPanel; private: Basic3DOutputter* mOutputter; }; } #endif mriconvert/GeDtiRbHandler.h0000640000175000000620000000070012542632317015201 0ustar stevestaff/// /** */ #ifndef GE_DTI_RB_HANDLER_H #define GE_DTI_RB_HANDLER_H #include "SeriesHandler.h" namespace jcs { /// /** */ class GeDtiRbHandler : public SeriesHandler { public: GeDtiRbHandler(const std::string& seriesUid); virtual GradientInfo GetGradientInfo(); virtual bool IsDti() const { return true; } protected: virtual VolListType ReadVolIds(DicomFile& file); }; } #endif mriconvert/Basic3DConversion.txx0000640000175000000620000002142612542632332016302 0ustar stevestaff/// Basic3DConversion.txx /** */ #ifndef BASIC_3D_CONVERSION_TXX_ #define BASIC_3D_CONVERSION_TXX_ #include #include #include #include "Volume.h" #include "OutputterBase.h" #include "BasicVolumeFormat.h" namespace jcs { /// /** */ template Basic3DConversion::Basic3DConversion(Basic3DOutputter* outputter, SeriesHandler* handler) : mOutputter(outputter), mHandler(handler) { } /// /** Gets the value of mOutputter's skip setting for the series associated with mHandler. \return Number of volumes to skip. If the skip setting exceeds the number of volumes, returns 0. */ template int Basic3DConversion::GetSkip() { int retval = 0; std::string series_uid = mHandler->GetSeriesUid(); int nVolumes = mHandler->GetNumberOfVolumes(); int skip = mOutputter->GetSkip(series_uid); if (nVolumes > skip) { retval = skip; } return retval; } /// /** Gets the number of volumes to be converted, that is the number of volumes associated with mHandler less the skip setting. \return Number of volumes to be converted. */ template int Basic3DConversion::GetNumberOfVolumes() { int nVolumes = mHandler->GetNumberOfVolumes(); return nVolumes - GetSkip(); } /// The main reason for being. /** This is the heart of MRIConvert. */ template void Basic3DConversion::Convert() { vMapType volumes; mHandler->rescale = mOutputter->rescale; mHandler->GetVolumes(volumes); GetHeaderForSeries(); std::string series_uid = mHandler->GetSeriesUid(); int dimensionality = mOutputter->GetDimensionality(series_uid); if (dimensionality == 4) { wxFileName file = mOutputter->GetFileName(series_uid); if (file.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } file.SetExt(_T("")); BasicVolumeFormat* outputVolume = mOutputter->GetOutputVolume(file.GetFullPath()); typename vMapType::iterator it = volumes.begin(); typename vMapType::iterator it_end = volumes.end(); CompleteHeaderForVolume(*it); outputVolume->WriteHeader(GetHeader()); for (int n = 0; n < GetSkip(); ++n, ++it); for (;it != it_end; ++it) { ProcessSlicesAndAppend(outputVolume, it); wxTheApp->Yield(); } delete outputVolume; } else { // dimensionality presumably == 3 typename vMapType::iterator it = volumes.begin(); typename vMapType::iterator it_end = volumes.end(); for (int n = 0; n < GetSkip(); ++n, ++it); for (;it != it_end; ++it) { CompleteHeaderForVolume(*it); wxFileName file = mOutputter->GetFileNameFromVolId(it->first); if (file.GetName() == _T("error")) { wxLogError(_T("File name error")); break; } file.SetExt(_T("")); BasicVolumeFormat* outputVolume = mOutputter->GetOutputVolume(file.GetFullPath()); outputVolume->WriteHeader(GetHeader()); ProcessSlicesAndAppend(outputVolume, it); delete outputVolume; wxTheApp->Yield(); } } // Write additional informational text files. if (this->mHandler->IsMoCo()) { WriteMoCoFiles(); } WriteStringInfo(); } /// /** \param outputVolume Pointer to BasicVolumeFormat instance. \param it Iterator through vMapType structure. */ template void Basic3DConversion::ProcessSlicesAndAppend(BasicVolumeFormat* outputVolume, typename vMapType::iterator it) { typedef std::map > SliceMap; typename SliceMap::iterator slice_it = it->second.begin(); typename SliceMap::iterator slice_end = it->second.end(); for (; slice_it != slice_end; ++slice_it) { ProcessSlice(slice_it->second); if (this->mHandler->rescale) { std::vector float_slice(slice_it->second.begin(), slice_it->second.end()); outputVolume->AppendRawData(reinterpret_cast (&float_slice.front()), float_slice.size() * sizeof(float_slice.front())); } else { outputVolume->AppendRawData(reinterpret_cast (&slice_it->second.front()), slice_it->second.size() * sizeof(slice_it->second.front())); } } } /// /** Writes MoCo text files. */ template void Basic3DConversion::WriteMoCoFiles() { std::vector moco; this->mHandler->GetImageComments(moco); if (moco.size() != 0) { std::string key = this->mHandler->GetSeriesUid() + this->mOutputter->moco_postfix; wxFileName fileName = this->mOutputter->mOutputList.GetFullFileName(key); IterativeWrite(fileName, moco); } } /// /** Writes DICOM information file for a series. */ template void Basic3DConversion::WriteStringInfo() { std::string key = this->mHandler->GetSeriesUid() + "_info"; wxFileName fileName = this->mOutputter->mOutputList.GetFullFileName(key); std::vector writeThis = this->mHandler->GetStringInfo(); IterativeWrite(fileName, writeThis); } /// /** Writes gradient information files (bvecs, bvals) for a series. */ template void Basic3DConversion::WriteGradientFiles() { GradientInfo info = this->mHandler->GetGradientInfo(); Normalize(info); if (info.values.size() == 0) { return; } // First write the bvals file. std::string key = this->mHandler->GetSeriesUid() + this->mOutputter->bvals_postfix; wxFileName fileName = this->mOutputter->mOutputList.GetFullFileName(key); std::vector writeThis; if (fileName.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } std::vector::iterator it = info.values.begin(); std::vector::iterator it_end = info.values.end(); std::stringstream ss; for (; it != it_end; ++it) { ss << *it << " "; } writeThis.push_back(ss.str()); ss.clear(); ss.str(std::string()); IterativeWrite(fileName, writeThis); writeThis.clear(); // Now write bvecs file. key = this->mHandler->GetSeriesUid() + this->mOutputter->bvecs_postfix; fileName = this->mOutputter->mOutputList.GetFullFileName(key); if (fileName.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } std::vector::iterator x_it = info.xGrads.begin(); std::vector::iterator x_it_end = info.xGrads.end(); for (; x_it != x_it_end; ++x_it) { ss << *x_it << " "; } writeThis.push_back(ss.str()); ss.clear(); ss.str(std::string()); std::vector::iterator y_it = info.yGrads.begin(); std::vector::iterator y_it_end = info.yGrads.end(); for (; y_it != y_it_end; ++y_it) { if (*y_it == 0) { ss << (*y_it) << " "; } else { ss << -(*y_it) << " "; } } writeThis.push_back(ss.str()); ss.clear(); ss.str(std::string()); std::vector::iterator z_it = info.zGrads.begin(); std::vector::iterator z_it_end = info.zGrads.end(); for (; z_it != z_it_end; ++z_it) { ss << *z_it << " "; } writeThis.push_back(ss.str()); ss.clear(); ss.str(std::string()); IterativeWrite(fileName, writeThis); } /// /** Writes each string in the given vector to a file given by fileName. Terminates each string with std::endl, thus, this is intended for text file creation. \param fileName Name of file to write. \param src Vector of strings to write. */ template void Basic3DConversion::IterativeWrite(wxFileName fileName, std::vector src) { if (fileName.GetName() != _T("error")) { wxFileName::Mkdir(fileName.GetPath(wxPATH_GET_VOLUME), 0777, wxPATH_MKDIR_FULL); // Test possible overwrite condition. if (fileName.FileExists()) { std::string errorMsg = "Warning: File exists, will overwrite "; errorMsg += fileName.GetFullPath(); wxLogError(wxFormatString(errorMsg)); std::cout << errorMsg << std::endl; } std::ofstream output; output.open((const char *) fileName.GetFullPath()); std::vector::iterator it = src.begin(); std::vector::iterator it_end = src.end(); for (; it < it_end; ++it) { output << *it << std::endl; } output.close(); } else { wxLogError(_T("File name error")); } } } // end namespace jcs #endif mriconvert/NiftiOutputterBase.h0000640000175000000620000000133312542632333016224 0ustar stevestaff/// NiftiOutputterBase.h /** */ #ifndef NIFTI_OUTPUTTER_BASE_H_ #define NIFTI_OUTPUTTER_BASE_H_ #include #include #include #include #include "Basic3DOutputter.h" #include "BasicVolumeFormat.h" namespace jcs { /// Provides the basis for both flavors of NIfTi. // could be recombined with NiftiOutputter if FSLNifti goes away. class NiftiOutputterBase : public Basic3DOutputter { public: NiftiOutputterBase(const Options& options); bool saveNii; void SetSaveNii(bool value); virtual void SetOption(const std::string& name, bool value); protected: virtual BasicVolumeFormat* GetOutputVolume(const char* file); }; } #endif mriconvert/NumarisMosaicHandler.cpp0000640000175000000620000001502312542632332017027 0ustar stevestaff/// NumarisMosaicHandler.cpp /** */ #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "NumarisMosaicHandler.h" using namespace jcs; /// /** */ std::vector NumarisMosaicHandler::GetStringInfo() { std::vector info = SeriesHandler::GetStringInfo(); info.push_back(std::string("Mosaic rows: ") + itos(GetRows())); info.push_back(std::string("Mosaic columns: ") + itos(GetColumns())); std::string a_order; switch (GetAcquisitionOrder()) { case ASCENDING : a_order = "Ascending"; break; case DESCENDING : a_order = "Descending"; break; case INTERLEAVED_ODD : a_order = "Interleaved"; break; case OTHER : a_order = "Other"; break; case UNKNOWN : default: a_order = "Unknown"; break; } info.push_back(std::string("Acquisition order: ") + a_order); return info; } /// /** */ NumarisMosaicHandler::NumarisMosaicHandler(const std::string& seriesUid) : SeriesHandler(seriesUid) { } /// /** */ SeriesHandler::VolListType NumarisMosaicHandler::ReadVolIds(DicomFile& file) { VolListType v = SeriesHandler::ReadVolIds(file); std::string str; file.Find("InstanceNumber", str); v.front().ids.push_back(str); return v; } /// /** */ AoCode NumarisMosaicHandler::GetAcquisitionOrder() const { Dictionary* Numaris = Numaris_Dictionary::Instance(); std::string acquisition_order; Find(Numaris->Lookup("ORDER_OF_SLICES"), acquisition_order); if (acquisition_order == "ASCENDING") { return ASCENDING; } if (acquisition_order == "DECREASING") { return DESCENDING; } if (acquisition_order == "INTERLEAVED") { return INTERLEAVED_ODD; } return OTHER; } /// /** Returns the time interval between volumes, in this case, RepititionTime. \return The ReptitionTime */ double NumarisMosaicHandler::GetVolumeInterval() const { double tr; Find("RepetitionTime", tr); double retval = tr/1000.0; return retval; } /// /** */ std::vector NumarisMosaicHandler::GetSliceOrder() { Dictionary* Numaris = Numaris_Dictionary::Instance(); int n_slices = GetNumberOfSlices(); std::vector slice_order; slice_order.reserve(n_slices); double delta_z = GetVoxelSize().back(); AoCode acquisition_order = GetAcquisitionOrder(); switch (acquisition_order) { case INTERLEAVED_ODD: for (int i = n_slices; i > 0; i-=2) slice_order.push_back(delta_z * i); for (int i = (n_slices - 1); i > 0; i-=2) slice_order.push_back(delta_z * i); break; case DESCENDING: for (int i = 1; i <= n_slices; ++i) slice_order.push_back(i * delta_z); break; default: for (int i = n_slices; i > 0; --i) slice_order.push_back(i * delta_z); } return slice_order; } /// /** */ int NumarisMosaicHandler::GetRows() { Dictionary* Numaris = Numaris_Dictionary::Instance(); int mosaic_size = 0; Find(Numaris->Lookup("BASE_RAW_MATRIX_SIZE"), mosaic_size); return mosaic_size; } /// /** */ int NumarisMosaicHandler::GetColumns() { return GetRows(); } /// /** */ std::vector NumarisMosaicHandler::GetVoxelSize() { std::vector voxel_size(3, 0); std::string s; if (Find("PixelSpacing", s)) { voxel_size[0] = stof(s, 0); voxel_size[1] = stof(s, 1); } // Pixel spacing is reported incorrectly // for mosaic files -- must correct int mosaic_size = GetRows(); double image_size; //Find(DT_IMAGECOLUMNS, image_size); Find("Columns", image_size); voxel_size[0] *= image_size/mosaic_size; //Find(DT_IMAGEROWS, image_size); Find("Rows", image_size); voxel_size[1] *= image_size/mosaic_size; Find("SliceThickness", voxel_size[2]); double slice_spacing = 0; //Find("SliceSpacing", slice_spacing); Find("SpacingBetweenSlices", slice_spacing); voxel_size[2] += slice_spacing; return voxel_size; } /// /** */ int NumarisMosaicHandler::GetNumberOfSlices() const { Dictionary* Numaris = Numaris_Dictionary::Instance(); int slices = 0; Find(Numaris->Lookup("NUMBER_OF_SLICES_CURRENT"), slices); return slices; } /// /** */ template void NumarisMosaicHandler::mGetVolumes(std::map >& v) { v.clear(); std::string uid = GetSeriesUid(); wxString message = _("Reading series ") + wxString(uid.c_str(), wxConvLocal); if (verbose) { wxLogStatus(message); } int image_columns, image_rows; //Find(DT_IMAGECOLUMNS, image_columns); Find("Columns", image_columns); //Find(DT_IMAGEROWS, image_rows); Find("Rows", image_rows); FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator end = mFileMap.end(); int n_slices = GetNumberOfSlices(); int mosaic_rows = GetRows(); int mosaic_columns = GetColumns(); std::vector slice_order = GetSliceOrder(); for (;it != end; it++) { v[(*it).second.front()] = Volume(mosaic_rows, mosaic_columns); std::vector data; DicomFile d_file((*it).first.c_str()); double slope = 1; double intercept = 0; if (rescale) { GetRescaleSlopeAndIntercept(d_file, slope, intercept); } d_file.PixelData(data, image_rows * image_columns * sizeof(T), slope, intercept); int number_of_columns = image_columns/mosaic_columns; for(int tile = 0; tile < n_slices; ++tile) { int tile_column = tile % number_of_columns; int tile_row = tile / number_of_columns; typename std::vector::iterator tile_begin = data.begin() + tile_column * mosaic_columns + tile_row * mosaic_rows * image_columns; assert(tile_begin < data.end()); std::vector slice; slice.reserve(mosaic_rows * mosaic_columns); for (int row_no = 0; row_no < mosaic_rows; ++row_no) { typename std::vector::iterator row_begin = tile_begin + row_no * image_columns; typename std::vector::iterator row_end = row_begin + mosaic_columns; assert(row_end <= data.end()); slice.insert(slice.end(), row_begin, row_end); } v[(*it).second.front()].AddSlice(slice_order[tile], slice, (*it).first); } assert(v[(*it).second.front()].size() == n_slices); } } mriconvert/DicomTag.h0000640000175000000620000000253712542632336014125 0ustar stevestaff/// DicomTag.h /** Structure represents a DICOM tag as a group and element tuple. Can initialize by ctor or from an input stream. Suggested Unit Tests - initialize by ctor, test boolean operators - initialize by input stream, test boolean operators - initialize by ctor, re-initialize by input stream, test boolean operators - test assignment of group and element, should fail, these should be set only via ctor or input stream; should not even compile */ #ifndef DICOMTAG_H_ #define DICOMTAG_H_ #include #include #include #include #include #include enum { LEI_CODE, LEE_CODE, BEE_CODE }; namespace jcs { struct DicomTag { public: DicomTag() {} DicomTag(wxUint16 g, wxUint16 e) : group(g), element(e) {} wxUint16 group; wxUint16 element; wxUint8 transferSyntaxCode; private: public: bool operator== (const DicomTag &rhs) const; bool operator!= (const DicomTag &rhs) const; bool operator< (const DicomTag &rhs) const; bool operator> (const DicomTag &rhs) const; friend std::istream &operator>>(std::istream &in, DicomTag &dt); }; std::istream &operator>>(std::istream &in, DicomTag &dt); std::ostream &operator<<(std::ostream &out, const DicomTag &rhs); } #endif mriconvert/NiftiOutputter.cpp0000640000175000000620000000340012542632333015761 0ustar stevestaff/// NiftiOutputter.cpp /** */ #include "NiftiOutputter.h" using namespace jcs; /// /* */ NiftiOutputter::NiftiOutputter() : NiftiOutputterBase(CreateOptions()) { } /// /* */ NiftiOutputter::~NiftiOutputter() { } /// /* */ Options NiftiOutputter::CreateOptions() { Options options = Get3DOptions(); options.pathname = "Nifti"; return options; } /// /* Checks data type (BitsAllocated and PixelRepresentation) and creates a *Conversion instance. Runs the Convert method of that instance. \param handler The SeriesHandler instance for the data. \return 1 */ int NiftiOutputter::ConvertSeries(SeriesHandler* handler) { int bits_allocated, pixel_rep = 0; handler->Find("BitsAllocated", bits_allocated); handler->Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 8 : { NiftiConversion conversion(this, handler); conversion.Convert(); break; } case 9 : { NiftiConversion conversion(this, handler); conversion.Convert(); break; } case 16 : { NiftiConversion conversion(this, handler); conversion.Convert(); break; } case 17 : { NiftiConversion conversion(this, handler); conversion.Convert(); break; } case 32 : { NiftiConversion conversion(this, handler); conversion.Convert(); break; } case 33 : { NiftiConversion conversion(this, handler); conversion.Convert(); break; } default : { wxLogMessage(_("BitsAllocated and PixelRepresentation values (%d, %d) not supported."), bits_allocated, pixel_rep); } } return 1; } mriconvert/Volume.h0000640000175000000620000000420212542632322013667 0ustar stevestaff/// Volume.h /** */ #ifndef VOLUME_H_ #define VOLUME_H_ #include #include #include #include #include #include #include namespace jcs { // Represents an image volume as a map of slices // Map is sorted by distance along slice plane normal template class Volume { public: Volume() {} Volume(int rows, int columns): mRows(rows), mColumns(columns) {} ~Volume() {} float GetSpacing(); // == number of slices in volume typename std::map >::size_type size() const { return mSliceMap.size(); } typename std::map >::iterator begin() { return mSliceMap.begin(); } typename std::map >::iterator end() { return mSliceMap.end(); } typename std::map >::reverse_iterator rbegin() { return mSliceMap.rbegin(); } typename std::map >::reverse_iterator rend() { return mSliceMap.rend(); } void AddSlice(const float slice_no, const std::vector& slice, const std::string& name) { mSliceMap[slice_no] = slice; dicomFiles[slice_no] = name; } // Used only by NewBvOutputter.txx std::vector& GetSlice(int slice_number) { //std::cout << "GetSlice, slice_number: " << slice_number << std::endl; typename std::map >::iterator it = mSliceMap.begin(); for (int i = 0; i < slice_number; ++i, ++it); return it->second; } std::map dicomFiles; std::map > mSliceMap; private: int mRows; int mColumns; }; /// /** Calculates spacing between slices by taking difference in position of the first two slices. */ template float Volume::GetSpacing() { if (mSliceMap.size() < 2) { return 1; } typename std::map >::iterator it = mSliceMap.begin(); float pos1 = (*it).first; float pos2 = (*++it).first; return pos2 - pos1; } } // end namespace jcs #endif mriconvert/NewMetaVolume.cpp0000640000175000000620000000523012542632314015506 0ustar stevestaff/// NewMetaVolume.cpp /** */ #include #include #include #include #include "StringConvert.h" #include "NewMetaVolume.h" using namespace jcs; /// /** */ NewMetaVolume::NewMetaVolume(const char* filename, const char* he, const char* re) : BasicVolumeFormat(filename, he, re) { } /// /** Opens header file, writes contents, and closes. */ void NewMetaVolume::WriteHeader(Basic3DHeader* header_3d) { NewMetaHeader* header = dynamic_cast(header_3d); if (header == 0) { wxLogError(_T("Object not meta header type")); return; } if (!mOpenHeaderFile(std::ios::out)) { wxLogError(_T("Cannot create meta image header file %s"), mFileName.GetFullName().c_str()); return; } mHeaderFile << "ObjectType = Image" << std::endl; mHeaderFile << "NDims = " << header->nDims << std::endl; mHeaderFile << "DimSize ="; for (int i = 0; i < header->nDims; ++i) { mHeaderFile << " " << header->dimSize[i]; } mHeaderFile << std::endl; mHeaderFile << "ElementSpacing ="; for (int i = 0; i < header->nDims; ++i) { mHeaderFile << " " << header->elementSpacing[i]; } mHeaderFile << std::endl; mHeaderFile << "Position ="; for (int i = 0; i < header->nDims; ++i) { mHeaderFile << " " << header->origin[i]; } mHeaderFile << std::endl; mHeaderFile << "Orientation ="; for (unsigned int i = 0; i < header->orientation.size(); ++i) { mHeaderFile << " " << header->orientation.at(i); } mHeaderFile << std::endl; mHeaderFile << "CenterOfRotation = 0 0 0" << std::endl; mHeaderFile << "AnatomicalOrientation = LPS" << std::endl; mHeaderFile << "ElementByteOrderMSB = " << header->byteOrderMSB << std::endl; mHeaderFile << "ElementNumberOfChannels = " << header->numberOfChannels << std::endl; mHeaderFile << "ElementType = " << MET_ValueTypeName[header->elementType] << std::endl; mHeaderFile << "HeaderSize = " << header->headerSize << std::endl; std::vector::const_iterator it = header->extraFields.begin(); std::vector::const_iterator it_end = header->extraFields.end(); for (; it != it_end; it++) { mHeaderFile << *it << std::endl; } mHeaderFile << "ElementDataFile = " << header->elementFile.c_str() << std::endl; it = header->sourceFileVector.begin(); it_end = header->sourceFileVector.end(); for (; it != it_end; it++) { mHeaderFile << *it << std::endl; } mCloseHeaderFile(); if (verbose && !quiet) { std::cout << "Wrote " << mFileName.GetFullPath() << std::endl; //.mb_str(wxConvLocal) << std::endl; } } mriconvert/NoOptionsDlg.cpp0000640000175000000620000000152212542632317015340 0ustar stevestaff/// NoOptionsDlg.cpp /** */ #include #include #include #include "NoOptionsDlg.h" using namespace jcs; BEGIN_EVENT_TABLE(NoOptionsDlg, wxDialog) EVT_BUTTON(wxID_OK, NoOptionsDlg::OnOkay) END_EVENT_TABLE() /// /** We should never see this dialog, as all output formats have options. */ NoOptionsDlg::NoOptionsDlg() : wxDialog(NULL, -1, wxString(_("Output format options"))) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dlgSizer->Add(new wxStaticText(this, -1, _("No options exist for this format.")), 0, wxALL, 10); dlgSizer->Add(new wxButton(this, wxID_OK, _("Okay")), 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); } void NoOptionsDlg::OnOkay(wxCommandEvent& event) { EndModal(event.GetId()); } mriconvert/BvOptionsDlg.h0000640000175000000620000000164012542632312014774 0ustar stevestaff/// BvOptionsDlg.h /** */ #ifndef BV_OPTIONS_DLG_H_ #define BV_OPTIONS_DLG_H_ #include #include #include #include "OutputterBase.h" #include "NewBvOutputter.h" namespace jcs { class BvOptionsDlg : public wxDialog { public: BvOptionsDlg(NewBvOutputter* outputter); void OnOkay(wxCommandEvent& event); bool NeedsRebuild() const { return mNeedsRebuild; } bool SplitDirs() const; bool SplitSubj() const; bool SaveV16() const; int Skip() const; protected: DECLARE_EVENT_TABLE() private: wxSpinCtrl* mpBvSpin; wxCheckBox* mpBvCheck; wxCheckBox* mpSplitDirsCheck; wxCheckBox* mpSplitSubjCheck; wxCheckListBox* mpNameFields; bool mNeedsRebuild; bool mSplit; bool mSaveV16; int mSkip; NewBvOutputter* mOutputter; bool SaveNameFields(); }; } #endif mriconvert/NewBvOutputter.h0000640000175000000620000000172012542632332015400 0ustar stevestaff#ifndef NEW_BV_OUTPUTTER_H_ #define NEW_BV_OUTPUTTER_H_ #include #include #include #include "Volume.h" #include "BvFiles.h" #include "OutputterBase.h" namespace jcs { struct VolInfo; class NewBvOutputter : public OutputterBase { public : NewBvOutputter(); virtual ~NewBvOutputter(); virtual int ConvertSeries(SeriesHandler* handler); virtual void RemoveSeries(const std::string& seriesUid); virtual void UpdateOutputForSeries(SeriesHandler* handler); int mSkip; bool mSaveV16; virtual void SetOption(const std::string& name, int value); virtual void SetOption(const std::string& name, bool value); private : template void mConvertAnat(SeriesHandler* handler); void mConvertFmr(SeriesHandler* handler); template void mConvertStc(SeriesHandler* handler); static Options CreateOptions(); }; } #include "NewBvOutputter.txx" #endif mriconvert/NiftiOptionsDlg.cpp0000640000175000000620000000267112542632333016041 0ustar stevestaff/// NiftiOptionsDlg.cpp /** */ #include #include #include #include "NiftiOptionsDlg.h" #include "NiftiOutputter.h" using namespace jcs; BEGIN_EVENT_TABLE(NiftiOptionsDlg, BasicOptionsDlg) EVT_BUTTON(wxID_OK, NiftiOptionsDlg::OnOkay) END_EVENT_TABLE() NiftiOptionsDlg::NiftiOptionsDlg(NiftiOutputterBase* outputter) : BasicOptionsDlg(_("Nifti options"), outputter), mOutputter(outputter) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dlgSizer->Add(myPanel); mpNiiCheck = new wxCheckBox(this, -1, _("Save as .nii file")); mpNiiCheck->SetValue(mOutputter->saveNii); dlgSizer->Add(mpNiiCheck, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxButton* okayButton = new wxButton(this, wxID_OK, _("Okay")); buttonSizer->Add(okayButton, 0, wxRIGHT, 10); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); okayButton->SetDefault(); dlgSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); mNeedsRebuild = false; } void NiftiOptionsDlg::OnOkay(wxCommandEvent& event) { bool nfSave = SaveNameFields(); bool niiSave = (SaveNii() != mOutputter->saveNii); bool rbld = Rebuild(); mNeedsRebuild = nfSave || niiSave || rbld; BasicOptionsDlg::OnOkay(event); mOutputter->SetSaveNii(SaveNii()); EndModal(event.GetId()); } mriconvert/SeriesHandler.cpp0000640000175000000620000005247712542632322015524 0ustar stevestaff/// SeriesHandler.cpp /** Each handler knows how to interpret the series data A SeriesHandler instance represents one or more files associated with a single series. Handles input operations. */ #include "SeriesHandler.h" using namespace jcs; SeriesHandler::SeriesHandler(const std::string& seriesUid) : mSeriesUid(seriesUid) { seriesInfo.subject_name = ""; seriesInfo.subject_id = ""; seriesInfo.study_number = ""; seriesInfo.series_number = ""; seriesInfo.StudyDate = ""; seriesInfo.SeriesDate = ""; seriesInfo.study_description = ""; seriesInfo.series_description = ""; multiecho = false; } SeriesHandler::~SeriesHandler() { } /// /** \param s String reference, name of DICOM element to find. \return Value of DICOM element given in 's' as a string. */ std::string SeriesHandler::Find(const std::string& s) const { std::string retstring; //Find(s, retstring)); //return retstring; if (Find(s, retstring)) { return retstring; } else { return ""; } } /// /** \param s Reference to DicomElement to find. \return Value of DICOM element given in 's' as a string. */ std::string SeriesHandler::Find(DicomElement e) const { std::string retstring; //Find(e, retstring)); //return retstring; if (Find(e, retstring)) { return retstring; } else { return ""; } } /// /** */ std::vector SeriesHandler::GetIppForFirstSlice(const VolId& id) { return position[id]; } /// /** Retrieves voxel dimensions based on PixelSpacing, SpacingBetweenSlices //SliceSpacing and SliceThickness. \return A three-vector of double representing the voxel dimensions. */ std::vector SeriesHandler::GetVoxelSize() { std::vector voxel_size(3, 0); std::string s; if (Find("PixelSpacing", s)) { voxel_size[0] = stof(s, 0); voxel_size[1] = stof(s, 1); } //Find("SliceSpacing", voxel_size[2]); Find("SpacingBetweenSlices", voxel_size[2]); if (voxel_size[2] == 0) { Find("SliceThickness", voxel_size[2]); } return voxel_size; } /// /** */ int SeriesHandler::GetNumberOfSlices() const { int nVolumes = GetNumberOfVolumes(); int nFiles = GetNumberOfFiles(); if (nVolumes != 0) { return nFiles/nVolumes; } else { return nFiles; } } /// /** Gets all file names in mFileMap. \return A vector of filenames. */ std::vector SeriesHandler::GetFilenames() const { std::vector names; FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator it_end = mFileMap.end(); for (; it != it_end; ++it) { names.push_back(it->first); } return names; } /// /** */ bool SeriesHandler::IsBigEndian() const { if (mFileMap.empty()) { return false; } DicomFile dicomFile((*mFileMap.begin()).first.c_str()); return dicomFile.IsBigEndian(); } /// /** */ int SeriesHandler::GetNumberOfVolumes() const { std::set volSet = GetVolIds(); return volSet.size(); } /// /** */ std::string SeriesHandler::GetImagePositionPatient(DicomFile& dfile, int frame) { std::string ipp; if (!dfile.Find("ImagePositionPatient", ipp)) { ipp = "0\\0\\" + itos(frame); } return ipp; } /// /** */ int SeriesHandler::GetRescaleSlopeAndIntercept(const VolId& id, double& slope, double& intercept) const { std::string filename; if (!GetFirstFilename(id, filename)) { return 0; } DicomFile dicomFile(filename.c_str()); return GetRescaleSlopeAndIntercept(dicomFile, slope, intercept); } /// /** Seeks RescaleSlope and RescaleIntercept attributes. If not found, will set slope to 1 and intercept to 0. */ int SeriesHandler::GetRescaleSlopeAndIntercept(DicomFile& dfile, double& slope, double& intercept, int frame) const { if (!dfile.Find("RescaleSlope", slope)) { slope = 1; } if (!dfile.Find("RescaleIntercept", intercept)) { intercept = 0; } return 1; } /// /** Calculates time interval between volumes using AcquisitionTime. \return Difference in Acquisition Time between two adjacent volumes. */ double SeriesHandler::GetVolumeInterval() const { double retval = 0; FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator it_end = mFileMap.end(); std::map > vtmap; for (double time = 0; it != it_end; ++it) { DicomFile file(it->first.c_str()); file.Find("AcquisitionTime", time); vtmap[it->second.front()].push_back(time); time = 0; // Do we trust file.Find to overwrite time? } retval = CalculateVolIntVal(vtmap, 2); return retval; } /// /** Given a map structure containing double times, will determine an estimate for the volume interval. \param vtmap A map of VolId and vector of double associations. \param min_num_volumes This is the minimum number of volumes needed to return a reasonable estimate for Volume Interval. Indexes the list of interval times such that elements at min_num_volumes and min_num_volumes - 1 are used to determine the calculated value. \return An estimate for volume interval. */ double SeriesHandler::CalculateVolIntVal(std::map >& vtmap, unsigned int min_num_volumes) const { double retval = 0; if (vtmap.size() > min_num_volumes) { std::map >::iterator vit = vtmap.begin(); std::map >::iterator vit_end = vtmap.end(); std::vector vol_times; for (;vit != vit_end; ++vit) { vol_times.push_back(*min_element(vit->second.begin(), vit->second.end())); } sort(vol_times.begin(), vol_times.end()); retval = (vol_times[min_num_volumes] - vol_times[min_num_volumes - 1]); CheckIntervalSanity(vol_times, retval); } return retval; } /// /** Compares the given value to the average time between volume acquisition times and to RepititionTime. Provides an opinion on the validity of the given value to std::cout. \param vol_times A vector of acquisitition times. \param retval A value to compare against. */ void SeriesHandler::CheckIntervalSanity(std::vector& vol_times, double retval) const { double average = GetMeanVolumeInterval(vol_times); std::string str_tr; Find("RepetitionTime", str_tr); int tr; if (!(std::istringstream(str_tr) >> tr)) { tr = 0; } // Convert tr to seconds. tr /= 1000; if (!quiet) { double threshold = 0.05; if ((std::abs(average - retval) / average) > threshold) { std::cout << "For Series: " << GetSeriesUid() << std::endl; std::cout << "Volume interval differs from average interval by > " << threshold << "%" << std::endl; std::cout << "avg: " << average << " retval: " << retval << std::endl; } if ((std::abs(tr - retval) / tr) > threshold) { std::cout << "For Series: " << GetSeriesUid() << std::endl; std::cout << "Volume interval differs from RepetitionTime by > " << threshold << "%" << std::endl; std::cout << "TR: " << tr << " retval: " << retval << std::endl; } } } /// /** Calculate the average time between volumes. \param vol_times A vector of volume acquisition times, type double. \return The average difference between consecutive acquisition times. */ double SeriesHandler::GetMeanVolumeInterval(std::vector& vol_times) const { double average = 0; std::vector::iterator dit = vol_times.begin(); std::vector::iterator dit_end = vol_times.end(); std::vector vol_diffs; if (dit < dit_end) { for (++dit; dit < dit_end; ++dit) { vol_diffs.push_back(*dit - *(dit - 1)); } std::vector::iterator diff = vol_diffs.begin(); std::vector::iterator diff_end = vol_diffs.end(); double sum = 0; for (; diff < diff_end; ++diff) { sum += *diff; } average = sum / vol_diffs.size(); } return average; } /// /** */ double SeriesHandler::GetSliceDuration() const { return 0; } /// /** \return Number of columns in this series. */ int SeriesHandler::GetColumns() { int columns; // Find(DT_IMAGECOLUMNS, columns); Find(DT_IMAGECOLUMNS, columns); //Find(DT_IMAGECOLUMNS, columns); Find("Columns", columns); return columns; } /// /** \return Number of rows in this series. */ int SeriesHandler::GetRows() { int rows; // Find(DT_IMAGEROWS, rows); Find (DT_IMAGEROWS, rows); //Find(DT_IMAGEROWS, rows); Find("Rows", rows); return rows; } /// /** \return Number of frames in this series. */ int SeriesHandler::GetFrames() const { int frames = 0; Find("NumberOfFrames", frames); return frames; } /// /** Adds a file name to mFileMap. Can we make this return true or false? \param filename Name of file to add. \return 0 if filename already in mFileMap, 1 otherwise. */ int SeriesHandler::AddFile(const char* filename) { if (mFileMap.count(filename)) { return 0; } DicomFile dicom_file(filename); std::string series_uid; //dicom_file.Find("SeriesInstanceUid", series_uid); dicom_file.Find("SeriesInstanceUID", series_uid); // Fix problems with termination std::string temp(series_uid.c_str()); series_uid.clear(); series_uid = temp; assert(mSeriesUid == series_uid); std::string uid; //dicom_file.Find("SopInstance", uid); dicom_file.Find("SOPInstanceUID", uid); if (mInstanceUids.count(uid) == 0 ) { mInstanceUids.insert(uid); VolListType info = ReadVolIds(dicom_file); mFileMap[filename] = info; } if (seriesInfo.SeriesDate == "") { //Find("PatientId", seriesInfo.subject_id); Find("PatientID", seriesInfo.subject_id); Find("PatientName", seriesInfo.subject_name); //Find("StudyId", seriesInfo.study_number); Find("StudyID", seriesInfo.study_number); Find("StudyDescription", seriesInfo.study_description); int series_number; Find("SeriesNumber", series_number); seriesInfo.series_number = itos(series_number, 3); Find("StudyDate", seriesInfo.StudyDate); Find("SeriesDate", seriesInfo.SeriesDate); Find("SeriesDescription", seriesInfo.series_description); } return 1; } /// /** Retrieves a bunch of information about a series. \return A vector of strings with series information. */ std::vector SeriesHandler::GetStringInfo() { std::vector v; v.push_back(std::string("Series UID: ") + GetSeriesUid()); v.push_back(std::string("Study date: ") + Find("StudyDate")); v.push_back(std::string("Study time: ") + Find("StudyTime")); v.push_back(std::string("Series date: ") + Find("SeriesDate")); v.push_back(std::string("Series time: ") + Find("SeriesTime")); v.push_back(std::string("Subject: ") + Find("PatientName")); v.push_back(std::string("Subject birth date: ") + Find("PatientBirthDate")); v.push_back(std::string("Series description: ") + Find("SeriesDescription")); std::string manufacturer = Find("Manufacturer"); v.push_back(std::string("Manufacturer: ") + manufacturer); v.push_back(std::string("Model name: ") + Find("ManufacturerModelName")); v.push_back(std::string("Software version: ") + Find("SoftwareVersions")); v.push_back(std::string("Study id: ") + Find("StudyID")); v.push_back(std::string("Series number: ") + Find("SeriesNumber")); v.push_back(std::string("Repetition time (ms): ") + Find("RepetitionTime")); GetEchoTimes(); std::map::iterator echo_it = echo_times.begin(); while (echo_it != echo_times.end()) { v.push_back(std::string("Echo time[" + itos(echo_it->first) + "] (ms): ") + echo_it->second); ++echo_it; } std::string found_string; found_string = Find("InversionTime"); if (found_string.size() > 0 ) v.push_back(std::string("Inversion time (ms): ") + found_string); v.push_back(std::string("Flip angle: ") + Find("FlipAngle")); v.push_back(std::string("Number of averages: ") + Find("NumberOfAverages")); v.push_back(std::string("Slice thickness (mm): ") + Find("SliceThickness")); v.push_back(std::string("Slice spacing (mm): ") + Find("SpacingBetweenSlices")); v.push_back(std::string("Image columns: ") + Find("Columns")); v.push_back(std::string("Image rows: ") + Find("Rows")); v.push_back(std::string("Phase encoding direction: ") + Find("InPlanePhaseEncodingDirection")); std::vector voxels = GetVoxelSize(); v.push_back(std::string("Voxel size x (mm): ") + ftos(voxels[0])); v.push_back(std::string("Voxel size y (mm): ") + ftos(voxels[1])); int nVolumes = GetNumberOfVolumes(); v.push_back(std::string("Number of volumes: ") + itos(nVolumes)); v.push_back(std::string("Number of slices: ") + itos(GetNumberOfSlices())); v.push_back(std::string("Number of files: ") + itos(GetNumberOfFiles())); // v.push_back(std::string("Number of frames: ") + Find("NumberOfFrames")); v.push_back(std::string("Number of frames: ") + itos(GetFrames())); v.push_back(std::string("Slice duration (ms) : ") + ftos(GetSliceDuration())); if (nVolumes > 1) { v.push_back(std::string("Volume interval (s): ") + ftos(GetVolumeInterval())); } if (!orientations.empty()) { if (orientations.front().at(1) > orientations.front().at(0)) { // sagital slices v.push_back(std::string("Orientation: sag")); } else if (orientations.front().at(4) > fabs(orientations.front().at(5))) { // transverse slices v.push_back(std::string("Orientation: tra")); } else { // coronal slices v.push_back(std::string("Orientation: cor")); } } return v; } /// /** Retrieves echo times for the series. Sets echo_times and multiecho. Note that echo_times is indexed by the EchoNumbers. */ void SeriesHandler::GetEchoTimes() { std::map::iterator eterator; std::string s; int idx; echo_times.clear(); std::set volids = GetVolIds(); std::set::iterator vol_it = volids.begin(); std::set::iterator vol_it_end = volids.end(); for (; vol_it != vol_it_end; vol_it++) { //if (Find("EchoTime", s, *vol_it) && Find("EchoNumber", idx, *vol_it)) { if (Find("EchoTime", s, *vol_it) && Find("EchoNumbers", idx, *vol_it)) { echo_times[idx] = s; } } multiecho = (echo_times.size() > 1); } /// /** */ SeriesHandler::VolListType SeriesHandler::ReadVolIds(DicomFile& file) { // should use FrameIncrementPointer, but doing it the easy way for now // This fails with RTDOSE data, deb-bug-617342. 20130405cdt // Also may be failure point for PACE series, dropping one volume, // sometimes the first, reference, sometimes another. // Note also, there is not a good way to guarantee unique volume // identifiers, leading to inappropriate overwriting. int nframes; if (!file.Find("NumberOfFrames", nframes)) { nframes = 1; } wxUint32 fip; wxUint16 fiphi, fiplo; file.Find("FrameIncrementPointer", fip); fiphi = ( fip & 0xFFFF0000 ) >> 16; fiplo = ( fip & 0x0000FFFF ); std::string fip_str; VolListType v; for (int frameno = 0; frameno < nframes; ++frameno) { VolId info; info.ids.push_back(GetSeriesUid()); // Make info.ids unique in event of multi-frame series. /** std::stringstream ss; ss << frameno; info.ids.push_back(ss.str()); */ std::string str; file.Find("NumberOfTemporalPositions", str); int ndigits = str.size(); str.clear(); int tpid = 0; //file.Find("TemporalPositionId", tpid); file.Find("TemporalPositionIdentifier", tpid); str = itos(tpid, ndigits); info.ids.push_back(str); str.clear(); int echonumber = 0; //file.Find("EchoNumber", echonumber); file.Find("EchoNumbers", echonumber); str = itos(echonumber, 2); info.ids.push_back(str); std::string ImageType; file.Find("ImageType", ImageType); if (ImageType.find("DERIVED") != std::string::npos) { info.ids.push_back("D"); } else { info.ids.push_back(""); } if (ImageType.find("T2 MAP") != std::string::npos) { info.ids.push_back("T2MAP"); } else { info.ids.push_back(""); } if (ImageType.find("\\M\\") != std::string::npos) { info.ids.push_back("M"); } else { if (ImageType.find("\\P\\") != std::string::npos) { info.ids.push_back("P"); } else { info.ids.push_back(""); } } std::vector rotation; rotation.resize(9, 0); std::string iop; if (!file.Find("ImageOrientationPatient", iop)) { iop = "1\\0\\0\\0\\1\\0"; } for (int i = 0; i < 6; ++i) { double f = stof(iop, i); // round off rotation[i] = static_cast(static_cast(f * 10000 + 0.5)) / 10000; } rotation[6] = rotation[1]*rotation[5] - rotation[2]*rotation[4]; rotation[7] = rotation[2]*rotation[3] - rotation[0]*rotation[5]; rotation[8] = rotation[0]*rotation[4] - rotation[1]*rotation[3]; std::vector >::iterator pos; pos = find(orientations.begin(), orientations.end(), rotation); if (pos != orientations.end()) { info.orientNumber = distance(orientations.begin(), pos); } else { info.orientNumber = orientations.size(); orientations.push_back(rotation); } info.ids.push_back(itos(info.orientNumber + 1)); v.push_back(info); } return v; } /// /** \return A set of VolIds from each file in mFileMap. */ std::set SeriesHandler::GetVolIds() const { std::set volSet; FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator it_end = mFileMap.end(); VolListType::const_iterator vit, vit_end; for(; it != it_end; ++it) { vit = it->second.begin(); vit_end = it->second.end(); for (; vit != vit_end; ++vit) { volSet.insert(*vit); } } return volSet; } /// /** returns volid + last file with that id \return A map relating VolIds and file names. */ std::map SeriesHandler::GetVolIdsAndFiles() const { std::map volMap; FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator it_end = mFileMap.end(); VolListType::const_iterator vit, vit_end; for (; it != it_end; ++it) { vit = it->second.begin(); vit_end = it->second.end(); for (; vit != vit_end; ++vit) { volMap[*vit] = it->first; } } return volMap; } /// /** \param id \param str Reference to std::string, contains file name if 'id' matches a volume contained in mFileMap. \return True if match to str is found. */ bool SeriesHandler::GetFirstFilename(const VolId& id, std::string& str) const { FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator it_end = mFileMap.end(); VolListType::const_iterator vit, vit_end; for (; it != it_end; ++it) { vit = it->second.begin(); vit_end = it->second.end(); for (; vit != vit_end; ++vit) { if (*vit == id) { str = it->first; return true; } } } return false; } /// /** */ std::vector SeriesHandler::GetRotationMatrix(const VolId& id) { std::vector r(9,0); try { r = orientations.at(id.orientNumber); } catch (const std::exception& error) { wxLogError(_("orientNumber: %d; number of orientations: %d"), id.orientNumber, orientations.size()); wxLogError(wxString(error.what(), wxConvLocal)); } return r; } /// /** */ void SeriesHandler::GetImageComments(std::vector& comments) const { std::map volFileMap = GetVolIdsAndFiles(); std::map::iterator it = volFileMap.begin(); std::map::iterator it_end = volFileMap.end(); for (;it != it_end; ++it) { std::string comment; DicomFile file(it->second.c_str()); file.Find("ImageComments", comment); comments.push_back(comment); } } /// /** */ void jcs::Normalize(GradientInfo& info) { std::vector norms; for (unsigned int i = 0; i < info.xGrads.size(); ++i) { double norm = sqrt( pow(info.xGrads.at(i), 2) + pow(info.yGrads.at(i), 2) + pow(info.zGrads.at(i), 2) ); // norm = sqrt(norm); norms.push_back(norm); } for (unsigned int i = 0; i < info.xGrads.size(); ++i) { if ((norms.at(i) != 1.0) && (norms.at(i) != 0)) { info.xGrads.at(i) /= norms.at(i); info.yGrads.at(i) /= norms.at(i); info.zGrads.at(i) /= norms.at(i); } } } /// /** */ // nb - inverse(r)*info.xGrads void jcs::RotateGradInfo(GradientInfo& info, std::vector& r) { std::vector temp (3,0); for (unsigned int i = 0; i < info.xGrads.size(); ++i) { temp[0] = r[0]*info.xGrads[i] + r[1]*info.yGrads[i] + r[2]*info.zGrads[i]; temp[1] = r[3]*info.xGrads[i] + r[4]*info.yGrads[i] + r[5]*info.zGrads[i]; temp[2] = r[6]*info.xGrads[i] + r[7]*info.yGrads[i] + r[8]*info.zGrads[i]; info.xGrads[i] = temp[0]; info.yGrads[i] = temp[1]; info.zGrads[i] = temp[2]; } return; } mriconvert/MRIConvert.h0000640000175000000620000000051612542632315014416 0ustar stevestaff/// MRIConvert.h /** */ #ifndef MRICONVERT_H_ #define MRICONVERT_H_ // #define _CRT_SECURE_NO_WARNINGS // #define _CRT_SECURE_NO_DEPRECATE 1 #include class MRIConvert : public wxApp { public: virtual bool OnInit(); protected: wxLocale m_locale; }; DECLARE_APP(MRIConvert) #endif mriconvert/OverwriteDlg.cpp0000640000175000000620000000261612542632326015403 0ustar stevestaff#if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include "OverwriteDlg.h" using namespace jcs; BEGIN_EVENT_TABLE(OverwriteDlg, wxDialog) EVT_BUTTON(wxID_YES, OverwriteDlg::OnButton) EVT_BUTTON(wxID_YESTOALL, OverwriteDlg::OnButton) EVT_BUTTON(wxID_NO, OverwriteDlg::OnButton) EVT_BUTTON(wxID_CANCEL, OverwriteDlg::OnButton) END_EVENT_TABLE() OverwriteDlg::OverwriteDlg(wxWindow* parent, const char* filename) : wxDialog(parent, -1, wxString(_T("Confirm file overwrite"))) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); // if we add this back, might not be ok in unicode -- check wxString message = wxString::Format(_T("%s exists. Overwrite?"), filename); dlgSizer->Add(new wxStaticText(this, -1, message), 0, wxALL, 20); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); buttonSizer->Add(new wxButton(this, wxID_YES, _("Yes"))); buttonSizer->Add(0, 0, 1); buttonSizer->Add(new wxButton(this, wxID_YESTOALL, _("Yes to All"))); buttonSizer->Add(0, 0, 1); buttonSizer->Add(new wxButton(this, wxID_NO, _("No"))); buttonSizer->Add(0, 0, 1); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); dlgSizer->Add(buttonSizer, 0, wxALL|wxEXPAND, 20); SetSizer(dlgSizer); dlgSizer->Fit(this); } void OverwriteDlg::OnButton(wxCommandEvent& event) { EndModal(event.GetId()); } mriconvert/MainHeader.cpp0000640000175000000620000000115212542632332014752 0ustar stevestaff/// MainHeader.cpp /** */ #include "MainHeader.h" using namespace jcs; std::istream & jcs::operator>> (std::istream &in, MainHeader &mh) { DicomElementInstance de; de.transferSyntaxCode = mh.transferSyntaxCode; std::streampos save_position; while (true) { save_position = in.tellg(); in >> de; if (mh.isPixelData(de)) { in.seekg(save_position); break; } else { mh.mhElements.push_back(de); } } return in; } bool MainHeader::isPixelData(DicomElementInstance de) { return (de.tag == DicomTag(0x7fe0, 0x0010)) ? true : false; } mriconvert/SeriesHandler.h0000640000175000000620000001335012542632312015153 0ustar stevestaff /// SeriesHandler.h /** */ #ifndef SERIES_HANDLER_H #define SERIES_HANDLER_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DicomFile.h" #include "Dictionary.h" #include "Volume.h" #include "StringConvert.h" class wxFileName; namespace jcs { enum AoCode { ASCENDING, DESCENDING, INTERLEAVED_ODD, INTERLEAVED_EVEN, UNKNOWN, OTHER }; /// /*** Things constant for a 3D volume. */ struct VolId { typedef std::vector IdType; IdType ids; int orientNumber; bool operator< (const VolId &rhs) const { return (ids < rhs.ids); } bool operator== (const VolId &rhs) const { return ((ids == rhs.ids) && (orientNumber == rhs.orientNumber)); } }; /** Stuff used for automatic generation of filenames & directories, save to avoid unneccessary file reads. */ struct SeriesInfo { std::string subject_name; std::string subject_id; std::string study_number; std::string series_number; std::string StudyDate; std::string SeriesDate; std::string study_description; std::string series_description; }; struct GradientInfo { std::vector values; std::vector xGrads; std::vector yGrads; std::vector zGrads; }; void Normalize(GradientInfo& info); void RotateGradInfo(GradientInfo& info, std::vector& r); /// /** */ class SeriesHandler { public : SeriesHandler(const std::string& seriesUid); virtual ~SeriesHandler(); const std::string& GetSeriesUid() const { return mSeriesUid; } template int Find(DicomElement e, T& value) const; template int Find(const std::string& s, T& value) const; template int Find(const std::string& s, T& value, const VolId& id) const; std::string Find(const std::string& s) const; std::string Find(DicomElement e) const; virtual std::vector GetStringInfo(); virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } int AddFile(const char* filename); int GetNumberOfFiles() const { return mFileMap.size(); } virtual int GetNumberOfSlices() const; virtual int GetNumberOfVolumes() const; virtual std::vector GetVoxelSize(); virtual int GetRows(); virtual int GetColumns(); virtual int GetFrames() const; virtual double GetSliceDuration() const; virtual double GetVolumeInterval() const; virtual AoCode GetAcquisitionOrder() const { return UNKNOWN; } virtual bool IsMosaic() const { return false; } virtual bool IsDti() const { return false; } virtual bool IsMoCo() const { return false; } virtual bool IsMultiEcho() const { return multiecho; } bool IsBigEndian() const; std::set GetVolIds() const; std::map GetVolIdsAndFiles() const; std::vector GetIppForFirstSlice(const VolId& id); std::vector GetRotationMatrix(const VolId& id); virtual GradientInfo GetGradientInfo() { return GradientInfo(); }; void GetImageComments(std::vector& comments) const; std::vector GetFilenames() const; void GetEchoTimes(); SeriesInfo seriesInfo; bool rescale; bool multiecho; /// Indexed by EchoNumber. std::map echo_times; int GetRescaleSlopeAndIntercept(const VolId& id, double& slope, double& intercept) const; virtual int GetRescaleSlopeAndIntercept(DicomFile& dfile, double& slope, double& intercept, int frame = 0) const; protected : typedef std::vector< VolId > VolListType; typedef std::map < std::string, VolListType > FileMapType; FileMapType mFileMap; std::map > position; // ipp for slice 1, calculated in GetVolumes std::vector > orientations; virtual VolListType ReadVolIds(DicomFile& file); virtual std::string GetImagePositionPatient(DicomFile& dfile, int frame); double GetMeanVolumeInterval(std::vector& vol_times) const; void CheckIntervalSanity(std::vector& vol_times, double value) const; double CalculateVolIntVal(std::map >& vtmap, unsigned int min_num_volumes) const; private : // moved over from DicomSeries const std::string mSeriesUid; std::set mInstanceUids; SeriesHandler& operator=(const SeriesHandler& rhs); bool GetFirstFilename(const VolId& id, std::string& str) const; // todo: see if some of this can be moved out of the template? template void mGetVolumes(std::map >& v); }; } // end namespace jcs #include "SeriesHandler.txx" #endif mriconvert/ImageView.cpp0000640000175000000620000004160312542632311014634 0ustar stevestaff/// ImageView.cpp /** */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DicomFile.h" #include "ImageView.h" #include "StringConvert.h" using namespace jcs; wxImage CreateImage(DicomFile& file); enum { BUTTON_PLAY, TIMER_ID, SAVE_IMAGE, SAVE_ALL, WINDOW, RESET, CLOSE }; bool useDefaultWC = true; int width = 0; int center = 0; BEGIN_EVENT_TABLE(BitmapWindow, wxWindow) EVT_PAINT (BitmapWindow::OnPaint) EVT_ERASE_BACKGROUND(BitmapWindow::OnErase) EVT_LEFT_DOWN (BitmapWindow::OnMouseDown) EVT_MOTION (BitmapWindow::OnMouseMotion) EVT_LEFT_DCLICK (BitmapWindow::OnDoubleClick) END_EVENT_TABLE() /// /** */ BitmapWindow::BitmapWindow(ImageViewerBase* parent, const wxBitmap& bitmap) : wxWindow(parent, -1, wxDefaultPosition, wxDefaultSize), mBitmap(bitmap), mPoint(wxDefaultPosition) { SetClientSize(mBitmap.GetWidth(), mBitmap.GetHeight()); myParent = parent; } /// /** */ void BitmapWindow::SetBitmap(const wxBitmap& bitmap) { mBitmap = bitmap; Refresh(); } /// /** */ void BitmapWindow::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); dc.DrawBitmap(mBitmap, 0, 0, FALSE ); } /// /** */ void BitmapWindow::OnErase(wxEraseEvent& event) { } /// /** */ void BitmapWindow::OnMouseDown(wxMouseEvent& event) { mPoint = event.GetPosition(); useDefaultWC = false; } /// /** */ void BitmapWindow::OnMouseMotion(wxMouseEvent& event) { if (event.Dragging() && event.LeftIsDown()) { width += event.GetPosition().x - mPoint.x; center += event.GetPosition().y - mPoint.y; if (width < 0) { width = 0; } if (center < 0) { center = 0; } mPoint.x = event.GetPosition().x; mPoint.y = event.GetPosition().y; myParent->UpdateImage(); } } /// /** */ void BitmapWindow::OnDoubleClick(wxMouseEvent& event) { useDefaultWC = true; myParent->UpdateImage(); } BEGIN_EVENT_TABLE(ImageViewerBase, wxFrame) //Dialog) EVT_SCROLL ( ImageViewerBase::OnSlide) EVT_BUTTON (BUTTON_PLAY, ImageViewerBase::OnPlay) EVT_TIMER (TIMER_ID, ImageViewerBase::OnTimer) EVT_MENU (SAVE_IMAGE, ImageViewerBase::OnSave) EVT_MENU (SAVE_ALL, ImageViewerBase::OnSaveAll) EVT_MENU (WINDOW, ImageViewerBase::OnWindow) EVT_MENU (RESET, ImageViewerBase::OnReset) EVT_MENU (CLOSE, ImageViewerBase::OnClose) EVT_CONTEXT_MENU ( ImageViewerBase::OnContextMenu) END_EVENT_TABLE() /// /** */ ImageViewerBase::ImageViewerBase(wxWindow* parent, const wxString& title) : wxFrame(parent, -1, title, wxDefaultPosition, wxDefaultSize), mTimer(this, TIMER_ID) //: wxDialog(parent, -1, title, wxDefaultPosition, wxDefaultSize), mTimer(this, TIMER_ID) { useDefaultWC = true; // CreateStatusBar(); /* wxImage image = CreateInitialImage(); int size_x = image.GetWidth(); int size_y = image.GetHeight(); int size_z = GetNumberOfImages(); */ wxBoxSizer* panelSizer; wxBoxSizer* sliderSizer; mpSliceSlider = new wxSlider(this, -1, 0 , 0, 100); panelSizer = new wxBoxSizer(wxVERTICAL); sliderSizer = new wxBoxSizer(wxHORIZONTAL); sliderSizer->Add(mpSliceSlider, 1); mpPlayButton = new wxButton(this, BUTTON_PLAY, _T("play")); sliderSizer->Add(mpPlayButton, 0); mpBitmap = new BitmapWindow(this, wxBitmap(256, 256)); panelSizer->Add(mpBitmap, 1, wxEXPAND|wxALIGN_CENTER); panelSizer->Add(sliderSizer, 0, wxEXPAND); mpText = new wxStaticText(this, -1, _T("\n")); panelSizer->Add(mpText, 0); SetSizer(panelSizer); panelSizer->Fit(this); mTimer.Start(100); } /// /** */ ImageViewer::ImageViewer(wxWindow* parent, const std::vector& names, const wxString& show_first) : ImageViewerBase(parent, show_first), showFirst(show_first), filenames(names) { wxInitAllImageHandlers(); wxSize oldBitmapSize = mpBitmap->GetSize(); DicomFile file(showFirst.mb_str(wxConvLocal)); std::vector::iterator it = find(filenames.begin(), filenames.end(), showFirst); if (filenames.size() < 2) { mpSliceSlider->Disable(); mpPlayButton->Disable(); } else { mpSliceSlider->SetRange(0, filenames.size() - 1); mpSliceSlider->SetValue(static_cast(it - filenames.begin())); } UpdateImage(); } /// /** */ void ImageViewerBase::OnSlide(wxScrollEvent& event) { UpdateImage(); } /// /** */ void ImageViewerBase::OnPlay(wxCommandEvent& event) { if (mpPlayButton->GetLabel() == _T("play")) { if (mpSliceSlider->GetValue() == mpSliceSlider->GetMax()) { mpSliceSlider->SetValue(0); } mpPlayButton->SetLabel(_T("stop")); } else { mpPlayButton->SetLabel(_T("play")); } } /// /** */ void ImageViewerBase::OnTimer(wxTimerEvent& event) { if (mpPlayButton->GetLabel() != _T("stop")) { return; } int fileno = mpSliceSlider->GetValue() + 1; if (mpSliceSlider->GetMax() < fileno) { mpPlayButton->SetLabel(_T("play")); return; } mpSliceSlider->SetValue(fileno); UpdateImage(); } /// /** */ void ImageViewer::OnWindow(wxCommandEvent& event) { DicomFile file(filenames.at(mpSliceSlider->GetValue()).mb_str(wxConvLocal)); int maxpix; file.Find("LargestImagePixelValue", maxpix); width = maxpix; center = maxpix/2; useDefaultWC = false; UpdateImage(); } /// /** */ void ImageViewerBase::OnReset(wxCommandEvent& event) { useDefaultWC = true; UpdateImage(); } /// /** */ void ImageViewerBase::SetImage(wxImage image) { if (image.GetWidth() < 256) { float scaleFactor = 256.0/image.GetWidth(); image.Rescale(256, static_cast(image.GetHeight() * scaleFactor)); } mpBitmap->SetBitmap(image); wxSize imageSize = wxSize(image.GetWidth(), image.GetHeight()); if (mpBitmap->GetSize() != imageSize) { wxSize newSize = GetSize() + imageSize - mpBitmap->GetSize(); mpBitmap->SetSize(imageSize); SetSize(newSize); } mImage = image; } /// /** */ void ImageViewer::UpdateImage() { DicomFile file(filenames.at(mpSliceSlider->GetValue()).mb_str(wxConvLocal)); wxImage image = CreateImage(file); SetImage(image); wxFileName name(filenames.at(mpSliceSlider->GetValue())); SetTitle(name.GetFullName()); wxLogStatus(name.GetFullName()); mpText->SetLabel(wxString::Format(wxT("Window width: %d. Window center: %d.\nClick and drag to adjust, double click to reset."), width, center)); } /// /** */ void ImageViewerBase::OnContextMenu(wxContextMenuEvent& event) { wxMenu menu; menu.Append(SAVE_IMAGE, _T("Save this image as image file")); menu.Append(SAVE_ALL, _T("Save entire series as image files")); menu.Append(WINDOW, _T("Auto window level by pixel values")); menu.Append(RESET, _T("Reset window level to DICOM file")); menu.Append(CLOSE, _T("Close window")); PopupMenu(&menu, ScreenToClient(event.GetPosition())); } /// /** */ void ImageViewerBase::OnSave(wxCommandEvent& event) { wxFileDialog* dlg = new wxFileDialog(this, _T("Save image"), _T(""), _T(""), _T("PNG file(*.png)|*.png|Jpeg file(*.jpg)|*.jpg|Bitmap file(*.bmp)|*.bmp|TIFF file (*.tif)|*.tif"), wxFD_SAVE); if (dlg->ShowModal() == wxID_OK) { wxString savefilename = dlg->GetPath(); if (!mImage.SaveFile(savefilename)) { wxMessageBox(_T("No handler for this file type."), _T("File was not saved"), wxOK | wxCENTRE, this); } } dlg->Destroy(); } /// /** */ void ImageViewerBase::OnSaveAll(wxCommandEvent& event) { wxFileDialog* dlg = new wxFileDialog(this, _T("Choose image file base name"), _T(""), _T(""), _T("PNG file(*.png)|*.png|Jpeg file(*.jpg)|*.jpg|Bitmap file(*.bmp)|*.bmp|TIFF file (*.tif)|*.tif"), wxFD_SAVE); if (dlg->ShowModal() == wxID_OK) { int nfiles = mpSliceSlider->GetMax() + 1; wxProgressDialog* p_dlg = new wxProgressDialog(_T("Progress"), _T("Saving files..."), nfiles, this, wxPD_CAN_ABORT | wxPD_APP_MODAL); int ndigits = itos(nfiles - 1).size(); for (int i = 0; i < nfiles; ++i) { mpSliceSlider->SetValue(i); UpdateImage(); wxFileName filename(dlg->GetPath()); wxString base = filename.GetName(); base.Append(wxString(itos(i, ndigits).c_str(), wxConvLocal)); filename.SetName(base); if (!mImage.SaveFile(filename.GetFullPath())) { wxMessageBox(_T("No handler for this file type."), _T("File was not saved"), wxOK | wxCENTRE, this); break; } if (!p_dlg->Update(i)) { break; } } p_dlg->Destroy(); } dlg->Destroy(); } /// /** */ void ImageViewerBase::OnClose(wxCommandEvent& event) { Close(); } /// /** */ template wxImage GetImage(DicomFile& file) { int columns; int rows; //file.Find(DT_IMAGECOLUMNS, columns); file.Find("Columns", columns); //file.Find(DT_IMAGEROWS, rows); file.Find("Rows", rows); std::vector data; if (file.PixelData(data, columns*rows*sizeof(T)) == 0) { wxLogError(_T("Unable to retrieve pixel data.")); } // int center, width; if (useDefaultWC) { file.Find("WindowCenter", center); file.Find("WindowWidth", width); } int rescale_slope, rescale_intercept; if (file.Find("RescaleSlope", rescale_slope) && file.Find("RescaleIntercept", rescale_intercept)) { if (rescale_slope != 0) { width /= rescale_slope; center = (center - rescale_intercept)/rescale_slope; } } // rescale to unsigned 8 bit T data_max = std::numeric_limits::max(); T data_min = std::numeric_limits::min(); if ((center + width/2) < data_max) { data_max = static_cast(center + width/2); } if ((center - width/2) > data_min) { data_min = static_cast(center - width/2); } wxUint8 char_max = std::numeric_limits::max(); int max_index = data.size(); if ((data_max - data_min) != 0) { float scaling = static_cast(char_max)/static_cast(data_max - data_min); T* c_ptr = &data.front(); for (int i = 0; i < max_index; ++i) { if (*c_ptr > data_max) { *c_ptr = data_max; } else if (*c_ptr < data_min) { *c_ptr = data_min; } *c_ptr = static_cast((*c_ptr) * scaling - data_min * scaling); ++c_ptr; } } unsigned char* my_data = (unsigned char*) malloc(columns*rows*3); unsigned char* new_ptr = my_data; T* old_ptr = &data.front(); for (int i = 0; i < max_index; ++i) { unsigned char pixel = static_cast(*old_ptr++); *new_ptr++ = pixel; *new_ptr++ = pixel; *new_ptr++ = pixel; } return wxImage(columns, rows, my_data, false); } /// /** */ wxImage GetRgbImage(DicomFile& file) { int columns; int rows; //file.Find(DT_IMAGECOLUMNS, columns); file.Find("Columns", columns); //file.Find(DT_IMAGEROWS, rows); file.Find("Rows", rows); unsigned char* data = (unsigned char*) malloc(columns*rows*3); file.PixelData(data, columns*rows*sizeof(unsigned char)*3); return wxImage(columns, rows, data, false); } /// /** */ wxImage CreateImage(DicomFile& file) { wxImage image; std::string pi; if (!file.Find("PhotometricInterpretation", pi)) { wxLogError(_T("File does not contain image data.")); image = wxImage(256, 256); return image; } if (pi == "RGB") { image = GetRgbImage(file); } else { int bits_allocated, pixel_rep = 0; file.Find("BitsAllocated", bits_allocated); file.Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 9 : image = GetImage(file); break; case 8 : image = GetImage(file); break; case 33 : image = GetImage(file); break; case 32 : image = GetImage(file); break; case 17 : image = GetImage(file); break; case 16 : default : image = GetImage(file); } } return image; } /// /** */ MultiFrameImageViewer::MultiFrameImageViewer(wxWindow* parent, const wxString& name) : ImageViewerBase(parent, name) { DicomFile file(name.mb_str(wxConvLocal)); //file.Find(DT_IMAGECOLUMNS, columns); file.Find("Columns", columns); //file.Find(DT_IMAGEROWS, rows); file.Find("Rows", rows); file.Find("NumberOfFrames", frames); goodVolume = CreateVolume(file); mpSliceSlider->SetRange(0, volume.size() - 1); mpSliceSlider->SetValue(0); UpdateImage(); } /// /** */ void MultiFrameImageViewer::UpdateImage() { int frame = mpSliceSlider->GetValue(); if (goodVolume) { SetImage(GetImage(frame)); } wxLogStatus(_T("%d"), frame); } /// /** */ template void GetVolume(DicomFile& file, std::vector > &volume) { wxBusyCursor busy; long columns, rows, frames; //file.Find(DT_IMAGECOLUMNS, columns); file.Find("Columns", columns); //file.Find(DT_IMAGEROWS, rows); file.Find("Rows", rows); file.Find("NumberOfFrames", frames); volume.resize(frames); for (long i = 0; i < frames; ++i) { volume[i].resize(rows*columns*3); } std::vector data; file.PixelData(data, columns * rows * frames * sizeof(T)); // rescale to unsigned 8 bit typename std::vector::iterator frame_start = data.begin(); typename std::vector::iterator frame_end; wxUint8 char_max = std::numeric_limits::max(); while (frame_start < data.end()) { frame_end = frame_start + columns*rows; T data_max = *std::max_element(frame_start, frame_end); T data_min = *std::min_element(frame_start, frame_end); int max_index = columns*rows; if ((data_max - data_min) != 0) { float scaling = static_cast(char_max)/static_cast(data_max - data_min); T* c_ptr = &*frame_start; for (long i = 0; i < columns*rows; ++i) { //, ++c_ptr) { *c_ptr = static_cast((*c_ptr) * scaling - data_min * scaling); ++c_ptr; } } frame_start = frame_end; } T* old_ptr = &data.front(); for (long i = 0; i < frames; ++i) { unsigned char* new_ptr = &volume[i].front(); for (long j = 0; j < (columns*rows); ++j){ unsigned char pixel = static_cast(*old_ptr++); *new_ptr++ = pixel; *new_ptr++ = pixel; *new_ptr++ = pixel; } } } /// /** */ wxImage MultiFrameImageViewer::GetImage(int frame) { wxUint8* ptr = &volume[frame].front(); return wxImage(columns, rows, ptr, true); } /// /** */ // nb - need to find a multiframe rbg image to test this! void GetRgbVolume(DicomFile& file, std::vector > &volume) { wxBusyCursor busy; long columns, rows, frames; //file.Find(DT_IMAGECOLUMNS, columns); file.Find("Columns", columns); //file.Find(DT_IMAGEROWS, rows); file.Find("Rows", rows); file.Find("NumberOfFrames", frames); std::vector data; file.PixelData(data, columns * rows * frames * sizeof(unsigned char)); unsigned char* old_ptr = &data.front(); volume.resize(frames); for (long i = 0; i < frames; ++i) { volume[i].resize(rows*columns*3); } for (long i = 0; i < frames; ++i) { unsigned char* new_ptr = &volume[i].front(); memcpy(new_ptr, old_ptr, rows*columns*sizeof(unsigned char)); old_ptr += rows*columns*sizeof(unsigned char); } } /// /** */ bool MultiFrameImageViewer::CreateVolume(DicomFile& file) { std::string pi; if (!file.Find("PhotometricInterpretation", pi)) { wxLogError(_T("File does not contain image data.")); return 0; } if (pi == "RGB") { GetRgbVolume(file, volume); return 1; } else { int bits_allocated, pixel_rep = 0; file.Find("BitsAllocated", bits_allocated); file.Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 8 : GetVolume(file, volume); break; case 9 : GetVolume(file, volume); break; case 16 : GetVolume(file, volume); break; case 17 : GetVolume(file, volume); break; case 32 : GetVolume(file, volume); break; case 33 : GetVolume(file, volume); break; default : wxLogMessage(_("BitsAllocated and PixelRepresentation values (%d, %d) not supported."), bits_allocated, pixel_rep); } } return 1; } mriconvert/jcsTree.cpp0000640000175000000620000001327112542632332014361 0ustar stevestaff/// jcsTree.cpp /** */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include "jcsTree.h" #include "file.xpm" #include "folder.xpm" #include "open_folder.xpm" jcsTreeCtrl::jcsTreeCtrl(wxWindow* parent, wxWindowID id, long style, const char* root) : wxTreeCtrl(parent, id, wxDefaultPosition, wxDefaultSize, style), mStyle(style) { CreateImageList(); AddRoot(wxString(root, wxConvLocal), folder_icon, -1, new jcsTreeItemData(root, dtROOT)); SetItemImage(GetRootItem(), open_folder_icon, wxTreeItemIcon_Expanded); } void jcsTreeCtrl::CreateImageList(int size) { wxImageList* images = new wxImageList(size, size, true); images->Add(wxIcon(folder_xpm)); images->Add(wxIcon(open_folder_xpm)); images->Add(wxIcon(file_xpm)); AssignImageList(images); } /// /** */ void jcsTreeCtrl::Reset() { mTreeMap.clear(); if (HasVisibleRoot()) { Collapse(GetRootItem()); } DeleteChildren(GetRootItem()); } /// /** */ bool jcsTreeCtrl::HasVisibleRoot() { return (GetFirstVisibleItem().IsOk() && (GetFirstVisibleItem() == GetRootItem())); } /// /** */ void jcsTreeCtrl::RemoveBranch(wxTreeItemId branch) { if (branch == GetRootItem()) { return; } jcsTreeItemData* item = (jcsTreeItemData*) GetItemData(branch); if (item->GetItemType() == dtFILE) { return; } wxTreeItemId parent = GetItemParent(branch); mRemoveFromMap(branch); Delete(branch); if (parent != GetRootItem() && !ItemHasChildren(parent)) { RemoveBranch(parent); } } /// /** */ // delete items recursively from tree map void jcsTreeCtrl::mRemoveFromMap(wxTreeItemId branch) { if (branch != GetRootItem()) { jcsTreeItemData* item = (jcsTreeItemData*) GetItemData(branch); // remove item's children if (ItemHasChildren(branch)) { int n_children = GetChildrenCount(branch, false); wxTreeItemIdValue cookie; wxTreeItemId child = GetFirstChild(branch, cookie); mRemoveFromMap(child); for (int i = 1; i < n_children; ++i) { child = GetNextChild(branch, cookie); mRemoveFromMap(child); } } // remove item mTreeMap.erase(item->GetUid()); } } /// /** */ bool jcsTreeCtrl::IsChild(const wxTreeItemId& item, const wxTreeItemId& parent) const { bool retval = false; if (ItemHasChildren(parent)) { wxTreeItemIdValue cookie; wxTreeItemId child = GetFirstChild(parent, cookie); if (item == child || IsChild(item, child)) { retval = true; } else { for (unsigned int i = 1; i < GetChildrenCount(item, false); ++i) { child = GetNextChild(parent, cookie); if (item == child || IsChild(item, child)) { retval = true; break; } } } } return retval; } /// /** */ int jcsTreeCtrl::GetItemType(const wxTreeItemId& item) const { int retval = -1; if (item.IsOk()) { jcsTreeItemData* data = dynamic_cast (GetItemData(item)); retval = data->GetItemType(); } return retval; } /// /** Returns the type of the selection. If multiple selected items are permitted, returns the type of the first selected item. \return The type of the selection, one of dtROOT, dtSUBJECT, dtSTUDY, dtSERIES, dtFILE. */ int jcsTreeCtrl::GetSelectionType() const { wxArrayTreeItemIds selecteds; GetSelected(selecteds); return GetItemType(selecteds[0]); } /// /** */ wxString jcsTreeCtrl::GetStringSelection() const { wxTreeItemId selected; wxArrayTreeItemIds selecteds; wxString retval; GetSelections(selecteds); selected = selecteds[0]; if (selected.IsOk()) { retval = GetItemText(selected); } else { retval = _T("error"); } return retval; } /// /** */ wxString jcsTreeCtrl::GetStringSelection(const wxTreeItemId& selected) const { wxString retval; if (selected.IsOk()) { retval = GetItemText(selected); } else { retval = _T("error"); } return retval; } /// /** */ const std::string jcsTreeCtrl::GetItemUid(const wxTreeItemId& item) const { if (item.IsOk()) { jcsTreeItemData* data = static_cast (GetItemData(item)); return data->GetUid(); } else { return std::string(); } } const std::string jcsTreeCtrl::GetPrefix(const wxTreeItemId& item) const { if (item.IsOk()) { jcsTreeItemData* data = static_cast (GetItemData(item)); return data->GetPrefix(); } else return std::string(); } std::string jcsTreeCtrl::GetSelectionUid() const { return GetItemUid(GetSelection()); } wxTreeItemId jcsTreeCtrl::GetTreeId(std::string uid) const { if (mTreeMap.count(uid)) { return (*mTreeMap.find(uid)).second; } else { return GetRootItem(); } } const std::string jcsTreeCtrl::GetSeriesUid(const wxTreeItemId& item) const { if (item.IsOk()) { jcsTreeItemData* data = static_cast (GetItemData(item)); return data->GetSeriesUid(); } else { return std::string(); } } bool jcsTreeCtrl::IsMultiple() const { return (mStyle && wxTR_MULTIPLE); } /// /** Gets selected tree items */ int jcsTreeCtrl::GetSelected(wxArrayTreeItemIds& selecteds) const { wxTreeItemId selected; unsigned int n_selected = 0; if (IsMultiple()) { n_selected = GetSelections(selecteds); } else { n_selected = 1; selecteds.Add(GetSelection()); } return n_selected; } mriconvert/DicomElementInstance.h0000640000175000000620000000345212542632325016463 0ustar stevestaff/// DicomElementInstance.h /** This class represents a DICOM Data Element */ #ifndef DICOMELEMENTINSTANCE_H_ #define DICOMELEMENTINSTANCE_H_ #include #include #include #include #include #include #include "DicomTag.h" #include "Dictionary.h" #include "ValueRepresentations.h" namespace jcs { /// /** Provides the relationship between a DICOM tag and text description of the tag. */ class DicomElementInstance { public: DicomElementInstance() {} DicomElementInstance(Dictionary *dictionary) : mDicomDictionary(dictionary) {} DicomElementInstance(wxUint8 code, Dictionary *dictionary) : transferSyntaxCode(code), mDicomDictionary(dictionary) {} DicomElementInstance(const DicomTag &tag, const char *desc = "", const char *vr = "UN") : tag(tag), description(desc), vr(vr) {} wxUint8 transferSyntaxCode; /// The DICOM group and element numbers. DicomTag tag; /// The DICOM field name. std::string description; /// The DICOM field data type identifier. std::string vr; // Consider using a char pointer with dynamic memory // allocation, freeing when done. char value_buff[1024]; char vr_buff[3]; wxUint32 value_length; DicomValue *myValue; Dictionary *mDicomDictionary; bool IsExplicitVR(); std::string GetVR(); wxUint32 EndianSwapUint32(wxUint32 value); friend std::istream &operator>>(std::istream &in, DicomElementInstance &de); friend std::ostream &operator<<(std::ostream &out, DicomElementInstance &de); }; std::istream &operator>>(std::istream &in, DicomElementInstance &de); std::ostream &operator>>(std::ostream &out, DicomElementInstance &de); } #endif mriconvert/BasicOptionsDlg.cpp0000640000175000000620000001221312542632332016001 0ustar stevestaff/// BasicOptionsDlg.cpp /** */ #include #include #include #include #include "BasicOptionsDlg.h" #include "OutputterBase.h" #include "Basic3DOutputter.h" using namespace jcs; BEGIN_EVENT_TABLE(BasicOptionsDlg, wxDialog) //EVT_CLOSE(BasicOptionsDlg::OnClose) //EVT_LISTBOX(wxID_ANY, BasicOptionsDlg::CmdEvtHandler) //EVT_CHECKLISTBOX(wxID_ANY, BasicOptionsDlg::CmdEvtHandler) END_EVENT_TABLE() /// A basic panel for our Options dialog. /** */ BasicOptionsDlg::BasicPanel::BasicPanel(wxWindow* parent) : wxPanel(parent) { wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL); panelSizer->Add(new wxStaticText(this, -1, _("Items for default file names")), 0, wxTOP|wxLEFT|wxRIGHT, 10); mpNameFields = new wxCheckListBox(this, -1); mpNameFields->Connect(wxID_ANY, wxEVT_RIGHT_UP, wxMouseEventHandler(BasicOptionsDlg::OnRightClick), NULL, this); panelSizer->Add(mpNameFields, 0, wxEXPAND|wxALL, 10); mpSplitSubjCheck = new wxCheckBox(this, -1, _("Save each subject in separate directory")); panelSizer->Add(mpSplitSubjCheck, 0, wxALL, 10); //==================== mpSplitDirsCheck = new wxCheckBox(this, -1, _("Save each series in separate directory")); panelSizer->Add(mpSplitDirsCheck, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); mpDimCheck = new wxCheckBox(this, -1, _("Save multivolume series as 4D files")); panelSizer->Add(mpDimCheck, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); panelSizer->Add(new wxStaticText(this, -1, _("Skip volumes for multivolume series:")), 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); mpSkipSpin = new wxSpinCtrl(this, -1, _T("0")); panelSizer->Add(mpSkipSpin, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); mpRescaleCheck = new wxCheckBox(this, -1, _("Apply rescale slope and intercept to data")); panelSizer->Add(mpRescaleCheck, 0, wxALL, 10); SetSizer(panelSizer); panelSizer->Fit(this); } BasicOptionsDlg::BasicOptionsDlg(const wxString& title, Basic3DOutputter* outputter) : wxDialog(NULL, -1, title), mOutputter(outputter) { myPanel = new BasicPanel(this); myPanel->mpSplitDirsCheck->SetValue(mOutputter->GetSplit()); myPanel->mpSplitSubjCheck->SetValue(mOutputter->GetSplitSubj()); myPanel->mpDimCheck->SetValue(mOutputter->GetDimensionality() == 4); myPanel->mpSkipSpin->SetValue(mOutputter->GetSkip()); myPanel->mpRescaleCheck->SetValue(mOutputter->GetRescale()); OutputterBase::FieldMap::iterator it = mOutputter->defaultNameFields.begin(); OutputterBase::FieldMap::iterator it_end = mOutputter->defaultNameFields.end(); for (int i = 0; it != it_end; it++, i++) { myPanel->mpNameFields->Append(wxString(it->second.name.c_str(), wxConvLocal)); myPanel->mpNameFields->Check(i, it->second.value); } // default min size has extra white space vertically wxSize boxSize = myPanel->mpNameFields->GetEffectiveMinSize(); boxSize.SetHeight(boxSize.GetHeight()*3/4); myPanel->mpNameFields->SetMinSize(boxSize); } bool BasicOptionsDlg::SplitDirs() const { return myPanel->mpSplitDirsCheck->GetValue(); } bool BasicOptionsDlg::SplitSubj() const { return myPanel->mpSplitSubjCheck->GetValue(); } int BasicOptionsDlg::Dimensionality() const { return (myPanel->mpDimCheck->GetValue()) ? 4 : 3; } int BasicOptionsDlg::Skip() const { return myPanel->mpSkipSpin->GetValue(); } bool BasicOptionsDlg::Rescale() const { return myPanel->mpRescaleCheck->GetValue(); } void BasicOptionsDlg::OnRightClick(wxMouseEvent &event) { //std::cout << "right click" << std::endl; } //... /// /** All sub-classes of BasicOptionsDlg want these actions done. */ void BasicOptionsDlg::OnOkay(wxCommandEvent& event) { mOutputter->SetSplit (SplitDirs()); mOutputter->SetSplitSubj (SplitSubj()); mOutputter->SetDimensionality (Dimensionality()); mOutputter->SetSkip (Skip()); mOutputter->SetRescale (Rescale()); } void BasicOptionsDlg::OnClose(wxCloseEvent& event) { //std::cout << "dialog closed" << std::endl; event.Skip(); } void BasicOptionsDlg::CmdEvtHandler(wxCommandEvent &evt) { //std::cout << "CmdEvtHandler" << std::endl; evt.Skip(); } bool BasicOptionsDlg::Rebuild() const { return ((SplitDirs() != mOutputter->GetSplit()) || (SplitSubj() != mOutputter->GetSplitSubj()) || (Dimensionality() != mOutputter->GetDimensionality()) || (Skip() != mOutputter->GetSkip())); } bool BasicOptionsDlg::SaveNameFields() { bool needsRebuild = false; for (unsigned int i = 0; i < myPanel->mpNameFields->GetCount(); ++i) { std::string name(myPanel->mpNameFields->GetString(i).mb_str(wxConvLocal)); bool value = myPanel->mpNameFields->IsChecked(i); OutputterBase::FieldMap::iterator it = mOutputter->defaultNameFields.begin(); OutputterBase::FieldMap::iterator it_end = mOutputter->defaultNameFields.end(); for (;it != it_end; ++it) { if (it->second.name == name) { if (it->second.value != value) { needsRebuild = true; } it->second.value = value; break; } } } return needsRebuild; } mriconvert/GeDtiRbHandler.cpp0000640000175000000620000000457212542632312015542 0ustar stevestaff/// GetDtiRbHandler.cpp /** */ #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "SeriesHandler.h" #include "GeDtiRbHandler.h" using namespace jcs; /// /** */ GeDtiRbHandler::GeDtiRbHandler(const std::string& seriesUid) : SeriesHandler(seriesUid) { } /// /** */ SeriesHandler::VolListType GeDtiRbHandler::ReadVolIds(DicomFile& file) { VolListType v = SeriesHandler::ReadVolIds(file); // Can't call default ReadVolId because of problem with trigger time. std::string acquisition_number; if (!file.Find("AcquisitionNumber", acquisition_number)) { wxLogError(_("Acquisition number not found")); } v.front().ids.push_back(acquisition_number); int image_number, number_of_slices; if (!file.Find("InstanceNumber", image_number)) { wxLogError(_("Instance number not found")); } Dictionary* Excite = Excite_Dictionary::Instance(); if (!file.Find(Excite->Lookup("Locations_in_acquisition"), number_of_slices)) { wxLogError(_("Locations_in_acquisition not found")); } int vol_no = static_cast(floor(static_cast((image_number - 1))/number_of_slices) + 1); v.front().ids.push_back(itos(vol_no, 3)); return v; } /// /** */ GradientInfo GeDtiRbHandler::GetGradientInfo() { GradientInfo info; int gradfileno; Dictionary* Excite = Excite_Dictionary::Instance(); double bvalue; Find(Excite->Lookup("User_data_9"), bvalue); if (Find(Excite->Lookup("User_data_11"), gradfileno)) { wxString gradfilename = wxString::Format(_T("dwepi.%d.grads"), gradfileno); wxFileName gradfile(wxStandardPaths::Get().GetDataDir()); gradfile.SetFullName(gradfilename); std::ifstream input((const char *) gradfile.GetFullPath()); double value; input >> value; while (input.good()) { info.xGrads.push_back(value); input >> value; info.yGrads.push_back(value); input >> value; info.zGrads.push_back(value); info.values.push_back(bvalue); input >> value; } // GE -- do not correct // assuming one orientation in series //std::vector r = orientations.at(0); //RotateGradInfo(info, r); } return info; } mriconvert/DicomDictionary.h0000640000175000000620000121254112542632332015512 0ustar stevestaff/// DicomDictionary.h /** DICOM attributes from 2011 standard as obtained from: http://www.dclunie.com/dicom-status/status.html#BaseStandard2011 Data from PS 3.6 Data Dictionary. Attributes with short description ending in "-RET" are retired as of the 2011 standard. 20130221cdt */ /** These from http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/DICOM.html have already entries below. 0002,0000 FileMetaInfoGroupLength N 0002,0001 FileMetaInfoVersion N 0002,0002 MediaStorageSOPClassUID N 0002,0003 MediaStorageSOPInstanceUID N 0002,0010 TransferSyntaxUID N 0002,0012 ImplementationClassUID N 0002,0013 ImplementationVersionName N 0002,0016 SourceApplicationEntityTitle N 0002,0100 PrivateInformationCreatorUID N 0002,0102 PrivateInformation */ mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1504 ), "MRDRDirectoryRecordOffset-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1600 ), "NumberOfReferences-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0001 ), "LengthToEnd-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0010 ), "RecognitionCode-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0024 ), "OverlayDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0025 ), "CurveDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0034 ), "OverlayTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0035 ), "CurveTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0040 ), "DataSetType-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0041 ), "DataSetSubtype-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0042 ), "NuclearMedicineSeriesType-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1000 ), "NetworkID-RET", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1100 ), "ReferencedResultsSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1130 ), "ReferencedOverlaySequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1145 ), "ReferencedCurveSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2110 ), "LossyImageCompressionRetired-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2200 ), "TransducerPosition-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2204 ), "TransducerOrientation-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2208 ), "AnatomicStructure-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2240 ), "TransducerPositionSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2242 ), "TransducerPositionModifierSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2244 ), "TransducerOrientationSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2246 ), "TransducerOrientationModifierSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2251 ), "AnatomicStructureSpaceOrRegionCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2253 ), "AnatomicPortalOfEntranceCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2255 ), "AnatomicApproachDirectionCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2256 ), "AnatomicPerspectiveDescriptionTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2257 ), "AnatomicPerspectiveCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2258 ), "AnatomicLocationOfExaminingInstrumentDescriptionTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2259 ), "AnatomicLocationOfExaminingInstrumentCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x225A ), "AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x225C ), "OnAxisBackgroundAnatomicStructureCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x4000 ), "IdentifyingComments-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1050 ), "InsurancePlanIdentification-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0030 ), "Radionuclide-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0032 ), "EnergyWindowCenterline-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0033 ), "EnergyWindowTotalWidth-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0037 ), "TherapyType-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0039 ), "TherapyDescription-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1011 ), "HardcopyCreationDeviceID-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1017 ), "HardcopyDeviceManufacturer-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x101A ), "HardcopyDeviceSoftwareVersion-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x101B ), "HardcopyDeviceManufacturerModelName-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1141 ), "AngularPosition-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1146 ), "RotationOffset-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1240 ), "UpperLowerPixelValues-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x4000 ), "AcquisitionComments-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5021 ), "PostprocessingFunction-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5030 ), "DynamicRange-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5040 ), "TotalGain-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5210 ), "ImageTransformationMatrix-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5212 ), "ImageTranslationVector-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6038 ), "DopplerSampleVolumeXPositionRetired-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x603A ), "DopplerSampleVolumeYPositionRetired-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x603C ), "TMLinePositionX0Retired-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x603E ), "TMLinePositionY0Retired-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6040 ), "TMLinePositionX1Retired-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6042 ), "TMLinePositionY1Retired-RET", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9096 ), "ParallelReductionFactorInPlaneRetired-RET", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9166 ), "BulkMotionStatus-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9195 ), "ChemicalShiftMinimumIntegrationLimitInHz-RET", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9196 ), "ChemicalShiftMaximumIntegrationLimitInHz-RET", "FD" )); //mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9445 ), RET mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0014 ), "IsotopeNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0015 ), "PhaseNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0016 ), "IntervalNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0017 ), "TimeSlotNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0018 ), "AngleNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0022 ), "OverlayNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0024 ), "CurveNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0026 ), "LUTNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0030 ), "ImagePosition-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0035 ), "ImageOrientation-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0050 ), "Location-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0070 ), "ImageGeometryType-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0080 ), "MaskingImage-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x00AA ), "ReportNumber-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1000 ), "SeriesInStudy-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1001 ), "AcquisitionsInSeries-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1003 ), "ImagesInSeries-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1004 ), "AcquisitionsInStudy-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1005 ), "ImagesInStudy-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1020 ), "Reference-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1070 ), "OtherStudyNumbers-RET", "IS" )); //mAddEntry (DicomElement ( DicomTag ( 0x0020,3100 to 31FF)" "SourceImageIDs-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x3401 ), "ModifyingDeviceID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x3402 ), "ModifiedImageID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x3403 ), "ModifiedImageDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x3404 ), "ModifyingDeviceManufacturer-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x3405 ), "ModifiedImageTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x3406 ), "ModifiedImageDescription-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x5000 ), "OriginalImageIdentification-RET", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x5002 ), "OriginalImageIdentificationNomenclature-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0005 ), "ImageDimensions-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0012 ), "Planes-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0020 ), RET mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0040 ), "ImageFormat-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0050 ), "ManipulatedImage-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x005F ), "CompressionRecognitionCode-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0060 ), "CompressionCode-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0061 ), "CompressionOriginator-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0062 ), "CompressionLabel-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0063 ), "CompressionDescription-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0065 ), "CompressionSequence-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0066 ), "CompressionStepPointers-RET", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0068 ), "RepeatInterval-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0069 ), "BitsGrouped-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0070 ), "PerimeterTable-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0071 ), "PerimeterValue-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0080 ), "PredictorRows-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0081 ), "PredictorColumns-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0082 ), "PredictorConstants-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0090 ), "BlockedPixels-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0091 ), "BlockRows-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0092 ), "BlockColumns-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0093 ), "RowOverlap-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0094 ), "ColumnOverlap-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0104 ), "SmallestValidPixelValue-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0105 ), "LargestValidPixelValue-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0110 ), "SmallestImagePixelValueInPlane-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0111 ), "LargestImagePixelValueInPlane-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0200 ), "ImageLocation-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0400 ), "TransformLabel-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0401 ), "TransformVersionNumber-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0402 ), "NumberOfTransformSteps-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0403 ), "SequenceOfCompressedData-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0404 ), "DetailsOfCoefficients-RET", "AT" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x04x0 ), "RowsForNthOrderCoefficients-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x04x1 ), "ColumnsForNthOrderCoefficients-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x04x2 ), "CoefficientCoding-RET", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x04x3 ), "CoefficientCodingPointers-RET", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0700 ), "DCTLabel-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0701 ), "DataBlockDescription-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0702 ), "DataBlock-RET", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0710 ), "NormalizationFactorFormat-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0720 ), "ZonalMapNumberFormat-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0721 ), "ZonalMapLocation-RET", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0722 ), "ZonalMapFormat-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0730 ), "AdaptiveMapFormat-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0740 ), "CodeNumberFormat-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x08x0 ), "CodeLabel-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x08x2 ), "NumberOfTables-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x08x3 ), "CodeTableLocation-RET", "AT" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x08x4 ), "BitsForCodeWord-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x08x8 ), "ImageDataLocation-RET", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1080 ), "GrayScale-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1100 ), "GrayLookupTableDescriptor-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1111 ), "LargeRedPaletteColorLookupTableDescriptor-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1112 ), "LargeGreenPaletteColorLookupTableDescriptor-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1113 ), "LargeBluePaletteColorLookupTableDescriptor-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1200 ), "GrayLookupTableData-RET", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1211 ), "LargeRedPaletteColorLookupTableData-RET", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1212 ), "LargeGreenPaletteColorLookupTableData-RET", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1213 ), "LargeBluePaletteColorLookupTableData-RET", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1214 ), "LargePaletteColorLookupTableUID-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x4000 ), "ImagePresentationComments-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x5000 ), "BiPlaneAcquisitionSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6030 ), "MaskPointers-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9099 ), "LargestMonochromePixelValue-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x000A ), "StudyStatusID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x000C ), "StudyPriorityID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x0012 ), "StudyIDIssuer-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x0032 ), "StudyVerifiedDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x0033 ), "StudyVerifiedTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x0034 ), "StudyReadDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x0035 ), "StudyReadTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1000 ), "ScheduledStudyStartDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1001 ), "ScheduledStudyStartTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1010 ), "ScheduledStudyStopDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1011 ), "ScheduledStudyStopTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1020 ), "ScheduledStudyLocation-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1021 ), "ScheduledStudyLocationAETitle-RET", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1030 ), "ReasonForStudy-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1040 ), "StudyArrivalDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1041 ), "StudyArrivalTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1050 ), "StudyCompletionDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1051 ), "StudyCompletionTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1055 ), "StudyComponentStatusID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x4000 ), "StudyComments-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0011 ), "IssuerOfAdmissionID-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x001A ), "ScheduledAdmissionDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x001B ), "ScheduledAdmissionTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x001C ), "ScheduledDischargeDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x001D ), "ScheduledDischargeTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x001E ), "ScheduledPatientInstitutionResidence-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0030 ), "DischargeDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0032 ), "DischargeTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0040 ), "DischargeDiagnosisDescription-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0044 ), "DischargeDiagnosisCodeSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0061 ), "IssuerOfServiceEpisodeID-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0307 ), "DistanceSourceToSupport-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0330 ), "ReferencedProcedureStepSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x050A ), "SpecimenAccessionNumber-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0550 ), "SpecimenSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0552 ), "SpecimenDescriptionSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0553 ), "SpecimenDescriptionTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x06FA ), "SlideIdentifier-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x08D8 ), "PixelSpacingSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x08DA ), "CoordinateSystemAxisCodeSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x09F8 ), "VitalStainCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1006 ), "PlacerOrderNumberProcedure-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1007 ), "FillerOrderNumberProcedure-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1060 ), "RequestedProcedureDescriptionTrial-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2001 ), "ReasonForTheImagingServiceRequest-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2006 ), "PlacerOrderNumberImagingServiceRequestRetired-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2007 ), "FillerOrderNumberImagingServiceRequestRetired-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA007 ), "FindingsFlagTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA020 ), "FindingsSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA021 ), "FindingsGroupUIDTrial-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA022 ), "ReferencedFindingsGroupUIDTrial-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA023 ), "FindingsGroupRecordingDateTrial-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA024 ), "FindingsGroupRecordingTimeTrial-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA026 ), "FindingsSourceCategoryCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA028 ), "DocumentingOrganizationIdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA047 ), "MeasurementPrecisionDescriptionTrial-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA057 ), "UrgencyOrPriorityAlertsTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA060 ), "SequencingIndicatorTrial-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA066 ), "DocumentIdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA067 ), "DocumentAuthorTrial-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA068 ), "DocumentAuthorIdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA070 ), "IdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA074 ), "ObjectBinaryIdentifierTrial-RET", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA076 ), "DocumentingObserverIdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA085 ), "ProcedureIdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA089 ), "ObjectDirectoryBinaryIdentifierTrial-RET", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA090 ), "EquivalentCDADocumentSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA110 ), "DateOfDocumentOrVerbalTransactionTrial-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA112 ), "TimeOfDocumentCreationOrVerbalTransactionTrial-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA125 ), "ReportStatusIDTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA167 ), "ObservationCategoryCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA16A ), "BibliographicCitationTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA171 ), "ObservationUIDTrial-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA172 ), "ReferencedObservationUIDTrial-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA173 ), "ReferencedObservationClassTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA174 ), "ReferencedObjectObservationClassTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA192 ), "ObservationDateTrial-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA193 ), "ObservationTimeTrial-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA194 ), "MeasurementAutomationTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA224 ), "IdentificationDescriptionTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA290 ), "CoordinatesSetGeometricTypeTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA296 ), "AlgorithmCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA297 ), "AlgorithmDescriptionTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA29A ), "PixelCoordinatesSetTrial-RET", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA307 ), "CurrentObserverTrial-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA313 ), "ReferencedAccessionSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA33A ), "ReportStatusCommentTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA340 ), "ProcedureContextSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA352 ), "VerbalSourceTrial-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA353 ), "AddressTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA354 ), "TelephoneNumberTrial-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA358 ), "VerbalSourceIdentifierCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA380 ), "ReportDetailSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA402 ), "ObservationSubjectUIDTrial-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA403 ), "ObservationSubjectClassTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA404 ), "ObservationSubjectTypeCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA600 ), "ObservationSubjectContextFlagTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA601 ), "ObserverContextFlagTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA603 ), "ProcedureContextFlagTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA731 ), "RelationshipSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA732 ), "RelationshipTypeCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA744 ), "LanguageCodeSequenceTrial-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA992 ), "UniformResourceLocatorTrial-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB06 ), "TemplateVersion-RET", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB07 ), "TemplateLocalVersion-RET", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB0B ), "TemplateExtensionFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB0C ), "TemplateExtensionOrganizationUID-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB0D ), "TemplateExtensionCreatorUID-RET", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1400 ), "CountsIncluded-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1401 ), "DeadTimeCorrectionFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0040 ), "ImageRotationRetired-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0050 ), "DisplayedAreaTopLeftHandCornerTrial-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0051 ), "DisplayedAreaBottomRightHandCornerTrial-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0067 ), "GraphicLayerRecommendedDisplayRGBValue-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1024 ), "BeamOrderIndexTrial-RET", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1038 ), "DoubleExposureMetersetTrial-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x103A ), "DoubleExposureFieldDeltaTrial-RET", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1220 ), "RelatedProcedureStepSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1222 ), "ProcedureStepRelationshipType-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0904 ), "TopicTitle-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0906 ), "TopicSubject-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0910 ), "TopicAuthor-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0912 ), "TopicKeywords-RET", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x1000, 0xxxx0 ), "EscapeTriplet-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x1000, 0xxxx1 ), "RunLengthTriplet-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x1000, 0xxxx2 ), "HuffmanTableSize-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x1000, 0xxxx3 ), "HuffmanTableTriplet-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x1000, 0xxxx4 ), "ShiftTableSize-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x1000, 0xxxx5 ), "ShiftTableTriplet-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x1010, 0xxxxx ), "ZonalMap-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0062 ), "ColorImagePrintingFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0063 ), "CollationFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0065 ), "AnnotationFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0067 ), "ImageOverlayFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0069 ), "PresentationLUTFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x006A ), "ImageBoxPresentationLUTFlag-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0510 ), "ReferencedStoredPrintSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0130 ), "ReferencedImageOverlayBoxSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0140 ), "ReferencedVOILUTBoxSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0010 ), "ReferencedOverlayPlaneSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0011 ), "ReferencedOverlayPlaneGroups-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0020 ), "OverlayPixelDataSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0060 ), "OverlayMagnificationType-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0070 ), "OverlaySmoothingType-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0072 ), "OverlayOrImageMagnification-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0074 ), "MagnifyToNumberOfColumns-RET", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0080 ), "OverlayForegroundDensity-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0082 ), "OverlayBackgroundDensity-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0090 ), "OverlayMode-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0100 ), "ThresholdDensity-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2040, 0x0500 ), "ReferencedImageBoxSequenceRetired-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0010 ), "PrintJobID-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0140 ), "DestinationAE-RET", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0500 ), "ReferencedPrintJobSequencePullStoredPrint-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2110, 0x0099 ), "PrintQueueID-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x2120, 0x0010 ), "QueueStatus-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2120, 0x0050 ), "PrintJobDescriptionSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2120, 0x0070 ), "ReferencedPrintJobSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0010 ), "PrintManagementCapabilitiesSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0015 ), "PrinterCharacteristicsSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0030 ), "FilmBoxContentSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0040 ), "ImageBoxContentSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0050 ), "AnnotationContentSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0060 ), "ImageOverlayBoxContentSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x0080 ), "PresentationLUTContentSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x00A0 ), "ProposedStudySequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2130, 0x00C0 ), "OriginalImageSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4000, 0x0010 ), "Arbitrary-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x4000, 0x4000 ), "TextComments-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0040 ), "ResultsID-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0042 ), "ResultsIDIssuer-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0050 ), "ReferencedInterpretationSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x00FF ), "ReportProductionStatusTrial-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0100 ), "InterpretationRecordedDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0101 ), "InterpretationRecordedTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0102 ), "InterpretationRecorder-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0103 ), "ReferenceToRecordedSound-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0108 ), "InterpretationTranscriptionDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0109 ), "InterpretationTranscriptionTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x010A ), "InterpretationTranscriber-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x010B ), "InterpretationText-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x010C ), "InterpretationAuthor-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0111 ), "InterpretationApproverSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0112 ), "InterpretationApprovalDate-RET", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0113 ), "InterpretationApprovalTime-RET", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0114 ), "PhysicianApprovingInterpretation-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0115 ), "InterpretationDiagnosisDescription-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0117 ), "InterpretationDiagnosisCodeSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0118 ), "ResultsDistributionListSequence-RET", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0119 ), "DistributionName-RET", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x011A ), "DistributionAddress-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0200 ), "InterpretationID-RET", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0202 ), "InterpretationIDIssuer-RET", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0210 ), "InterpretationTypeID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0212 ), "InterpretationStatusID-RET", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x0300 ), "Impressions-RET", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x4008, 0x4000 ), "ResultsComments-RET", "ST" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0005 ), "CurveDimensions-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0010 ), "NumberOfPoints-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0020 ), "TypeOfData-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0022 ), "CurveDescription-RET", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0030 ), "AxisUnits-RET", "SH" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0040 ), "AxisLabels-RET", "SH" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0103 ), "DataValueRepresentation-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0104 ), "MinimumCoordinateValue-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0105 ), "MaximumCoordinateValue-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0106 ), "CurveRange-RET", "SH" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0110 ), "CurveDataDescriptor-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0112 ), "CoordinateStartValue-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x0114 ), "CoordinateStepValue-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x1001 ), "CurveActivationLayer-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2000 ), "AudioType-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2002 ), "AudioSampleFormat-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2004 ), "NumberOfChannels-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2006 ), "NumberOfSamples-RET", "UL" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2008 ), "SampleRate-RET", "UL" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x200A ), "TotalTime-RET", "UL" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x200C ), "AudioSampleData-RET", "OW or OB" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x200E ), "AudioComments-RET", "LT" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2500 ), "CurveLabel-RET", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2600 ), "CurveReferencedOverlaySequence-RET", "SQ" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x2610 ), "CurveReferencedOverlayGroup-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x50xx, 0x3000 ), "CurveData-RET", "OW or OB" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0012 ), "OverlayPlanes-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0052 ), "OverlayPlaneOrigin-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0060 ), "OverlayCompressionCode-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0061 ), "OverlayCompressionOriginator-RET", "SH" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0062 ), "OverlayCompressionLabel-RET", "SH" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0063 ), "OverlayCompressionDescription-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0066 ), "OverlayCompressionStepPointers-RET", "AT" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0068 ), "OverlayRepeatInterval-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0069 ), "OverlayBitsGrouped-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0110 ), "OverlayFormat-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0200 ), "OverlayLocation-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0800 ), "OverlayCodeLabel-RET", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0802 ), "OverlayNumberOfTables-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0803 ), "OverlayCodeTableLocation-RET", "AT" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0804 ), "OverlayBitsForCodeWord-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1100 ), "OverlayDescriptorGray-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1101 ), "OverlayDescriptorRed-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1102 ), "OverlayDescriptorGreen-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1103 ), "OverlayDescriptorBlue-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1200 ), "OverlaysGray-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1201 ), "OverlaysRed-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1202 ), "OverlaysGreen-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1203 ), "OverlaysBlue-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x4000 ), "OverlayComments-RET", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x7FE0, 0x0020 ), "CoefficientsSDVN-RET", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x7FE0, 0x0030 ), "CoefficientsSDHN-RET", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x7FE0, 0x0040 ), "CoefficientsSDDN-RET", "OW" )); //mAddEntry (DicomElement ( DicomTag ( 0x7Fxx, 0x0010 ), "VariablePixelData-RET", "OW or OB" )); //mAddEntry (DicomElement ( DicomTag ( 0x7Fxx, 0x0011 ), "VariableNextDataGroup-RET", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x7Fxx, 0x0020 ), "VariableCoefficientsSDVN-RET", "OW" )); //mAddEntry (DicomElement ( DicomTag ( 0x7Fxx, 0x0030 ), "VariableCoefficientsSDHN-RET", "OW" )); //mAddEntry (DicomElement ( DicomTag ( 0x7Fxx, 0x0040 ), "VariableCoefficientsSDDN-RET", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0100, 0x0410 ), "SOPInstanceStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0100, 0x0420 ), "SOPAuthorizationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0100, 0x0424 ), "SOPAuthorizationComment", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0100, 0x0426 ), "AuthorizationEquipmentCertificationNumber", "LO" )); //==Duplicate mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0000 ), "FileMetaInformationGroupLength", "UL" )); //mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0000 ), "MfGroupLength", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0001 ), "FileMetaInformationVersion", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0002 ), "MediaStorageSOPClassUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0003 ), "MediaStorageSOPInstanceUID", "UI" )); //==Duplicate mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0010 ), "TransferSyntaxUID", "UI" )); //mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0010 ), "MfTransferSyntax", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0012 ), "ImplementationClassUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0013 ), "ImplementationVersionName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0016 ), "SourceApplicationEntityTitle", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0100 ), "PrivateInformationCreatorUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0002, 0x0102 ), "PrivateInformation", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0005 ), "MACIDNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0010 ), "MACCalculationTransferSyntaxUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0015 ), "MACAlgorithm", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0020 ), "DataElementsSigned", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0100 ), "DigitalSignatureUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0105 ), "DigitalSignatureDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0110 ), "CertificateType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0115 ), "CertificateOfSigner", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0120 ), "Signature", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0305 ), "CertifiedTimestampType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0310 ), "CertifiedTimestamp", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0401 ), "DigitalSignaturePurposeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0402 ), "ReferencedDigitalSignatureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0403 ), "ReferencedSOPInstanceMACSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0404 ), "MAC", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0500 ), "EncryptedAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0510 ), "EncryptedContentTransferSyntaxUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0520 ), "EncryptedContent", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0550 ), "ModifiedAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0561 ), "OriginalAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0562 ), "AttributeModificationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0563 ), "ModifyingSystem", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0564 ), "SourceOfPreviousValues", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0400, 0x0565 ), "ReasonForTheAttributeModification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1130 ), "FileSetID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1141 ), "FileSetDescriptorFileID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1142 ), "SpecificCharacterSetOfFileSetDescriptorFile", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1200 ), "OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1202 ), "OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1212 ), "FileSetConsistencyFlag", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1220 ), "DirectoryRecordSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1400 ), "OffsetOfTheNextDirectoryRecord", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1410 ), "RecordInUseFlag", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1420 ), "OffsetOfReferencedLowerLevelDirectoryEntity", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1430 ), "DirectoryRecordType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1432 ), "PrivateRecordUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1500 ), "ReferencedFileID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1510 ), "ReferencedSOPClassUIDInFile", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1511 ), "ReferencedSOPInstanceUIDInFile", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x1512 ), "ReferencedTransferSyntaxUIDInFile", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0004, 0x151A ), "ReferencedRelatedGeneralSOPClassUIDInFile", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0005 ), "SpecificCharacterSet", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0006 ), "LanguageCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0008 ), "ImageType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0012 ), "InstanceCreationDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0013 ), "InstanceCreationTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0014 ), "InstanceCreatorUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0016 ), "SOPClassUID", "UI" )); //==Duplicate mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0018 ), "SOPInstanceUID", "UI" )); //mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0018 ), "SopInstance", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x001A ), "RelatedGeneralSOPClassUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x001B ), "OriginalSpecializedSOPClassUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0020 ), "StudyDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0021 ), "SeriesDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0022 ), "AcquisitionDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0023 ), "ContentDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x002A ), "AcquisitionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0030 ), "StudyTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0031 ), "SeriesTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0032 ), "AcquisitionTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0033 ), "ContentTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0050 ), "AccessionNumber", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0051 ), "IssuerOfAccessionNumberSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0052 ), "QueryRetrieveLevel", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0054 ), "RetrieveAETitle", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0056 ), "InstanceAvailability", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0058 ), "FailedSOPInstanceUIDList", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0060 ), "Modality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0061 ), "ModalitiesInStudy", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0062 ), "SOPClassesInStudy", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0064 ), "ConversionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0068 ), "PresentationIntentType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0070 ), "Manufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0080 ), "InstitutionName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0081 ), "InstitutionAddress", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0082 ), "InstitutionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0090 ), "ReferringPhysicianName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0092 ), "ReferringPhysicianAddress", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0094 ), "ReferringPhysicianTelephoneNumbers", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0096 ), "ReferringPhysicianIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0100 ), "CodeValue", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0102 ), "CodingSchemeDesignator", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0103 ), "CodingSchemeVersion", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0104 ), "CodeMeaning", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0105 ), "MappingResource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0106 ), "ContextGroupVersion", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0107 ), "ContextGroupLocalVersion", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x010B ), "ContextGroupExtensionFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x010C ), "CodingSchemeUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x010D ), "ContextGroupExtensionCreatorUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x010F ), "ContextIdentifier", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0110 ), "CodingSchemeIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0112 ), "CodingSchemeRegistry", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0114 ), "CodingSchemeExternalID", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0115 ), "CodingSchemeName", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0116 ), "CodingSchemeResponsibleOrganization", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0117 ), "ContextUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x0201 ), "TimezoneOffsetFromUTC", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1010 ), "StationName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1030 ), "StudyDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1032 ), "ProcedureCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x103E ), "SeriesDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x103F ), "SeriesDescriptionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1040 ), "InstitutionalDepartmentName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1048 ), "PhysiciansOfRecord", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1049 ), "PhysiciansOfRecordIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1050 ), "PerformingPhysicianName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1052 ), "PerformingPhysicianIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1060 ), "NameOfPhysiciansReadingStudy", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1062 ), "PhysiciansReadingStudyIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1070 ), "OperatorsName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1072 ), "OperatorIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1080 ), "AdmittingDiagnosesDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1084 ), "AdmittingDiagnosesCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1090 ), "ManufacturerModelName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1110 ), "ReferencedStudySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1111 ), "ReferencedPerformedProcedureStepSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1115 ), "ReferencedSeriesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1120 ), "ReferencedPatientSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1125 ), "ReferencedVisitSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1134 ), "ReferencedStereometricInstanceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x113A ), "ReferencedWaveformSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1140 ), "ReferencedImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x114A ), "ReferencedInstanceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x114B ), "ReferencedRealWorldValueMappingInstanceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1150 ), "ReferencedSOPClassUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1155 ), "ReferencedSOPInstanceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x115A ), "SOPClassesSupported", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1160 ), "ReferencedFrameNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1161 ), "SimpleFrameList", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1162 ), "CalculatedFrameList", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1163 ), "TimeRange", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1164 ), "FrameExtractionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1167 ), "MultiFrameSourceSOPInstanceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1195 ), "TransactionUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1197 ), "FailureReason", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1198 ), "FailedSOPSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1199 ), "ReferencedSOPSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1200 ), "StudiesContainingOtherReferencedInstancesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x1250 ), "RelatedSeriesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2111 ), "DerivationDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2112 ), "SourceImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2120 ), "StageName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2122 ), "StageNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2124 ), "NumberOfStages", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2127 ), "ViewName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2128 ), "ViewNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2129 ), "NumberOfEventTimers", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x212A ), "NumberOfViewsInStage", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2130 ), "EventElapsedTimes", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2132 ), "EventTimerNames", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2133 ), "EventTimerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2134 ), "EventTimeOffset", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2135 ), "EventCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2142 ), "StartTrim", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2143 ), "StopTrim", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2144 ), "RecommendedDisplayFrameRate", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2218 ), "AnatomicRegionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2220 ), "AnatomicRegionModifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2228 ), "PrimaryAnatomicStructureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2229 ), "AnatomicStructureSpaceOrRegionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x2230 ), "PrimaryAnatomicStructureModifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x3001 ), "AlternateRepresentationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x3010 ), "IrradiationEventUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9007 ), "FrameType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9092 ), "ReferencedImageEvidenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9121 ), "ReferencedRawDataSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9123 ), "CreatorVersionUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9124 ), "DerivationImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9154 ), "SourceImageEvidenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9205 ), "PixelPresentation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9206 ), "VolumetricProperties", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9207 ), "VolumeBasedCalculationTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9208 ), "ComplexImageComponent", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9209 ), "AcquisitionContrast", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9215 ), "DerivationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9237 ), "ReferencedPresentationStateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9410 ), "ReferencedOtherPlaneSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9458 ), "FrameDisplaySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9459 ), "RecommendedDisplayFrameRateInFloat", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0008, 0x9460 ), "SkipFrameRangeFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0010 ), "PatientName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0020 ), "PatientID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0021 ), "IssuerOfPatientID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0022 ), "TypeOfPatientID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0024 ), "IssuerOfPatientIDQualifiersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0030 ), "PatientBirthDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0032 ), "PatientBirthTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0040 ), "PatientSex", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0050 ), "PatientInsurancePlanCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0101 ), "PatientPrimaryLanguageCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x0102 ), "PatientPrimaryLanguageModifierCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1000 ), "OtherPatientIDs", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1001 ), "OtherPatientNames", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1002 ), "OtherPatientIDsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1005 ), "PatientBirthName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1010 ), "PatientAge", "AS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1020 ), "PatientSize", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1021 ), "PatientSizeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1030 ), "PatientWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1040 ), "PatientAddress", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1060 ), "PatientMotherBirthName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1080 ), "MilitaryRank", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1081 ), "BranchOfService", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x1090 ), "MedicalRecordLocator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2000 ), "MedicalAlerts", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2110 ), "Allergies", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2150 ), "CountryOfResidence", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2152 ), "RegionOfResidence", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2154 ), "PatientTelephoneNumbers", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2160 ), "EthnicGroup", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2180 ), "Occupation", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x21A0 ), "SmokingStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x21B0 ), "AdditionalPatientHistory", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x21C0 ), "PregnancyStatus", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x21D0 ), "LastMenstrualDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x21F0 ), "PatientReligiousPreference", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2201 ), "PatientSpeciesDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2202 ), "PatientSpeciesCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2203 ), "PatientSexNeutered", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2210 ), "AnatomicalOrientationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2292 ), "PatientBreedDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2293 ), "PatientBreedCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2294 ), "BreedRegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2295 ), "BreedRegistrationNumber", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2296 ), "BreedRegistryCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2297 ), "ResponsiblePerson", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2298 ), "ResponsiblePersonRole", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x2299 ), "ResponsibleOrganization", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x4000 ), "PatientComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0010, 0x9431 ), "ExaminedBodyThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0010 ), "ClinicalTrialSponsorName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0020 ), "ClinicalTrialProtocolID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0021 ), "ClinicalTrialProtocolName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0030 ), "ClinicalTrialSiteID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0031 ), "ClinicalTrialSiteName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0040 ), "ClinicalTrialSubjectID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0042 ), "ClinicalTrialSubjectReadingID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0050 ), "ClinicalTrialTimePointID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0051 ), "ClinicalTrialTimePointDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0060 ), "ClinicalTrialCoordinatingCenterName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0062 ), "PatientIdentityRemoved", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0063 ), "DeidentificationMethod", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0064 ), "DeidentificationMethodCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0071 ), "ClinicalTrialSeriesID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0072 ), "ClinicalTrialSeriesDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0081 ), "ClinicalTrialProtocolEthicsCommitteeName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0082 ), "ClinicalTrialProtocolEthicsCommitteeApprovalNumber", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0083 ), "ConsentForClinicalTrialUseSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0084 ), "DistributionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0012, 0x0085 ), "ConsentForDistributionFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0023 ), "CADFileFormat", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0024 ), "ComponentReferenceSystem", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0025 ), "ComponentManufacturingProcedure", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0028 ), "ComponentManufacturer", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0030 ), "MaterialThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0032 ), "MaterialPipeDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0034 ), "MaterialIsolationDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0042 ), "MaterialGrade", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0044 ), "MaterialPropertiesFileID", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0045 ), "MaterialPropertiesFileFormat", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0046 ), "MaterialNotes", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0050 ), "ComponentShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0052 ), "CurvatureType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0054 ), "OuterDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x0056 ), "InnerDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x1010 ), "ActualEnvironmentalConditions", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x1020 ), "ExpiryDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x1040 ), "EnvironmentalConditions", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2002 ), "EvaluatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2004 ), "EvaluatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2006 ), "EvaluatorName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2008 ), "EvaluationAttempt", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2012 ), "IndicationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2014 ), "IndicationNumber ", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2016 ), "IndicationLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2018 ), "IndicationDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x201A ), "IndicationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x201C ), "IndicationDisposition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x201E ), "IndicationROISequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2030 ), "IndicationPhysicalPropertySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2032 ), "PropertyLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2202 ), "CoordinateSystemNumberOfAxes ", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2204 ), "CoordinateSystemAxesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2206 ), "CoordinateSystemAxisDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2208 ), "CoordinateSystemDataSetMapping", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x220A ), "CoordinateSystemAxisNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x220C ), "CoordinateSystemAxisType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x220E ), "CoordinateSystemAxisUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2210 ), "CoordinateSystemAxisValues", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2220 ), "CoordinateSystemTransformSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2222 ), "TransformDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2224 ), "TransformNumberOfAxes", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2226 ), "TransformOrderOfAxes", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x2228 ), "TransformedAxisUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x222A ), "CoordinateSystemTransformRotationAndScaleMatrix", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x222C ), "CoordinateSystemTransformTranslationMatrix", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3011 ), "InternalDetectorFrameTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3012 ), "NumberOfFramesIntegrated", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3020 ), "DetectorTemperatureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3022 ), "SensorName", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3024 ), "HorizontalOffsetOfSensor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3026 ), "VerticalOffsetOfSensor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3028 ), "SensorTemperature", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3040 ), "DarkCurrentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3050 ), "DarkCurrentCounts", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3060 ), "GainCorrectionReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3070 ), "AirCounts", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3071 ), "KVUsedInGainCalibration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3072 ), "MAUsedInGainCalibration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3073 ), "NumberOfFramesUsedForIntegration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3074 ), "FilterMaterialUsedInGainCalibration", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3075 ), "FilterThicknessUsedInGainCalibration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3076 ), "DateOfGainCalibration", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3077 ), "TimeOfGainCalibration", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3080 ), "BadPixelImage", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x3099 ), "CalibrationNotes", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4002 ), "PulserEquipmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4004 ), "PulserType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4006 ), "PulserNotes", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4008 ), "ReceiverEquipmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x400A ), "AmplifierType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x400C ), "ReceiverNotes", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x400E ), "PreAmplifierEquipmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x400F ), "PreAmplifierNotes", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4010 ), "TransmitTransducerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4011 ), "ReceiveTransducerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4012 ), "NumberOfElements", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4013 ), "ElementShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4014 ), "ElementDimensionA", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4015 ), "ElementDimensionB", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4016 ), "ElementPitch", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4017 ), "MeasuredBeamDimensionA", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4018 ), "MeasuredBeamDimensionB", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4019 ), "LocationOfMeasuredBeamDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x401A ), "NominalFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x401B ), "MeasuredCenterFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x401C ), "MeasuredBandwidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4020 ), "PulserSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4022 ), "PulseWidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4024 ), "ExcitationFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4026 ), "ModulationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4028 ), "Damping", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4030 ), "ReceiverSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4031 ), "AcquiredSoundpathLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4032 ), "AcquisitionCompressionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4033 ), "AcquisitionSampleSize", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4034 ), "RectifierSmoothing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4035 ), "DACSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4036 ), "DACType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4038 ), "DACGainPoints", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x403A ), "DACTimePoints", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x403C ), "DACAmplitude", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4040 ), "PreAmplifierSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4050 ), "TransmitTransducerSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4051 ), "ReceiveTransducerSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4052 ), "IncidentAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4054 ), "CouplingTechnique", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4056 ), "CouplingMedium", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4057 ), "CouplingVelocity", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4058 ), "CrystalCenterLocationX", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4059 ), "CrystalCenterLocationZ", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x405A ), "SoundPathLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x405C ), "DelayLawIdentifier", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4060 ), "GateSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4062 ), "GateThreshold", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4064 ), "VelocityOfSound", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4070 ), "CalibrationSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4072 ), "CalibrationProcedure", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4074 ), "ProcedureVersion", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4076 ), "ProcedureCreationDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x4078 ), "ProcedureExpirationDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x407A ), "ProcedureLastModifiedDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x407C ), "CalibrationTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x407E ), "CalibrationDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x5002 ), "LINACEnergy", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0014, 0x5004 ), "LINACOutput", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0010 ), "ContrastBolusAgent", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0012 ), "ContrastBolusAgentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0014 ), "ContrastBolusAdministrationRouteSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0015 ), "BodyPartExamined", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0020 ), "ScanningSequence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0021 ), "SequenceVariant", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0022 ), "ScanOptions", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0023 ), "MRAcquisitionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0024 ), "SequenceName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0025 ), "AngioFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0026 ), "InterventionDrugInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0027 ), "InterventionDrugStopTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0028 ), "InterventionDrugDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0029 ), "InterventionDrugCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x002A ), "AdditionalDrugSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0031 ), "Radiopharmaceutical", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0034 ), "InterventionDrugName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0035 ), "InterventionDrugStartTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0036 ), "InterventionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0038 ), "InterventionStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x003A ), "InterventionDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0040 ), "CineRate", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0042 ), "InitialCineRunState", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0050 ), "SliceThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0060 ), "KVP", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0070 ), "CountsAccumulated", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0071 ), "AcquisitionTerminationCondition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0072 ), "EffectiveDuration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0073 ), "AcquisitionStartCondition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0074 ), "AcquisitionStartConditionData", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0075 ), "AcquisitionTerminationConditionData", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0080 ), "RepetitionTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0081 ), "EchoTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0082 ), "InversionTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0083 ), "NumberOfAverages", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0084 ), "ImagingFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0085 ), "ImagedNucleus", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0086 ), "EchoNumbers", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0087 ), "MagneticFieldStrength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0088 ), "SpacingBetweenSlices", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0089 ), "NumberOfPhaseEncodingSteps", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0090 ), "DataCollectionDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0091 ), "EchoTrainLength", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0093 ), "PercentSampling", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0094 ), "PercentPhaseFieldOfView", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x0095 ), "PixelBandwidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1000 ), "DeviceSerialNumber", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1002 ), "DeviceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1003 ), "DeviceID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1004 ), "PlateID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1005 ), "GeneratorID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1006 ), "GridID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1007 ), "CassetteID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1008 ), "GantryID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1010 ), "SecondaryCaptureDeviceID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1012 ), "DateOfSecondaryCapture", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1014 ), "TimeOfSecondaryCapture", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1016 ), "SecondaryCaptureDeviceManufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1018 ), "SecondaryCaptureDeviceManufacturerModelName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1019 ), "SecondaryCaptureDeviceSoftwareVersions", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1020 ), "SoftwareVersions", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1022 ), "VideoImageFormatAcquired", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1023 ), "DigitalImageFormatAcquired", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1030 ), "ProtocolName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1040 ), "ContrastBolusRoute", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1041 ), "ContrastBolusVolume", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1042 ), "ContrastBolusStartTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1043 ), "ContrastBolusStopTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1044 ), "ContrastBolusTotalDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1045 ), "SyringeCounts", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1046 ), "ContrastFlowRate", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1047 ), "ContrastFlowDuration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1048 ), "ContrastBolusIngredient", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1049 ), "ContrastBolusIngredientConcentration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1050 ), "SpatialResolution", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1060 ), "TriggerTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1061 ), "TriggerSourceOrType", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1062 ), "NominalInterval", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1063 ), "FrameTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1064 ), "CardiacFramingType", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1065 ), "FrameTimeVector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1066 ), "FrameDelay", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1067 ), "ImageTriggerDelay", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1068 ), "MultiplexGroupTimeOffset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1069 ), "TriggerTimeOffset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x106A ), "SynchronizationTrigger", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x106C ), "SynchronizationChannel", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x106E ), "TriggerSamplePosition", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1070 ), "RadiopharmaceuticalRoute", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1071 ), "RadiopharmaceuticalVolume", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1072 ), "RadiopharmaceuticalStartTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1073 ), "RadiopharmaceuticalStopTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1074 ), "RadionuclideTotalDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1075 ), "RadionuclideHalfLife", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1076 ), "RadionuclidePositronFraction", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1077 ), "RadiopharmaceuticalSpecificActivity", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1078 ), "RadiopharmaceuticalStartDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1079 ), "RadiopharmaceuticalStopDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1080 ), "BeatRejectionFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1081 ), "LowRRValue", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1082 ), "HighRRValue", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1083 ), "IntervalsAcquired", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1084 ), "IntervalsRejected", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1085 ), "PVCRejection", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1086 ), "SkipBeats", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1088 ), "HeartRate", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1090 ), "CardiacNumberOfImages", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1094 ), "TriggerWindow", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1100 ), "ReconstructionDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1110 ), "DistanceSourceToDetector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1111 ), "DistanceSourceToPatient", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1114 ), "EstimatedRadiographicMagnificationFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1120 ), "GantryDetectorTilt", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1121 ), "GantryDetectorSlew", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1130 ), "TableHeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1131 ), "TableTraverse", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1134 ), "TableMotion", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1135 ), "TableVerticalIncrement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1136 ), "TableLateralIncrement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1137 ), "TableLongitudinalIncrement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1138 ), "TableAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x113A ), "TableType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1140 ), "RotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1142 ), "RadialPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1143 ), "ScanArc", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1144 ), "AngularStep", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1145 ), "CenterOfRotationOffset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1147 ), "FieldOfViewShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1149 ), "FieldOfViewDimensions", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1150 ), "ExposureTime", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1151 ), "XRayTubeCurrent", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1152 ), "Exposure", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1153 ), "ExposureInuAs", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1154 ), "AveragePulseWidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1155 ), "RadiationSetting", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1156 ), "RectificationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x115A ), "RadiationMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x115E ), "ImageAndFluoroscopyAreaDoseProduct", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1160 ), "FilterType", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1161 ), "TypeOfFilters", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1162 ), "IntensifierSize", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1164 ), "ImagerPixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1166 ), "Grid", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1170 ), "GeneratorPower", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1180 ), "CollimatorGridName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1181 ), "CollimatorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1182 ), "FocalDistance", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1183 ), "XFocusCenter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1184 ), "YFocusCenter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1190 ), "FocalSpots", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1191 ), "AnodeTargetMaterial", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x11A0 ), "BodyPartThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x11A2 ), "CompressionForce", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1200 ), "DateOfLastCalibration", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1201 ), "TimeOfLastCalibration", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1210 ), "ConvolutionKernel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1242 ), "ActualFrameDuration", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1243 ), "CountRate", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1244 ), "PreferredPlaybackSequencing", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1250 ), "ReceiveCoilName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1251 ), "TransmitCoilName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1260 ), "PlateType", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1261 ), "PhosphorType", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1300 ), "ScanVelocity", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1301 ), "WholeBodyTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1302 ), "ScanLength", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1310 ), "AcquisitionMatrix", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1312 ), "InPlanePhaseEncodingDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1314 ), "FlipAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1315 ), "VariableFlipAngleFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1316 ), "SAR", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1318 ), "dBdt", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1400 ), "AcquisitionDeviceProcessingDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1401 ), "AcquisitionDeviceProcessingCode", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1402 ), "CassetteOrientation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1403 ), "CassetteSize", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1404 ), "ExposuresOnPlate", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1405 ), "RelativeXRayExposure", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1411 ), "ExposureIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1412 ), "TargetExposureIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1413 ), "DeviationIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1450 ), "ColumnAngulation", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1460 ), "TomoLayerHeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1470 ), "TomoAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1480 ), "TomoTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1490 ), "TomoType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1491 ), "TomoClass", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1495 ), "NumberOfTomosynthesisSourceImages", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1500 ), "PositionerMotion", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1508 ), "PositionerType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1510 ), "PositionerPrimaryAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1511 ), "PositionerSecondaryAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1520 ), "PositionerPrimaryAngleIncrement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1521 ), "PositionerSecondaryAngleIncrement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1530 ), "DetectorPrimaryAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1531 ), "DetectorSecondaryAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1600 ), "ShutterShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1602 ), "ShutterLeftVerticalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1604 ), "ShutterRightVerticalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1606 ), "ShutterUpperHorizontalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1608 ), "ShutterLowerHorizontalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1610 ), "CenterOfCircularShutter", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1612 ), "RadiusOfCircularShutter", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1620 ), "VerticesOfThePolygonalShutter", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1622 ), "ShutterPresentationValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1623 ), "ShutterOverlayGroup", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1624 ), "ShutterPresentationColorCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1700 ), "CollimatorShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1702 ), "CollimatorLeftVerticalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1704 ), "CollimatorRightVerticalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1706 ), "CollimatorUpperHorizontalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1708 ), "CollimatorLowerHorizontalEdge", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1710 ), "CenterOfCircularCollimator", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1712 ), "RadiusOfCircularCollimator", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1720 ), "VerticesOfThePolygonalCollimator", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1800 ), "AcquisitionTimeSynchronized", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1801 ), "TimeSource", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1802 ), "TimeDistributionProtocol", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x1803 ), "NTPSourceAddress", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2001 ), "PageNumberVector", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2002 ), "FrameLabelVector", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2003 ), "FramePrimaryAngleVector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2004 ), "FrameSecondaryAngleVector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2005 ), "SliceLocationVector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2006 ), "DisplayWindowLabelVector", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2010 ), "NominalScannedPixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2020 ), "DigitizingDeviceTransportDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x2030 ), "RotationOfScannedFilm", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x3100 ), "IVUSAcquisition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x3101 ), "IVUSPullbackRate", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x3102 ), "IVUSGatedRate", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x3103 ), "IVUSPullbackStartFrameNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x3104 ), "IVUSPullbackStopFrameNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x3105 ), "LesionNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5000 ), "OutputPower", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5010 ), "TransducerData", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5012 ), "FocusDepth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5020 ), "ProcessingFunction", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5022 ), "MechanicalIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5024 ), "BoneThermalIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5026 ), "CranialThermalIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5027 ), "SoftTissueThermalIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5028 ), "SoftTissueFocusThermalIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5029 ), "SoftTissueSurfaceThermalIndex", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5050 ), "DepthOfScanField", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5100 ), "PatientPosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5101 ), "ViewPosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x5104 ), "ProjectionEponymousNameCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6000 ), "Sensitivity", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6011 ), "SequenceOfUltrasoundRegions", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6012 ), "RegionSpatialFormat", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6014 ), "RegionDataType", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6016 ), "RegionFlags", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6018 ), "RegionLocationMinX0", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x601A ), "RegionLocationMinY0", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x601C ), "RegionLocationMaxX1", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x601E ), "RegionLocationMaxY1", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6020 ), "ReferencePixelX0", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6022 ), "ReferencePixelY0", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6024 ), "PhysicalUnitsXDirection", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6026 ), "PhysicalUnitsYDirection", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6028 ), "ReferencePixelPhysicalValueX", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x602A ), "ReferencePixelPhysicalValueY", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x602C ), "PhysicalDeltaX", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x602E ), "PhysicalDeltaY", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6030 ), "TransducerFrequency", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6031 ), "TransducerType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6032 ), "PulseRepetitionFrequency", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6034 ), "DopplerCorrectionAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6036 ), "SteeringAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6039 ), "DopplerSampleVolumeXPosition", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x603B ), "DopplerSampleVolumeYPosition", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x603D ), "TMLinePositionX0", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x603F ), "TMLinePositionY0", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6041 ), "TMLinePositionX1", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6043 ), "TMLinePositionY1", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6044 ), "PixelComponentOrganization", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6046 ), "PixelComponentMask", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6048 ), "PixelComponentRangeStart", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x604A ), "PixelComponentRangeStop", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x604C ), "PixelComponentPhysicalUnits", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x604E ), "PixelComponentDataType", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6050 ), "NumberOfTableBreakPoints", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6052 ), "TableOfXBreakPoints", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6054 ), "TableOfYBreakPoints", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6056 ), "NumberOfTableEntries", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6058 ), "TableOfPixelValues", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x605A ), "TableOfParameterValues", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x6060 ), "RWaveTimeVector", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7000 ), "DetectorConditionsNominalFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7001 ), "DetectorTemperature", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7004 ), "DetectorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7005 ), "DetectorConfiguration", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7006 ), "DetectorDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7008 ), "DetectorMode", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x700A ), "DetectorID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x700C ), "DateOfLastDetectorCalibration", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x700E ), "TimeOfLastDetectorCalibration", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7010 ), "ExposuresOnDetectorSinceLastCalibration", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7011 ), "ExposuresOnDetectorSinceManufactured", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7012 ), "DetectorTimeSinceLastExposure", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7014 ), "DetectorActiveTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7016 ), "DetectorActivationOffsetFromExposure", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x701A ), "DetectorBinning", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7020 ), "DetectorElementPhysicalSize", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7022 ), "DetectorElementSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7024 ), "DetectorActiveShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7026 ), "DetectorActiveDimensions", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7028 ), "DetectorActiveOrigin", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x702A ), "DetectorManufacturerName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x702B ), "DetectorManufacturerModelName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7030 ), "FieldOfViewOrigin", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7032 ), "FieldOfViewRotation", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7034 ), "FieldOfViewHorizontalFlip", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7036 ), "PixelDataAreaOriginRelativeToFOV", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7038 ), "PixelDataAreaRotationAngleRelativeToFOV", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7040 ), "GridAbsorbingMaterial", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7041 ), "GridSpacingMaterial", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7042 ), "GridThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7044 ), "GridPitch", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7046 ), "GridAspectRatio", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7048 ), "GridPeriod", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x704C ), "GridFocalDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7050 ), "FilterMaterial", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7052 ), "FilterThicknessMinimum", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7054 ), "FilterThicknessMaximum", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7056 ), "FilterBeamPathLengthMinimum", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7058 ), "FilterBeamPathLengthMaximum", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7060 ), "ExposureControlMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7062 ), "ExposureControlModeDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7064 ), "ExposureStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x7065 ), "PhototimerSetting", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x8150 ), "ExposureTimeInuS", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x8151 ), "XRayTubeCurrentInuA", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9004 ), "ContentQualification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9005 ), "PulseSequenceName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9006 ), "MRImagingModifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9008 ), "EchoPulseSequence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9009 ), "InversionRecovery", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9010 ), "FlowCompensation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9011 ), "MultipleSpinEcho", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9012 ), "MultiPlanarExcitation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9014 ), "PhaseContrast", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9015 ), "TimeOfFlightContrast", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9016 ), "Spoiling", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9017 ), "SteadyStatePulseSequence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9018 ), "EchoPlanarPulseSequence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9019 ), "TagAngleFirstAxis", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9020 ), "MagnetizationTransfer", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9021 ), "T2Preparation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9022 ), "BloodSignalNulling", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9024 ), "SaturationRecovery", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9025 ), "SpectrallySelectedSuppression", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9026 ), "SpectrallySelectedExcitation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9027 ), "SpatialPresaturation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9028 ), "Tagging", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9029 ), "OversamplingPhase", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9030 ), "TagSpacingFirstDimension", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9032 ), "GeometryOfKSpaceTraversal", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9033 ), "SegmentedKSpaceTraversal", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9034 ), "RectilinearPhaseEncodeReordering", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9035 ), "TagThickness", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9036 ), "PartialFourierDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9037 ), "CardiacSynchronizationTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9041 ), "ReceiveCoilManufacturerName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9042 ), "MRReceiveCoilSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9043 ), "ReceiveCoilType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9044 ), "QuadratureReceiveCoil", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9045 ), "MultiCoilDefinitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9046 ), "MultiCoilConfiguration", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9047 ), "MultiCoilElementName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9048 ), "MultiCoilElementUsed", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9049 ), "MRTransmitCoilSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9050 ), "TransmitCoilManufacturerName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9051 ), "TransmitCoilType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9052 ), "SpectralWidth", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9053 ), "ChemicalShiftReference", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9054 ), "VolumeLocalizationTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9058 ), "MRAcquisitionFrequencyEncodingSteps", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9059 ), "Decoupling", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9060 ), "DecoupledNucleus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9061 ), "DecouplingFrequency", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9062 ), "DecouplingMethod", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9063 ), "DecouplingChemicalShiftReference", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9064 ), "KSpaceFiltering", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9065 ), "TimeDomainFiltering", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9066 ), "NumberOfZeroFills", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9067 ), "BaselineCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9069 ), "ParallelReductionFactorInPlane", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9070 ), "CardiacRRIntervalSpecified", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9073 ), "AcquisitionDuration", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9074 ), "FrameAcquisitionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9075 ), "DiffusionDirectionality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9076 ), "DiffusionGradientDirectionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9077 ), "ParallelAcquisition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9078 ), "ParallelAcquisitionTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9079 ), "InversionTimes", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9080 ), "MetaboliteMapDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9081 ), "PartialFourier", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9082 ), "EffectiveEchoTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9083 ), "MetaboliteMapCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9084 ), "ChemicalShiftSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9085 ), "CardiacSignalSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9087 ), "DiffusionBValue", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9089 ), "DiffusionGradientOrientation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9090 ), "VelocityEncodingDirection", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9091 ), "VelocityEncodingMinimumValue", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9092 ), "VelocityEncodingAcquisitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9093 ), "NumberOfKSpaceTrajectories", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9094 ), "CoverageOfKSpace", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9095 ), "SpectroscopyAcquisitionPhaseRows", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9098 ), "TransmitterFrequency", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9100 ), "ResonantNucleus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9101 ), "FrequencyCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9103 ), "MRSpectroscopyFOVGeometrySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9104 ), "SlabThickness", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9105 ), "SlabOrientation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9106 ), "MidSlabPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9107 ), "MRSpatialSaturationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9112 ), "MRTimingAndRelatedParametersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9114 ), "MREchoSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9115 ), "MRModifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9117 ), "MRDiffusionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9118 ), "CardiacSynchronizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9119 ), "MRAveragesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9125 ), "MRFOVGeometrySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9126 ), "VolumeLocalizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9127 ), "SpectroscopyAcquisitionDataColumns", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9147 ), "DiffusionAnisotropyType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9151 ), "FrameReferenceDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9152 ), "MRMetaboliteMapSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9155 ), "ParallelReductionFactorOutOfPlane", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9159 ), "SpectroscopyAcquisitionOutOfPlanePhaseSteps", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9168 ), "ParallelReductionFactorSecondInPlane", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9169 ), "CardiacBeatRejectionTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9170 ), "RespiratoryMotionCompensationTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9171 ), "RespiratorySignalSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9172 ), "BulkMotionCompensationTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9173 ), "BulkMotionSignalSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9174 ), "ApplicableSafetyStandardAgency", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9175 ), "ApplicableSafetyStandardDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9176 ), "OperatingModeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9177 ), "OperatingModeType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9178 ), "OperatingMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9179 ), "SpecificAbsorptionRateDefinition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9180 ), "GradientOutputType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9181 ), "SpecificAbsorptionRateValue", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9182 ), "GradientOutput", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9183 ), "FlowCompensationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9184 ), "TaggingDelay", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9185 ), "RespiratoryMotionCompensationTechniqueDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9186 ), "RespiratorySignalSourceID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9197 ), "MRVelocityEncodingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9198 ), "FirstOrderPhaseCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9199 ), "WaterReferencedPhaseCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9200 ), "MRSpectroscopyAcquisitionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9214 ), "RespiratoryCyclePosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9217 ), "VelocityEncodingMaximumValue", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9218 ), "TagSpacingSecondDimension", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9219 ), "TagAngleSecondAxis", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9220 ), "FrameAcquisitionDuration", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9226 ), "MRImageFrameTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9227 ), "MRSpectroscopyFrameTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9231 ), "MRAcquisitionPhaseEncodingStepsInPlane", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9232 ), "MRAcquisitionPhaseEncodingStepsOutOfPlane", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9234 ), "SpectroscopyAcquisitionPhaseColumns", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9236 ), "CardiacCyclePosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9239 ), "SpecificAbsorptionRateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9240 ), "RFEchoTrainLength", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9241 ), "GradientEchoTrainLength", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9250 ), "ArterialSpinLabelingContrast", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9251 ), "MRArterialSpinLabelingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9252 ), "ASLTechniqueDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9253 ), "ASLSlabNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9254 ), "ASLSlabThickness", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9255 ), "ASLSlabOrientation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9256 ), "ASLMidSlabPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9257 ), "ASLContext", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9258 ), "ASLPulseTrainDuration", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9259 ), "ASLCrusherFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x925A ), "ASLCrusherFlow", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x925B ), "ASLCrusherDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x925C ), "ASLBolusCutoffFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x925D ), "ASLBolusCutoffTimingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x925E ), "ASLBolusCutoffTechnique", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x925F ), "ASLBolusCutoffDelayTime", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9260 ), "ASLSlabSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9295 ), "ChemicalShiftMinimumIntegrationLimitInppm", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9296 ), "ChemicalShiftMaximumIntegrationLimitInppm", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9301 ), "CTAcquisitionTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9302 ), "AcquisitionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9303 ), "TubeAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9304 ), "CTAcquisitionDetailsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9305 ), "RevolutionTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9306 ), "SingleCollimationWidth", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9307 ), "TotalCollimationWidth", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9308 ), "CTTableDynamicsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9309 ), "TableSpeed", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9310 ), "TableFeedPerRotation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9311 ), "SpiralPitchFactor", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9312 ), "CTGeometrySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9313 ), "DataCollectionCenterPatient", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9314 ), "CTReconstructionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9315 ), "ReconstructionAlgorithm", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9316 ), "ConvolutionKernelGroup", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9317 ), "ReconstructionFieldOfView", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9318 ), "ReconstructionTargetCenterPatient", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9319 ), "ReconstructionAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9320 ), "ImageFilter", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9321 ), "CTExposureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9322 ), "ReconstructionPixelSpacing", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9323 ), "ExposureModulationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9324 ), "EstimatedDoseSaving", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9325 ), "CTXRayDetailsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9326 ), "CTPositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9327 ), "TablePosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9328 ), "ExposureTimeInms", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9329 ), "CTImageFrameTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9330 ), "XRayTubeCurrentInmA", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9332 ), "ExposureInmAs", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9333 ), "ConstantVolumeFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9334 ), "FluoroscopyFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9335 ), "DistanceSourceToDataCollectionCenter", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9337 ), "ContrastBolusAgentNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9338 ), "ContrastBolusIngredientCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9340 ), "ContrastAdministrationProfileSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9341 ), "ContrastBolusUsageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9342 ), "ContrastBolusAgentAdministered", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9343 ), "ContrastBolusAgentDetected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9344 ), "ContrastBolusAgentPhase", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9345 ), "CTDIvol", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9346 ), "CTDIPhantomTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9351 ), "CalciumScoringMassFactorPatient", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9352 ), "CalciumScoringMassFactorDevice", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9353 ), "EnergyWeightingFactor", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9360 ), "CTAdditionalXRaySourceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9401 ), "ProjectionPixelCalibrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9402 ), "DistanceSourceToIsocenter", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9403 ), "DistanceObjectToTableTop", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9404 ), "ObjectPixelSpacingInCenterOfBeam", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9405 ), "PositionerPositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9406 ), "TablePositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9407 ), "CollimatorShapeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9410 ), "PlanesInAcquisition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9412 ), "XAXRFFrameCharacteristicsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9417 ), "FrameAcquisitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9420 ), "XRayReceptorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9423 ), "AcquisitionProtocolName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9424 ), "AcquisitionProtocolDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9425 ), "ContrastBolusIngredientOpaque", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9426 ), "DistanceReceptorPlaneToDetectorHousing", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9427 ), "IntensifierActiveShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9428 ), "IntensifierActiveDimensions", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9429 ), "PhysicalDetectorSize", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9430 ), "PositionOfIsocenterProjection", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9432 ), "FieldOfViewSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9433 ), "FieldOfViewDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9434 ), "ExposureControlSensingRegionsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9435 ), "ExposureControlSensingRegionShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9436 ), "ExposureControlSensingRegionLeftVerticalEdge", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9437 ), "ExposureControlSensingRegionRightVerticalEdge", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9438 ), "ExposureControlSensingRegionUpperHorizontalEdge", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9439 ), "ExposureControlSensingRegionLowerHorizontalEdge", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9440 ), "CenterOfCircularExposureControlSensingRegion", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9441 ), "RadiusOfCircularExposureControlSensingRegion", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9442 ), "VerticesOfThePolygonalExposureControlSensingRegion", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9447 ), "ColumnAngulationPatient", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9449 ), "BeamAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9451 ), "FrameDetectorParametersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9452 ), "CalculatedAnatomyThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9455 ), "CalibrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9456 ), "ObjectThicknessSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9457 ), "PlaneIdentification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9461 ), "FieldOfViewDimensionsInFloat", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9462 ), "IsocenterReferenceSystemSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9463 ), "PositionerIsocenterPrimaryAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9464 ), "PositionerIsocenterSecondaryAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9465 ), "PositionerIsocenterDetectorRotationAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9466 ), "TableXPositionToIsocenter", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9467 ), "TableYPositionToIsocenter", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9468 ), "TableZPositionToIsocenter", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9469 ), "TableHorizontalRotationAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9470 ), "TableHeadTiltAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9471 ), "TableCradleTiltAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9472 ), "FrameDisplayShutterSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9473 ), "AcquiredImageAreaDoseProduct", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9474 ), "CArmPositionerTabletopRelationship", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9476 ), "XRayGeometrySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9477 ), "IrradiationEventIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9504 ), "XRay3DFrameTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9506 ), "ContributingSourcesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9507 ), "XRay3DAcquisitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9508 ), "PrimaryPositionerScanArc", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9509 ), "SecondaryPositionerScanArc", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9510 ), "PrimaryPositionerScanStartAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9511 ), "SecondaryPositionerScanStartAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9514 ), "PrimaryPositionerIncrement", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9515 ), "SecondaryPositionerIncrement", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9516 ), "StartAcquisitionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9517 ), "EndAcquisitionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9524 ), "ApplicationName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9525 ), "ApplicationVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9526 ), "ApplicationManufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9527 ), "AlgorithmType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9528 ), "AlgorithmDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9530 ), "XRay3DReconstructionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9531 ), "ReconstructionDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9538 ), "PerProjectionAcquisitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9601 ), "DiffusionBMatrixSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9602 ), "DiffusionBValueXX", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9603 ), "DiffusionBValueXY", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9604 ), "DiffusionBValueXZ", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9605 ), "DiffusionBValueYY", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9606 ), "DiffusionBValueYZ", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9607 ), "DiffusionBValueZZ", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9701 ), "DecayCorrectionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9715 ), "StartDensityThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9716 ), "StartRelativeDensityDifferenceThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9717 ), "StartCardiacTriggerCountThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9718 ), "StartRespiratoryTriggerCountThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9719 ), "TerminationCountsThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9720 ), "TerminationDensityThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9721 ), "TerminationRelativeDensityThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9722 ), "TerminationTimeThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9723 ), "TerminationCardiacTriggerCountThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9724 ), "TerminationRespiratoryTriggerCountThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9725 ), "DetectorGeometry", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9726 ), "TransverseDetectorSeparation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9727 ), "AxialDetectorDimension", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9729 ), "RadiopharmaceuticalAgentNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9732 ), "PETFrameAcquisitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9733 ), "PETDetectorMotionDetailsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9734 ), "PETTableDynamicsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9735 ), "PETPositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9736 ), "PETFrameCorrectionFactorsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9737 ), "RadiopharmaceuticalUsageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9738 ), "AttenuationCorrectionSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9739 ), "NumberOfIterations", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9740 ), "NumberOfSubsets", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9749 ), "PETReconstructionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9751 ), "PETFrameTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9755 ), "TimeOfFlightInformationUsed", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9756 ), "ReconstructionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9758 ), "DecayCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9759 ), "AttenuationCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9760 ), "ScatterCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9761 ), "DeadTimeCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9762 ), "GantryMotionCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9763 ), "PatientMotionCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9764 ), "CountLossNormalizationCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9765 ), "RandomsCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9766 ), "NonUniformRadialSamplingCorrected", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9767 ), "SensitivityCalibrated", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9768 ), "DetectorNormalizationCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9769 ), "IterativeReconstructionMethod", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9770 ), "AttenuationCorrectionTemporalRelationship", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9771 ), "PatientPhysiologicalStateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9772 ), "PatientPhysiologicalStateCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9801 ), "DepthsOfFocus", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9803 ), "ExcludedIntervalsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9804 ), "ExclusionStartDatetime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9805 ), "ExclusionDuration", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9806 ), "USImageDescriptionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9807 ), "ImageDataTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9808 ), "DataType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x9809 ), "TransducerScanPatternCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x980B ), "AliasedDataType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x980C ), "PositionMeasuringDeviceUsed", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x980D ), "TransducerGeometryCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x980E ), "TransducerBeamSteeringCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0x980F ), "TransducerApplicationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0xA001 ), "ContributingEquipmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0xA002 ), "ContributionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0018, 0xA003 ), "ContributionDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x000D ), "StudyInstanceUID", "UI" )); //==Duplicate mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x000E ), "SeriesInstanceUID", "UI" )); //mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x000E ), "SeriesInstanceUid", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0010 ), "StudyID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0011 ), "SeriesNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0012 ), "AcquisitionNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0013 ), "InstanceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0019 ), "ItemNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0020 ), "PatientOrientation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0032 ), "ImagePositionPatient", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0037 ), "ImageOrientationPatient", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0052 ), "FrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0060 ), "Laterality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0062 ), "ImageLaterality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0100 ), "TemporalPositionIdentifier", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0105 ), "NumberOfTemporalPositions", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0110 ), "TemporalResolution", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0200 ), "SynchronizationFrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x0242 ), "SOPInstanceUIDOfConcatenationSource", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1002 ), "ImagesInAcquisition", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1040 ), "PositionReferenceIndicator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1041 ), "SliceLocation", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1200 ), "NumberOfPatientRelatedStudies", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1202 ), "NumberOfPatientRelatedSeries", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1204 ), "NumberOfPatientRelatedInstances", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1206 ), "NumberOfStudyRelatedSeries", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1208 ), "NumberOfStudyRelatedInstances", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x1209 ), "NumberOfSeriesRelatedInstances", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x4000 ), "ImageComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9056 ), "StackID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9057 ), "InStackPositionNumber", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9071 ), "FrameAnatomySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9072 ), "FrameLaterality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9111 ), "FrameContentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9113 ), "PlanePositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9116 ), "PlaneOrientationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9128 ), "TemporalPositionIndex", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9153 ), "NominalCardiacTriggerDelayTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9154 ), "NominalCardiacTriggerTimePriorToRPeak", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9155 ), "ActualCardiacTriggerTimePriorToRPeak", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9156 ), "FrameAcquisitionNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9157 ), "DimensionIndexValues", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9158 ), "FrameComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9161 ), "ConcatenationUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9162 ), "InConcatenationNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9163 ), "InConcatenationTotalNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9164 ), "DimensionOrganizationUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9165 ), "DimensionIndexPointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9167 ), "FunctionalGroupPointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9213 ), "DimensionIndexPrivateCreator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9221 ), "DimensionOrganizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9222 ), "DimensionIndexSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9228 ), "ConcatenationFrameOffsetNumber", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9238 ), "FunctionalGroupPrivateCreator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9241 ), "NominalPercentageOfCardiacPhase", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9245 ), "NominalPercentageOfRespiratoryPhase", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9246 ), "StartingRespiratoryAmplitude", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9247 ), "StartingRespiratoryPhase", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9248 ), "EndingRespiratoryAmplitude", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9249 ), "EndingRespiratoryPhase", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9250 ), "RespiratoryTriggerType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9251 ), "RRIntervalTimeNominal", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9252 ), "ActualCardiacTriggerDelayTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9253 ), "RespiratorySynchronizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9254 ), "RespiratoryIntervalTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9255 ), "NominalRespiratoryTriggerDelayTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9256 ), "RespiratoryTriggerDelayThreshold", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9257 ), "ActualRespiratoryTriggerDelayTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9301 ), "ImagePositionVolume", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9302 ), "ImageOrientationVolume", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9307 ), "UltrasoundAcquisitionGeometry", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9308 ), "ApexPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9309 ), "VolumeToTransducerMappingMatrix", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x930A ), "VolumeToTableMappingMatrix", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x930C ), "PatientFrameOfReferenceSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x930D ), "TemporalPositionTimeOffset", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x930E ), "PlanePositionVolumeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x930F ), "PlaneOrientationVolumeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9310 ), "TemporalPositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9311 ), "DimensionOrganizationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9312 ), "VolumeFrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9313 ), "TableFrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9421 ), "DimensionDescriptionLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9450 ), "PatientOrientationInFrameSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9453 ), "FrameLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9518 ), "AcquisitionIndex", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9529 ), "ContributingSOPInstancesReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0020, 0x9536 ), "ReconstructionIndex", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0001 ), "LightPathFilterPassThroughWavelength", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0002 ), "LightPathFilterPassBand", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0003 ), "ImagePathFilterPassThroughWavelength", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0004 ), "ImagePathFilterPassBand", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0005 ), "PatientEyeMovementCommanded", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0006 ), "PatientEyeMovementCommandCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0007 ), "SphericalLensPower", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0008 ), "CylinderLensPower", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0009 ), "CylinderAxis", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x000A ), "EmmetropicMagnification", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x000B ), "IntraOcularPressure", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x000C ), "HorizontalFieldOfView", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x000D ), "PupilDilated", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x000E ), "DegreeOfDilation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0010 ), "StereoBaselineAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0011 ), "StereoBaselineDisplacement", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0012 ), "StereoHorizontalPixelOffset", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0013 ), "StereoVerticalPixelOffset", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0014 ), "StereoRotation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0015 ), "AcquisitionDeviceTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0016 ), "IlluminationTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0017 ), "LightPathFilterTypeStackCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0018 ), "ImagePathFilterTypeStackCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0019 ), "LensesCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x001A ), "ChannelDescriptionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x001B ), "RefractiveStateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x001C ), "MydriaticAgentCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x001D ), "RelativeImagePositionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x001E ), "CameraAngleOfView", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0020 ), "StereoPairsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0021 ), "LeftImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0022 ), "RightImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0030 ), "AxialLengthOfTheEye", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0031 ), "OphthalmicFrameLocationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0032 ), "ReferenceCoordinates", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0035 ), "DepthSpatialResolution", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0036 ), "MaximumDepthDistortion", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0037 ), "AlongScanSpatialResolution", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0038 ), "MaximumAlongScanDistortion", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0039 ), "OphthalmicImageOrientation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0041 ), "DepthOfTransverseImage", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0042 ), "MydriaticAgentConcentrationUnitsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0048 ), "AcrossScanSpatialResolution", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0049 ), "MaximumAcrossScanDistortion", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x004E ), "MydriaticAgentConcentration", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0055 ), "IlluminationWaveLength", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0056 ), "IlluminationPower", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0057 ), "IlluminationBandwidth", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x0058 ), "MydriaticAgentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1007 ), "OphthalmicAxialMeasurementsRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1008 ), "OphthalmicAxialMeasurementsLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1010 ), "OphthalmicAxialLengthMeasurementsType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1019 ), "OphthalmicAxialLength", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1024 ), "LensStatusCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1025 ), "VitreousStatusCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1028 ), "IOLFormulaCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1029 ), "IOLFormulaDetail", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1033 ), "KeratometerIndex", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1035 ), "SourceOfOphthalmicAxialLengthCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1037 ), "TargetRefraction", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1039 ), "RefractiveProcedureOccurred", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1040 ), "RefractiveSurgeryTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1044 ), "OphthalmicUltrasoundAxialMeasurementsTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1050 ), "OphthalmicAxialLengthMeasurementsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1053 ), "IOLPower", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1054 ), "PredictedRefractiveError", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1059 ), "OphthalmicAxialLengthVelocity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1065 ), "LensStatusDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1066 ), "VitreousStatusDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1090 ), "IOLPowerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1092 ), "LensConstantSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1093 ), "IOLManufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1094 ), "LensConstantDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1096 ), "KeratometryMeasurementTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1100 ), "ReferencedOphthalmicAxialMeasurementsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1101 ), "OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1103 ), "RefractiveErrorBeforeRefractiveSurgeryCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1121 ), "IOLPowerForExactEmmetropia", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1122 ), "IOLPowerForExactTargetRefraction", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1125 ), "AnteriorChamberDepthDefinitionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1130 ), "LensThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1131 ), "AnteriorChamberDepth", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1132 ), "SourceOfLensThicknessDataCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1133 ), "SourceOfAnteriorChamberDepthDataCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1135 ), "SourceOfRefractiveErrorDataCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1140 ), "OphthalmicAxialLengthMeasurementModified", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1150 ), "OphthalmicAxialLengthDataSourceCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1153 ), "OphthalmicAxialLengthAcquisitionMethodCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1155 ), "SignalToNoiseRatio", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1159 ), "OphthalmicAxialLengthDataSourceDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1210 ), "OphthalmicAxialLengthMeasurementsTotalLengthSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1211 ), "OphthalmicAxialLengthMeasurementsSegmentalLengthSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1212 ), "OphthalmicAxialLengthMeasurementsLengthSummationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1220 ), "UltrasoundOphthalmicAxialLengthMeasurementsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1225 ), "OpticalOphthalmicAxialLengthMeasurementsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1230 ), "UltrasoundSelectedOphthalmicAxialLengthSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1250 ), "OphthalmicAxialLengthSelectionMethodCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1255 ), "OpticalSelectedOphthalmicAxialLengthSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1257 ), "SelectedSegmentalOphthalmicAxialLengthSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1260 ), "SelectedTotalOphthalmicAxialLengthSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1262 ), "OphthalmicAxialLengthQualityMetricSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1273 ), "OphthalmicAxialLengthQualityMetricTypeDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1300 ), "IntraocularLensCalculationsRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1310 ), "IntraocularLensCalculationsLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0022, 0x1330 ), "ReferencedOphthalmicAxialLengthMeasurementQCImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0010 ), "VisualFieldHorizontalExtent", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0011 ), "VisualFieldVerticalExtent", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0012 ), "VisualFieldShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0016 ), "ScreeningTestModeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0018 ), "MaximumStimulusLuminance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0020 ), "BackgroundLuminance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0021 ), "StimulusColorCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0024 ), "BackgroundIlluminationColorCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0025 ), "StimulusArea", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0028 ), "StimulusPresentationTime", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0032 ), "FixationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0033 ), "FixationMonitoringCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0034 ), "VisualFieldCatchTrialSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0035 ), "FixationCheckedQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0036 ), "PatientNotProperlyFixatedQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0037 ), "PresentedVisualStimuliDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0038 ), "NumberOfVisualStimuli", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0039 ), "ExcessiveFixationLossesDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0040 ), "ExcessiveFixationLosses", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0042 ), "StimuliRetestingQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0044 ), "CommentsOnPatientPerformanceOfVisualField", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0045 ), "FalseNegativesEstimateFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0046 ), "FalseNegativesEstimate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0048 ), "NegativeCatchTrialsQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0050 ), "FalseNegativesQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0051 ), "ExcessiveFalseNegativesDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0052 ), "ExcessiveFalseNegatives", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0053 ), "FalsePositivesEstimateFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0054 ), "FalsePositivesEstimate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0055 ), "CatchTrialsDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0056 ), "PositiveCatchTrialsQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0057 ), "TestPointNormalsDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0058 ), "TestPointNormalsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0059 ), "GlobalDeviationProbabilityNormalsFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0060 ), "FalsePositivesQuantity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0061 ), "ExcessiveFalsePositivesDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0062 ), "ExcessiveFalsePositives", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0063 ), "VisualFieldTestNormalsFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0064 ), "ResultsNormalsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0065 ), "AgeCorrectedSensitivityDeviationAlgorithmSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0066 ), "GlobalDeviationFromNormal", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0067 ), "GeneralizedDefectSensitivityDeviationAlgorithmSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0068 ), "LocalizedDeviationfromNormal", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0069 ), "PatientReliabilityIndicator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0070 ), "VisualFieldMeanSensitivity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0071 ), "GlobalDeviationProbability", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0072 ), "LocalDeviationProbabilityNormalsFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0073 ), "LocalizedDeviationProbability", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0074 ), "ShortTermFluctuationCalculated", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0075 ), "ShortTermFluctuation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0076 ), "ShortTermFluctuationProbabilityCalculated", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0077 ), "ShortTermFluctuationProbability", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0078 ), "CorrectedLocalizedDeviationFromNormalCalculated", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0079 ), "CorrectedLocalizedDeviationFromNormal", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0080 ), "CorrectedLocalizedDeviationFromNormalProbabilityCalculated", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0081 ), "CorrectedLocalizedDeviationFromNormalProbability", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0083 ), "GlobalDeviationProbabilitySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0085 ), "LocalizedDeviationProbabilitySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0086 ), "FovealSensitivityMeasured", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0087 ), "FovealSensitivity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0088 ), "VisualFieldTestDuration", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0089 ), "VisualFieldTestPointSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0090 ), "VisualFieldTestPointXCoordinate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0091 ), "VisualFieldTestPointYCoordinate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0092 ), "AgeCorrectedSensitivityDeviationValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0093 ), "StimulusResults", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0094 ), "SensitivityValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0095 ), "RetestStimulusSeen", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0096 ), "RetestSensitivityValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0097 ), "VisualFieldTestPointNormalsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0098 ), "QuantifiedDefect", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0100 ), "AgeCorrectedSensitivityDeviationProbabilityValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0102 ), "GeneralizedDefectCorrectedSensitivityDeviationFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0103 ), "GeneralizedDefectCorrectedSensitivityDeviationValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0104 ), "GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0105 ), "MinimumSensitivityValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0106 ), "BlindSpotLocalized", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0107 ), "BlindSpotXCoordinate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0108 ), "BlindSpotYCoordinate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0110 ), "VisualAcuityMeasurementSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0112 ), "RefractiveParametersUsedOnPatientSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0113 ), "MeasurementLaterality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0114 ), "OphthalmicPatientClinicalInformationLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0115 ), "OphthalmicPatientClinicalInformationRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0117 ), "FovealPointNormativeDataFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0118 ), "FovealPointProbabilityValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0120 ), "ScreeningBaselineMeasured", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0122 ), "ScreeningBaselineMeasuredSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0124 ), "ScreeningBaselineType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0126 ), "ScreeningBaselineValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0202 ), "AlgorithmSource", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0306 ), "DataSetName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0307 ), "DataSetVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0308 ), "DataSetSource", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0309 ), "DataSetDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0317 ), "VisualFieldTestReliabilityGlobalIndexSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0320 ), "VisualFieldGlobalResultsIndexSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0325 ), "DataObservationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0338 ), "IndexNormalsFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0341 ), "IndexProbability", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0024, 0x0344 ), "IndexProbabilitySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0002 ), "SamplesPerPixel", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0003 ), "SamplesPerPixelUsed", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0004 ), "PhotometricInterpretation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0006 ), "PlanarConfiguration", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0008 ), "NumberOfFrames", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0009 ), "FrameIncrementPointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x000A ), "FrameDimensionPointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0010 ), "Rows", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0011 ), "Columns", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0014 ), "UltrasoundColorDataPresent", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0030 ), "PixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0031 ), "ZoomFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0032 ), "ZoomCenter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0034 ), "PixelAspectRatio", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0051 ), "CorrectedImage", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0100 ), "BitsAllocated", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0101 ), "BitsStored", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0102 ), "HighBit", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0103 ), "PixelRepresentation", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0106 ), "SmallestImagePixelValue", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0107 ), "LargestImagePixelValue", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0108 ), "SmallestPixelValueInSeries", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0109 ), "LargestPixelValueInSeries", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0120 ), "PixelPaddingValue", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0121 ), "PixelPaddingRangeLimit", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0300 ), "QualityControlImage", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0301 ), "BurnedInAnnotation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0302 ), "RecognizableVisualFeatures", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0303 ), "LongitudinalTemporalInformationModified", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0A02 ), "PixelSpacingCalibrationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x0A04 ), "PixelSpacingCalibrationDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1040 ), "PixelIntensityRelationship", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1041 ), "PixelIntensityRelationshipSign", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1050 ), "WindowCenter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1051 ), "WindowWidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1052 ), "RescaleIntercept", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1053 ), "RescaleSlope", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1054 ), "RescaleType", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1055 ), "WindowCenterWidthExplanation", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1056 ), "VOILUTFunction", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1090 ), "RecommendedViewingMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1101 ), "RedPaletteColorLookupTableDescriptor", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1102 ), "GreenPaletteColorLookupTableDescriptor", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1103 ), "BluePaletteColorLookupTableDescriptor", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1104 ), "AlphaPaletteColorLookupTableDescriptor", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1199 ), "PaletteColorLookupTableUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1201 ), "RedPaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1202 ), "GreenPaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1203 ), "BluePaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1204 ), "AlphaPaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1221 ), "SegmentedRedPaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1222 ), "SegmentedGreenPaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1223 ), "SegmentedBluePaletteColorLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1300 ), "BreastImplantPresent", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1350 ), "PartialView", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1351 ), "PartialViewDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1352 ), "PartialViewCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x135A ), "SpatialLocationsPreserved", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1401 ), "DataFrameAssignmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1402 ), "DataPathAssignment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1403 ), "BitsMappedToColorLookupTable", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1404 ), "BlendingLUT1Sequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1405 ), "BlendingLUT1TransferFunction", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1406 ), "BlendingWeightConstant", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1407 ), "BlendingLookupTableDescriptor", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1408 ), "BlendingLookupTableData", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x140B ), "EnhancedPaletteColorLookupTableSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x140C ), "BlendingLUT2Sequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x140D ), "BlendingLUT2TransferFunction", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x140E ), "DataPathID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x140F ), "RGBLUTTransferFunction", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x1410 ), "AlphaLUTTransferFunction", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x2000 ), "ICCProfile", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x2110 ), "LossyImageCompression", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x2112 ), "LossyImageCompressionRatio", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x2114 ), "LossyImageCompressionMethod", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3000 ), "ModalityLUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3002 ), "LUTDescriptor", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3003 ), "LUTExplanation", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3004 ), "ModalityLUTType", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3006 ), "LUTData", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3010 ), "VOILUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x3110 ), "SoftcopyVOILUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6010 ), "RepresentativeFrameNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6020 ), "FrameNumbersOfInterest", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6022 ), "FrameOfInterestDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6023 ), "FrameOfInterestType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6040 ), "RWavePointer", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6100 ), "MaskSubtractionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6101 ), "MaskOperation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6102 ), "ApplicableFrameRange", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6110 ), "MaskFrameNumbers", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6112 ), "ContrastFrameAveraging", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6114 ), "MaskSubPixelShift", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6120 ), "TIDOffset", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x6190 ), "MaskOperationExplanation", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x7FE0 ), "PixelDataProviderURL", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9001 ), "DataPointRows", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9002 ), "DataPointColumns", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9003 ), "SignalDomainColumns", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9108 ), "DataRepresentation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9110 ), "PixelMeasuresSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9132 ), "FrameVOILUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9145 ), "PixelValueTransformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9235 ), "SignalDomainRows", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9411 ), "DisplayFilterPercentage", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9415 ), "FramePixelShiftSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9416 ), "SubtractionItemID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9422 ), "PixelIntensityRelationshipLUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9443 ), "FramePixelDataPropertiesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9444 ), "GeometricalProperties", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9445 ), "GeometricMaximumDistortion", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9446 ), "ImageProcessingApplied", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9454 ), "MaskSelectionMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9474 ), "LUTFunction", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9478 ), "MaskVisibilityPercentage", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9501 ), "PixelShiftSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9502 ), "RegionPixelShiftSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9503 ), "VerticesOfTheRegion", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9505 ), "MultiFramePresentationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9506 ), "PixelShiftFrameRange", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9507 ), "LUTFrameRange", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9520 ), "ImageToEquipmentMappingMatrix", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0028, 0x9537 ), "EquipmentCoordinateSystemIdentification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1031 ), "RequestingPhysicianIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1032 ), "RequestingPhysician", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1033 ), "RequestingService", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1034 ), "RequestingServiceCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1060 ), "RequestedProcedureDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1064 ), "RequestedProcedureCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0032, 0x1070 ), "RequestedContrastAgent", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0004 ), "ReferencedPatientAliasSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0008 ), "VisitStatusID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0010 ), "AdmissionID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0014 ), "IssuerOfAdmissionIDSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0016 ), "RouteOfAdmissions", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0020 ), "AdmittingDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0021 ), "AdmittingTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0050 ), "SpecialNeeds", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0060 ), "ServiceEpisodeID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0062 ), "ServiceEpisodeDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0064 ), "IssuerOfServiceEpisodeIDSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0100 ), "PertinentDocumentsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0300 ), "CurrentPatientLocation", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0400 ), "PatientInstitutionResidence", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0500 ), "PatientState", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x0502 ), "PatientClinicalTrialParticipationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0038, 0x4000 ), "VisitComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0004 ), "WaveformOriginality", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0005 ), "NumberOfWaveformChannels", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0010 ), "NumberOfWaveformSamples", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x001A ), "SamplingFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0020 ), "MultiplexGroupLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0200 ), "ChannelDefinitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0202 ), "WaveformChannelNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0203 ), "ChannelLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0205 ), "ChannelStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0208 ), "ChannelSourceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0209 ), "ChannelSourceModifiersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x020A ), "SourceWaveformSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x020C ), "ChannelDerivationDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0210 ), "ChannelSensitivity", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0211 ), "ChannelSensitivityUnitsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0212 ), "ChannelSensitivityCorrectionFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0213 ), "ChannelBaseline", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0214 ), "ChannelTimeSkew", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0215 ), "ChannelSampleSkew", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0218 ), "ChannelOffset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x021A ), "WaveformBitsStored", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0220 ), "FilterLowFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0221 ), "FilterHighFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0222 ), "NotchFilterFrequency", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0223 ), "NotchFilterBandwidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0230 ), "WaveformDataDisplayScale", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0231 ), "WaveformDisplayBackgroundCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0240 ), "WaveformPresentationGroupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0241 ), "PresentationGroupNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0242 ), "ChannelDisplaySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0244 ), "ChannelRecommendedDisplayCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0245 ), "ChannelPosition", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0246 ), "DisplayShadingFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0247 ), "FractionalChannelDisplayScale", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0248 ), "AbsoluteChannelDisplayScale", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0300 ), "MultiplexedAudioChannelsDescriptionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0301 ), "ChannelIdentificationCode", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x003A, 0x0302 ), "ChannelMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0001 ), "ScheduledStationAETitle", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0002 ), "ScheduledProcedureStepStartDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0003 ), "ScheduledProcedureStepStartTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0004 ), "ScheduledProcedureStepEndDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0005 ), "ScheduledProcedureStepEndTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0006 ), "ScheduledPerformingPhysicianName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0007 ), "ScheduledProcedureStepDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0008 ), "ScheduledProtocolCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0009 ), "ScheduledProcedureStepID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x000A ), "StageCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x000B ), "ScheduledPerformingPhysicianIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0010 ), "ScheduledStationName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0011 ), "ScheduledProcedureStepLocation", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0012 ), "PreMedication", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0020 ), "ScheduledProcedureStepStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0026 ), "OrderPlacerIdentifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0027 ), "OrderFillerIdentifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0031 ), "LocalNamespaceEntityID", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0032 ), "UniversalEntityID", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0033 ), "UniversalEntityIDType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0035 ), "IdentifierTypeCode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0036 ), "AssigningFacilitySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0039 ), "AssigningJurisdictionCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x003A ), "AssigningAgencyOrDepartmentCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0100 ), "ScheduledProcedureStepSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0220 ), "ReferencedNonImageCompositeSOPInstanceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0241 ), "PerformedStationAETitle", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0242 ), "PerformedStationName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0243 ), "PerformedLocation", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0244 ), "PerformedProcedureStepStartDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0245 ), "PerformedProcedureStepStartTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0250 ), "PerformedProcedureStepEndDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0251 ), "PerformedProcedureStepEndTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0252 ), "PerformedProcedureStepStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0253 ), "PerformedProcedureStepID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0254 ), "PerformedProcedureStepDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0255 ), "PerformedProcedureTypeDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0260 ), "PerformedProtocolCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0261 ), "PerformedProtocolType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0270 ), "ScheduledStepAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0275 ), "RequestAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0280 ), "CommentsOnThePerformedProcedureStep", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0281 ), "PerformedProcedureStepDiscontinuationReasonCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0293 ), "QuantitySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0294 ), "Quantity", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0295 ), "MeasuringUnitsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0296 ), "BillingItemSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0300 ), "TotalTimeOfFluoroscopy", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0301 ), "TotalNumberOfExposures", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0302 ), "EntranceDose", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0303 ), "ExposedArea", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0306 ), "DistanceSourceToEntrance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x030E ), "ExposureDoseSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0310 ), "CommentsOnRadiationDose", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0312 ), "XRayOutput", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0314 ), "HalfValueLayer", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0316 ), "OrganDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0318 ), "OrganExposed", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0320 ), "BillingProcedureStepSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0321 ), "FilmConsumptionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0324 ), "BillingSuppliesAndDevicesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0340 ), "PerformedSeriesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0400 ), "CommentsOnTheScheduledProcedureStep", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0440 ), "ProtocolContextSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0441 ), "ContentItemModifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0500 ), "ScheduledSpecimenSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0512 ), "ContainerIdentifier", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0513 ), "IssuerOfTheContainerIdentifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0515 ), "AlternateContainerIdentifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0518 ), "ContainerTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x051A ), "ContainerDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0520 ), "ContainerComponentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0551 ), "SpecimenIdentifier", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0554 ), "SpecimenUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0555 ), "AcquisitionContextSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0556 ), "AcquisitionContextDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0560 ), "SpecimenDescriptionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0562 ), "IssuerOfTheSpecimenIdentifierSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x059A ), "SpecimenTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0600 ), "SpecimenShortDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0602 ), "SpecimenDetailedDescription", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0610 ), "SpecimenPreparationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0612 ), "SpecimenPreparationStepContentItemSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x0620 ), "SpecimenLocalizationContentItemSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x071A ), "ImageCenterPointCoordinatesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x072A ), "XOffsetInSlideCoordinateSystem", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x073A ), "YOffsetInSlideCoordinateSystem", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x074A ), "ZOffsetInSlideCoordinateSystem", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x08EA ), "MeasurementUnitsCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1001 ), "RequestedProcedureID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1002 ), "ReasonForTheRequestedProcedure", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1003 ), "RequestedProcedurePriority", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1004 ), "PatientTransportArrangements", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1005 ), "RequestedProcedureLocation", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1008 ), "ConfidentialityCode", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1009 ), "ReportingPriority", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x100A ), "ReasonForRequestedProcedureCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1010 ), "NamesOfIntendedRecipientsOfResults", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1011 ), "IntendedRecipientsOfResultsIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1012 ), "ReasonForPerformedProcedureCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1101 ), "PersonIdentificationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1102 ), "PersonAddress", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1103 ), "PersonTelephoneNumbers", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x1400 ), "RequestedProcedureComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2004 ), "IssueDateOfImagingServiceRequest", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2005 ), "IssueTimeOfImagingServiceRequest", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2008 ), "OrderEnteredBy", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2009 ), "OrderEntererLocation", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2010 ), "OrderCallbackPhoneNumber", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2016 ), "PlacerOrderNumberImagingServiceRequest", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2017 ), "FillerOrderNumberImagingServiceRequest", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x2400 ), "ImagingServiceRequestComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x3001 ), "ConfidentialityConstraintOnPatientDataDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4001 ), "GeneralPurposeScheduledProcedureStepStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4002 ), "GeneralPurposePerformedProcedureStepStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4003 ), "GeneralPurposeScheduledProcedureStepPriority", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4004 ), "ScheduledProcessingApplicationsCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4005 ), "ScheduledProcedureStepStartDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4006 ), "MultipleCopiesFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4007 ), "PerformedProcessingApplicationsCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4009 ), "HumanPerformerCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4010 ), "ScheduledProcedureStepModificationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4011 ), "ExpectedCompletionDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4015 ), "ResultingGeneralPurposePerformedProcedureStepsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4016 ), "ReferencedGeneralPurposeScheduledProcedureStepSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4018 ), "ScheduledWorkitemCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4019 ), "PerformedWorkitemCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4020 ), "InputAvailabilityFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4021 ), "InputInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4022 ), "RelevantInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4023 ), "ReferencedGeneralPurposeScheduledProcedureStepTransactionUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4025 ), "ScheduledStationNameCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4026 ), "ScheduledStationClassCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4027 ), "ScheduledStationGeographicLocationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4028 ), "PerformedStationNameCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4029 ), "PerformedStationClassCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4030 ), "PerformedStationGeographicLocationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4031 ), "RequestedSubsequentWorkitemCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4032 ), "NonDICOMOutputCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4033 ), "OutputInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4034 ), "ScheduledHumanPerformersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4035 ), "ActualHumanPerformersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4036 ), "HumanPerformerOrganization", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4037 ), "HumanPerformerName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4040 ), "RawDataHandling", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4041 ), "InputReadinessState", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4050 ), "PerformedProcedureStepStartDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4051 ), "PerformedProcedureStepEndDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x4052 ), "ProcedureStepCancellationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x8302 ), "EntranceDoseInmGy", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9094 ), "ReferencedImageRealWorldValueMappingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9096 ), "RealWorldValueMappingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9098 ), "PixelValueMappingCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9210 ), "LUTLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9211 ), "RealWorldValueLastValueMapped", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9212 ), "RealWorldValueLUTData", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9216 ), "RealWorldValueFirstValueMapped", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9224 ), "RealWorldValueIntercept", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0x9225 ), "RealWorldValueSlope", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA010 ), "RelationshipType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA027 ), "VerifyingOrganization", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA030 ), "VerificationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA032 ), "ObservationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA040 ), "ValueType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA043 ), "ConceptNameCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA050 ), "ContinuityOfContent", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA073 ), "VerifyingObserverSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA075 ), "VerifyingObserverName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA078 ), "AuthorObserverSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA07A ), "ParticipantSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA07C ), "CustodialOrganizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA080 ), "ParticipationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA082 ), "ParticipationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA084 ), "ObserverType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA088 ), "VerifyingObserverIdentificationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA0B0 ), "ReferencedWaveformChannels", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA120 ), "DateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA121 ), "Date", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA122 ), "Time", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA123 ), "PersonName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA124 ), "UID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA130 ), "TemporalRangeType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA132 ), "ReferencedSamplePositions", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA136 ), "ReferencedFrameNumbers", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA138 ), "ReferencedTimeOffsets", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA13A ), "ReferencedDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA160 ), "TextValue", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA168 ), "ConceptCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA170 ), "PurposeOfReferenceCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA180 ), "AnnotationGroupNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA195 ), "ModifierCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA300 ), "MeasuredValueSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA301 ), "NumericValueQualifierCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA30A ), "NumericValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA360 ), "PredecessorDocumentsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA370 ), "ReferencedRequestSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA372 ), "PerformedProcedureCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA375 ), "CurrentRequestedProcedureEvidenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA385 ), "PertinentOtherEvidenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA390 ), "HL7StructuredDocumentReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA491 ), "CompletionFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA492 ), "CompletionFlagDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA493 ), "VerificationFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA494 ), "ArchiveRequested", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA496 ), "PreliminaryFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA504 ), "ContentTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA525 ), "IdenticalDocumentsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xA730 ), "ContentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xB020 ), "WaveformAnnotationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB00 ), "TemplateIdentifier", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xDB73 ), "ReferencedContentItemIdentifier", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE001 ), "HL7InstanceIdentifier", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE004 ), "HL7DocumentEffectiveTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE006 ), "HL7DocumentTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE008 ), "DocumentClassCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE010 ), "RetrieveURI", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE011 ), "RetrieveLocationUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE020 ), "TypeOfInstances", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE021 ), "DICOMRetrievalSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE022 ), "DICOMMediaRetrievalSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE023 ), "WADORetrievalSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE024 ), "XDSRetrievalSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE030 ), "RepositoryUniqueID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0040, 0xE031 ), "HomeCommunityID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0042, 0x0010 ), "DocumentTitle", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0042, 0x0011 ), "EncapsulatedDocument", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0042, 0x0012 ), "MIMETypeOfEncapsulatedDocument", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0042, 0x0013 ), "SourceInstanceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0042, 0x0014 ), "ListOfMIMETypes", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0001 ), "ProductPackageIdentifier", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0002 ), "SubstanceAdministrationApproval", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0003 ), "ApprovalStatusFurtherDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0004 ), "ApprovalStatusDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0007 ), "ProductTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0008 ), "ProductName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0009 ), "ProductDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x000A ), "ProductLotIdentifier", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x000B ), "ProductExpirationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0010 ), "SubstanceAdministrationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0011 ), "SubstanceAdministrationNotes", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0012 ), "SubstanceAdministrationDeviceID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0013 ), "ProductParameterSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0044, 0x0019 ), "SubstanceAdministrationParameterSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0012 ), "LensDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0014 ), "RightLensSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0015 ), "LeftLensSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0016 ), "UnspecifiedLateralityLensSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0018 ), "CylinderSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0028 ), "PrismSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0030 ), "HorizontalPrismPower", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0032 ), "HorizontalPrismBase", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0034 ), "VerticalPrismPower", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0036 ), "VerticalPrismBase", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0038 ), "LensSegmentType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0040 ), "OpticalTransmittance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0042 ), "ChannelWidth", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0044 ), "PupilSize", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0046 ), "CornealSize", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0050 ), "AutorefractionRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0052 ), "AutorefractionLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0060 ), "DistancePupillaryDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0062 ), "NearPupillaryDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0063 ), "IntermediatePupillaryDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0064 ), "OtherPupillaryDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0070 ), "KeratometryRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0071 ), "KeratometryLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0074 ), "SteepKeratometricAxisSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0075 ), "RadiusOfCurvature", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0076 ), "KeratometricPower", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0077 ), "KeratometricAxis", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0080 ), "FlatKeratometricAxisSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0092 ), "BackgroundColor", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0094 ), "Optotype", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0095 ), "OptotypePresentation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0097 ), "SubjectiveRefractionRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0098 ), "SubjectiveRefractionLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0100 ), "AddNearSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0101 ), "AddIntermediateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0102 ), "AddOtherSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0104 ), "AddPower", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0106 ), "ViewingDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0121 ), "VisualAcuityTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0122 ), "VisualAcuityRightEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0123 ), "VisualAcuityLeftEyeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0124 ), "VisualAcuityBothEyesOpenSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0125 ), "ViewingDistanceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0135 ), "VisualAcuityModifiers", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0137 ), "DecimalVisualAcuity", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0139 ), "OptotypeDetailedDefinition", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0145 ), "ReferencedRefractiveMeasurementsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0146 ), "SpherePower", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0046, 0x0147 ), "CylinderPower", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0001 ), "ImagedVolumeWidth", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0002 ), "ImagedVolumeHeight", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0003 ), "ImagedVolumeDepth", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0006 ), "TotalPixelMatrixColumns", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0007 ), "TotalPixelMatrixRows", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0008 ), "TotalPixelMatrixOriginSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0010 ), "SpecimenLabelInImage", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0011 ), "FocusMethod", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0012 ), "ExtendedDepthOfField", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0013 ), "NumberOfFocalPlanes", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0014 ), "DistanceBetweenFocalPlanes", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0015 ), "RecommendedAbsentPixelCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0100 ), "IlluminatorTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0102 ), "ImageOrientationSlide", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0105 ), "OpticalPathSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0106 ), "OpticalPathIdentifier", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0107 ), "OpticalPathDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0108 ), "IlluminationColorCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0110 ), "SpecimenReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0111 ), "CondenserLensPower", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0112 ), "ObjectiveLensPower", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0113 ), "ObjectiveLensNumericalAperture", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0120 ), "PaletteColorLookupTableSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0200 ), "ReferencedImageNavigationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0201 ), "TopLeftHandCornerOfLocalizerArea", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0202 ), "BottomRightHandCornerOfLocalizerArea", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0207 ), "OpticalPathIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x021A ), "PlanePositionSlideSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x021E ), "RowPositionInTotalImagePixelMatrix", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x021F ), "ColumnPositionInTotalImagePixelMatrix", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0048, 0x0301 ), "PixelOriginInterpretation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0004 ), "CalibrationImage", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0010 ), "DeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0012 ), "ContainerComponentTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0013 ), "ContainerComponentThickness", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0014 ), "DeviceLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0015 ), "ContainerComponentWidth", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0016 ), "DeviceDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0017 ), "DeviceDiameterUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0018 ), "DeviceVolume", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0019 ), "InterMarkerDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x001A ), "ContainerComponentMaterial", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x001B ), "ContainerComponentID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x001C ), "ContainerComponentLength", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x001D ), "ContainerComponentDiameter", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x001E ), "ContainerComponentDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0050, 0x0020 ), "DeviceDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0001 ), "ContrastBolusIngredientPercentByVolume", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0002 ), "OCTFocalDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0003 ), "BeamSpotSize", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0004 ), "EffectiveRefractiveIndex", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0006 ), "OCTAcquisitionDomain", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0007 ), "OCTOpticalCenterWavelength", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0008 ), "AxialResolution", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0009 ), "RangingDepth", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0011 ), "ALineRate", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0012 ), "ALinesPerFrame", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0013 ), "CatheterRotationalRate", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0014 ), "ALinePixelSpacing", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0016 ), "ModeOfPercutaneousAccessSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0025 ), "IntravascularOCTFrameTypeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0026 ), "OCTZOffsetApplied", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0027 ), "IntravascularFrameContentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0028 ), "IntravascularLongitudinalDistance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0029 ), "IntravascularOCTFrameContentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0030 ), "OCTZOffsetCorrection", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0031 ), "CatheterDirectionOfRotation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0033 ), "SeamLineLocation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0034 ), "FirstALineLocation", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0036 ), "SeamLineIndex", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0038 ), "NumberOfPaddedAlines", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x0039 ), "InterpolationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0052, 0x003A ), "RefractiveIndexApplied", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0010 ), "EnergyWindowVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0011 ), "NumberOfEnergyWindows", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0012 ), "EnergyWindowInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0013 ), "EnergyWindowRangeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0014 ), "EnergyWindowLowerLimit", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0015 ), "EnergyWindowUpperLimit", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0016 ), "RadiopharmaceuticalInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0017 ), "ResidualSyringeCounts", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0018 ), "EnergyWindowName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0020 ), "DetectorVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0021 ), "NumberOfDetectors", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0022 ), "DetectorInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0030 ), "PhaseVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0031 ), "NumberOfPhases", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0032 ), "PhaseInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0033 ), "NumberOfFramesInPhase", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0036 ), "PhaseDelay", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0038 ), "PauseBetweenFrames", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0039 ), "PhaseDescription", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0050 ), "RotationVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0051 ), "NumberOfRotations", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0052 ), "RotationInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0053 ), "NumberOfFramesInRotation", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0060 ), "RRIntervalVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0061 ), "NumberOfRRIntervals", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0062 ), "GatedInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0063 ), "DataInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0070 ), "TimeSlotVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0071 ), "NumberOfTimeSlots", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0072 ), "TimeSlotInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0073 ), "TimeSlotTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0080 ), "SliceVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0081 ), "NumberOfSlices", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0090 ), "AngularViewVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0100 ), "TimeSliceVector", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0101 ), "NumberOfTimeSlices", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0200 ), "StartAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0202 ), "TypeOfDetectorMotion", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0210 ), "TriggerVector", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0211 ), "NumberOfTriggersInPhase", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0220 ), "ViewCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0222 ), "ViewModifierCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0300 ), "RadionuclideCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0302 ), "AdministrationRouteCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0304 ), "RadiopharmaceuticalCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0306 ), "CalibrationDataSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0308 ), "EnergyWindowNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0400 ), "ImageID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0410 ), "PatientOrientationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0412 ), "PatientOrientationModifierCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0414 ), "PatientGantryRelationshipCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x0500 ), "SliceProgressionDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1000 ), "SeriesType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1001 ), "Units", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1002 ), "CountsSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1004 ), "ReprojectionMethod", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1006 ), "SUVType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1100 ), "RandomsCorrectionMethod", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1101 ), "AttenuationCorrectionMethod", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1102 ), "DecayCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1103 ), "ReconstructionMethod", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1104 ), "DetectorLinesOfResponseUsed", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1105 ), "ScatterCorrectionMethod", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1200 ), "AxialAcceptance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1201 ), "AxialMash", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1202 ), "TransverseMash", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1203 ), "DetectorElementSize", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1210 ), "CoincidenceWindowWidth", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1220 ), "SecondaryCountsType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1300 ), "FrameReferenceTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1310 ), "PrimaryPromptsCountsAccumulated", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1311 ), "SecondaryCountsAccumulated", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1320 ), "SliceSensitivityFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1321 ), "DecayFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1322 ), "DoseCalibrationFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1323 ), "ScatterFractionFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1324 ), "DeadTimeFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0054, 0x1330 ), "ImageIndex", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3000 ), "HistogramSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3002 ), "HistogramNumberOfBins", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3004 ), "HistogramFirstBinValue", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3006 ), "HistogramLastBinValue", "US or SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3008 ), "HistogramBinWidth", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3010 ), "HistogramExplanation", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0060, 0x3020 ), "HistogramData", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0001 ), "SegmentationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0002 ), "SegmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0003 ), "SegmentedPropertyCategoryCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0004 ), "SegmentNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0005 ), "SegmentLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0006 ), "SegmentDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0008 ), "SegmentAlgorithmType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0009 ), "SegmentAlgorithmName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x000A ), "SegmentIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x000B ), "ReferencedSegmentNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x000C ), "RecommendedDisplayGrayscaleValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x000D ), "RecommendedDisplayCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x000E ), "MaximumFractionalValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x000F ), "SegmentedPropertyTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0062, 0x0010 ), "SegmentationFractionalType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0002 ), "DeformableRegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0003 ), "SourceFrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0005 ), "DeformableRegistrationGridSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0007 ), "GridDimensions", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0008 ), "GridResolution", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0009 ), "VectorGridData", "OF" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x000F ), "PreDeformationMatrixRegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0064, 0x0010 ), "PostDeformationMatrixRegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0001 ), "NumberOfSurfaces", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0002 ), "SurfaceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0003 ), "SurfaceNumber", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0004 ), "SurfaceComments", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0009 ), "SurfaceProcessing", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x000A ), "SurfaceProcessingRatio", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x000B ), "SurfaceProcessingDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x000C ), "RecommendedPresentationOpacity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x000D ), "RecommendedPresentationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x000E ), "FiniteVolume", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0010 ), "Manifold", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0011 ), "SurfacePointsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0012 ), "SurfacePointsNormalsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0013 ), "SurfaceMeshPrimitivesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0015 ), "NumberOfSurfacePoints", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0016 ), "PointCoordinatesData", "OF" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0017 ), "PointPositionAccuracy", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0018 ), "MeanPointDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0019 ), "MaximumPointDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x001A ), "PointsBoundingBoxCoordinates", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x001B ), "AxisOfRotation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x001C ), "CenterOfRotation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x001E ), "NumberOfVectors", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x001F ), "VectorDimensionality", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0020 ), "VectorAccuracy", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0021 ), "VectorCoordinateData", "OF" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0023 ), "TrianglePointIndexList", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0024 ), "EdgePointIndexList", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0025 ), "VertexPointIndexList", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0026 ), "TriangleStripSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0027 ), "TriangleFanSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0028 ), "LineSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0029 ), "PrimitivePointIndexList", "OW" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x002A ), "SurfaceCount", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x002B ), "ReferencedSurfaceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x002C ), "ReferencedSurfaceNumber", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x002D ), "SegmentSurfaceGenerationAlgorithmIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x002E ), "SegmentSurfaceSourceInstanceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x002F ), "AlgorithmFamilyCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0030 ), "AlgorithmNameCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0031 ), "AlgorithmVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0032 ), "AlgorithmParameters", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0034 ), "FacetSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0035 ), "SurfaceProcessingAlgorithmIdentificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0066, 0x0036 ), "AlgorithmName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6210 ), "ImplantSize", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6221 ), "ImplantTemplateVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6222 ), "ReplacedImplantTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6223 ), "ImplantType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6224 ), "DerivationImplantTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6225 ), "OriginalImplantTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6226 ), "EffectiveDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6230 ), "ImplantTargetAnatomySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6260 ), "InformationFromManufacturerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6265 ), "NotificationFromManufacturerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6270 ), "InformationIssueDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6280 ), "InformationSummary", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62A0 ), "ImplantRegulatoryDisapprovalCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62A5 ), "OverallTemplateSpatialTolerance", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62C0 ), "HPGLDocumentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62D0 ), "HPGLDocumentID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62D5 ), "HPGLDocumentLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62E0 ), "ViewOrientationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62F0 ), "ViewOrientationModifier", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x62F2 ), "HPGLDocumentScaling", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6300 ), "HPGLDocument", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6310 ), "HPGLContourPenNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6320 ), "HPGLPenSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6330 ), "HPGLPenNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6340 ), "HPGLPenLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6345 ), "HPGLPenDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6346 ), "RecommendedRotationPoint", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6347 ), "BoundingRectangle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6350 ), "ImplantTemplate3DModelSurfaceNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6360 ), "SurfaceModelDescriptionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6380 ), "SurfaceModelLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6390 ), "SurfaceModelScalingFactor", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63A0 ), "MaterialsCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63A4 ), "CoatingMaterialsCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63A8 ), "ImplantTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63AC ), "FixationMethodCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63B0 ), "MatingFeatureSetsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63C0 ), "MatingFeatureSetID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63D0 ), "MatingFeatureSetLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63E0 ), "MatingFeatureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x63F0 ), "MatingFeatureID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6400 ), "MatingFeatureDegreeOfFreedomSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6410 ), "DegreeOfFreedomID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6420 ), "DegreeOfFreedomType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6430 ), "TwoDMatingFeatureCoordinatesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6440 ), "ReferencedHPGLDocumentID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6450 ), "TwoDMatingPoint", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6460 ), "TwoDMatingAxes", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6470 ), "TwoDDegreeOfFreedomSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6490 ), "ThreeDDegreeOfFreedomAxis", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x64A0 ), "RangeOfFreedom", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x64C0 ), "ThreeDMatingPoint", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x64D0 ), "ThreeDMatingAxes", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x64F0 ), "TwoDDegreeOfFreedomAxis", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6500 ), "PlanningLandmarkPointSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6510 ), "PlanningLandmarkLineSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6520 ), "PlanningLandmarkPlaneSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6530 ), "PlanningLandmarkID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6540 ), "PlanningLandmarkDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6545 ), "PlanningLandmarkIdentificationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6550 ), "TwoDPointCoordinatesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6560 ), "TwoDPointCoordinates", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6590 ), "ThreeDPointCoordinates", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x65A0 ), "TwoDLineCoordinatesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x65B0 ), "TwoDLineCoordinates", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x65D0 ), "ThreeDLineCoordinates", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x65E0 ), "TwoDPlaneCoordinatesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x65F0 ), "TwoDPlaneIntersection", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6610 ), "ThreeDPlaneOrigin", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0068, 0x6620 ), "ThreeDPlaneNormal", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0001 ), "GraphicAnnotationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0002 ), "GraphicLayer", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0003 ), "BoundingBoxAnnotationUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0004 ), "AnchorPointAnnotationUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0005 ), "GraphicAnnotationUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0006 ), "UnformattedTextValue", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0008 ), "TextObjectSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0009 ), "GraphicObjectSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0010 ), "BoundingBoxTopLeftHandCorner", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0011 ), "BoundingBoxBottomRightHandCorner", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0012 ), "BoundingBoxTextHorizontalJustification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0014 ), "AnchorPoint", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0015 ), "AnchorPointVisibility", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0020 ), "GraphicDimensions", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0021 ), "NumberOfGraphicPoints", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0022 ), "GraphicData", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0023 ), "GraphicType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0024 ), "GraphicFilled", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0041 ), "ImageHorizontalFlip", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0042 ), "ImageRotation", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0052 ), "DisplayedAreaTopLeftHandCorner", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0053 ), "DisplayedAreaBottomRightHandCorner", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x005A ), "DisplayedAreaSelectionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0060 ), "GraphicLayerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0062 ), "GraphicLayerOrder", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0066 ), "GraphicLayerRecommendedDisplayGrayscaleValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0068 ), "GraphicLayerDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0080 ), "ContentLabel", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0081 ), "ContentDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0082 ), "PresentationCreationDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0083 ), "PresentationCreationTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0084 ), "ContentCreatorName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0086 ), "ContentCreatorIdentificationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0087 ), "AlternateContentDescriptionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0100 ), "PresentationSizeMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0101 ), "PresentationPixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0102 ), "PresentationPixelAspectRatio", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0103 ), "PresentationPixelMagnificationRatio", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0207 ), "GraphicGroupLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0208 ), "GraphicGroupDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0209 ), "CompoundGraphicSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0226 ), "CompoundGraphicInstanceID", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0227 ), "FontName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0228 ), "FontNameType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0229 ), "CSSFontName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0230 ), "RotationAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0231 ), "TextStyleSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0232 ), "LineStyleSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0233 ), "FillStyleSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0234 ), "GraphicGroupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0241 ), "TextColorCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0242 ), "HorizontalAlignment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0243 ), "VerticalAlignment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0244 ), "ShadowStyle", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0245 ), "ShadowOffsetX", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0246 ), "ShadowOffsetY", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0247 ), "ShadowColorCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0248 ), "Underlined", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0249 ), "Bold", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0250 ), "Italic", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0251 ), "PatternOnColorCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0252 ), "PatternOffColorCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0253 ), "LineThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0254 ), "LineDashingStyle", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0255 ), "LinePattern", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0256 ), "FillPattern", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0257 ), "FillMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0258 ), "ShadowOpacity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0261 ), "GapLength", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0262 ), "DiameterOfVisibility", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0273 ), "RotationPoint", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0274 ), "TickAlignment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0278 ), "ShowTickLabel", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0279 ), "TickLabelAlignment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0282 ), "CompoundGraphicUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0284 ), "PatternOnOpacity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0285 ), "PatternOffOpacity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0287 ), "MajorTicksSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0288 ), "TickPosition", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0289 ), "TickLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0294 ), "CompoundGraphicType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0295 ), "GraphicGroupID", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0306 ), "ShapeType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0308 ), "RegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0309 ), "MatrixRegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x030A ), "MatrixSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x030C ), "FrameOfReferenceTransformationMatrixType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x030D ), "RegistrationTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x030F ), "FiducialDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0310 ), "FiducialIdentifier", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0311 ), "FiducialIdentifierCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0312 ), "ContourUncertaintyRadius", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0314 ), "UsedFiducialsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0318 ), "GraphicCoordinatesDataSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x031A ), "FiducialUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x031C ), "FiducialSetSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x031E ), "FiducialSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0401 ), "GraphicLayerRecommendedDisplayCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0402 ), "BlendingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0403 ), "RelativeOpacity", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0404 ), "ReferencedSpatialRegistrationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0070, 0x0405 ), "BlendingPosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0002 ), "HangingProtocolName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0004 ), "HangingProtocolDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0006 ), "HangingProtocolLevel", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0008 ), "HangingProtocolCreator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x000A ), "HangingProtocolCreationDateTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x000C ), "HangingProtocolDefinitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x000E ), "HangingProtocolUserIdentificationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0010 ), "HangingProtocolUserGroupName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0012 ), "SourceHangingProtocolSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0014 ), "NumberOfPriorsReferenced", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0020 ), "ImageSetsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0022 ), "ImageSetSelectorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0024 ), "ImageSetSelectorUsageFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0026 ), "SelectorAttribute", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0028 ), "SelectorValueNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0030 ), "TimeBasedImageSetsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0032 ), "ImageSetNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0034 ), "ImageSetSelectorCategory", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0038 ), "RelativeTime", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x003A ), "RelativeTimeUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x003C ), "AbstractPriorValue", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x003E ), "AbstractPriorCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0040 ), "ImageSetLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0050 ), "SelectorAttributeVR", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0052 ), "SelectorSequencePointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0054 ), "SelectorSequencePointerPrivateCreator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0056 ), "SelectorAttributePrivateCreator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0060 ), "SelectorATValue", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0062 ), "SelectorCSValue", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0064 ), "SelectorISValue", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0066 ), "SelectorLOValue", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0068 ), "SelectorLTValue", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x006A ), "SelectorPNValue", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x006C ), "SelectorSHValue", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x006E ), "SelectorSTValue", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0070 ), "SelectorUTValue", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0072 ), "SelectorDSValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0074 ), "SelectorFDValue", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0076 ), "SelectorFLValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0078 ), "SelectorULValue", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x007A ), "SelectorUSValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x007C ), "SelectorSLValue", "SL" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x007E ), "SelectorSSValue", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0080 ), "SelectorCodeSequenceValue", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0100 ), "NumberOfScreens", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0102 ), "NominalScreenDefinitionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0104 ), "NumberOfVerticalPixels", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0106 ), "NumberOfHorizontalPixels", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0108 ), "DisplayEnvironmentSpatialPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x010A ), "ScreenMinimumGrayscaleBitDepth", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x010C ), "ScreenMinimumColorBitDepth", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x010E ), "ApplicationMaximumRepaintTime", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0200 ), "DisplaySetsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0202 ), "DisplaySetNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0203 ), "DisplaySetLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0204 ), "DisplaySetPresentationGroup", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0206 ), "DisplaySetPresentationGroupDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0208 ), "PartialDataDisplayHandling", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0210 ), "SynchronizedScrollingSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0212 ), "DisplaySetScrollingGroup", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0214 ), "NavigationIndicatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0216 ), "NavigationDisplaySet", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0218 ), "ReferenceDisplaySets", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0300 ), "ImageBoxesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0302 ), "ImageBoxNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0304 ), "ImageBoxLayoutType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0306 ), "ImageBoxTileHorizontalDimension", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0308 ), "ImageBoxTileVerticalDimension", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0310 ), "ImageBoxScrollDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0312 ), "ImageBoxSmallScrollType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0314 ), "ImageBoxSmallScrollAmount", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0316 ), "ImageBoxLargeScrollType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0318 ), "ImageBoxLargeScrollAmount", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0320 ), "ImageBoxOverlapPriority", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0330 ), "CineRelativeToRealTime", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0400 ), "FilterOperationsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0402 ), "FilterByCategory", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0404 ), "FilterByAttributePresence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0406 ), "FilterByOperator", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0420 ), "StructuredDisplayBackgroundCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0421 ), "EmptyImageBoxCIELabValue", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0422 ), "StructuredDisplayImageBoxSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0424 ), "StructuredDisplayTextBoxSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0427 ), "ReferencedFirstFrameSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0430 ), "ImageBoxSynchronizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0432 ), "SynchronizedImageBoxList", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0434 ), "TypeOfSynchronization", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0500 ), "BlendingOperationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0510 ), "ReformattingOperationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0512 ), "ReformattingThickness", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0514 ), "ReformattingInterval", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0516 ), "ReformattingOperationInitialViewDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0520 ), "ThreeDRenderingType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0600 ), "SortingOperationsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0602 ), "SortByCategory", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0604 ), "SortingDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0700 ), "DisplaySetPatientOrientation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0702 ), "VOIType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0704 ), "PseudoColorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0705 ), "PseudoColorPaletteInstanceReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0706 ), "ShowGrayscaleInverted", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0710 ), "ShowImageTrueSizeFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0712 ), "ShowGraphicAnnotationFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0714 ), "ShowPatientDemographicsFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0716 ), "ShowAcquisitionTechniquesFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0717 ), "DisplaySetHorizontalJustification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0072, 0x0718 ), "DisplaySetVerticalJustification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x0120 ), "ContinuationStartMeterset", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x0121 ), "ContinuationEndMeterset", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1000 ), "ProcedureStepState", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1002 ), "ProcedureStepProgressInformationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1004 ), "ProcedureStepProgress", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1006 ), "ProcedureStepProgressDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1008 ), "ProcedureStepCommunicationsURISequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x100a ), "ContactURI", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x100c ), "ContactDisplayName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x100e ), "ProcedureStepDiscontinuationReasonCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1020 ), "BeamTaskSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1022 ), "BeamTaskType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1026 ), "TableTopVerticalAdjustedPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1027 ), "TableTopLongitudinalAdjustedPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1028 ), "TableTopLateralAdjustedPosition", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x102A ), "PatientSupportAdjustedAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x102B ), "TableTopEccentricAdjustedAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x102C ), "TableTopPitchAdjustedAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x102D ), "TableTopRollAdjustedAngle", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1030 ), "DeliveryVerificationImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1032 ), "VerificationImageTiming", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1034 ), "DoubleExposureFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1036 ), "DoubleExposureOrdering", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1040 ), "RelatedReferenceRTImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1042 ), "GeneralMachineVerificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1044 ), "ConventionalMachineVerificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1046 ), "IonMachineVerificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1048 ), "FailedAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x104A ), "OverriddenAttributesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x104C ), "ConventionalControlPointVerificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x104E ), "IonControlPointVerificationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1050 ), "AttributeOccurrenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1052 ), "AttributeOccurrencePointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1054 ), "AttributeItemSelector", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1056 ), "AttributeOccurrencePrivateCreator", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1057 ), "SelectorSequencePointerItems", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1200 ), "ScheduledProcedureStepPriority", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1202 ), "WorklistLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1204 ), "ProcedureStepLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1210 ), "ScheduledProcessingParametersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1212 ), "PerformedProcessingParametersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1216 ), "UnifiedProcedureStepPerformedProcedureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1224 ), "ReplacedProcedureStepSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1230 ), "DeletionLock", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1234 ), "ReceivingAE", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1236 ), "RequestingAE", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1238 ), "ReasonForCancellation", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1242 ), "SCPStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1244 ), "SubscriptionListStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1246 ), "UnifiedProcedureStepListStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1324 ), "BeamOrderIndex", "UL" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x1338 ), "DoubleExposureMeterset", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0074, 0x133A ), "DoubleExposureFieldDelta", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0001 ), "ImplantAssemblyTemplateName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0003 ), "ImplantAssemblyTemplateIssuer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0006 ), "ImplantAssemblyTemplateVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0008 ), "ReplacedImplantAssemblyTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x000A ), "ImplantAssemblyTemplateType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x000C ), "OriginalImplantAssemblyTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x000E ), "DerivationImplantAssemblyTemplateSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0010 ), "ImplantAssemblyTemplateTargetAnatomySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0020 ), "ProcedureTypeCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0030 ), "SurgicalTechnique", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0032 ), "ComponentTypesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0034 ), "ComponentTypeCodeSequence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0036 ), "ExclusiveComponentType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0038 ), "MandatoryComponentType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0040 ), "ComponentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0055 ), "ComponentID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0060 ), "ComponentAssemblySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0070 ), "Component1ReferencedID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0080 ), "Component1ReferencedMatingFeatureSetID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x0090 ), "Component1ReferencedMatingFeatureID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x00A0 ), "Component2ReferencedID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x00B0 ), "Component2ReferencedMatingFeatureSetID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0076, 0x00C0 ), "Component2ReferencedMatingFeatureID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0001 ), "ImplantTemplateGroupName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0010 ), "ImplantTemplateGroupDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0020 ), "ImplantTemplateGroupIssuer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0024 ), "ImplantTemplateGroupVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0026 ), "ReplacedImplantTemplateGroupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0028 ), "ImplantTemplateGroupTargetAnatomySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x002A ), "ImplantTemplateGroupMembersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x002E ), "ImplantTemplateGroupMemberID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0050 ), "ThreeDImplantTemplateGroupMemberMatchingPoint", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0060 ), "ThreeDImplantTemplateGroupMemberMatchingAxes", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0070 ), "ImplantTemplateGroupMemberMatching2DCoordinatesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x0090 ), "TwoDImplantTemplateGroupMemberMatchingPoint", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x00A0 ), "TwoDImplantTemplateGroupMemberMatchingAxes", "FD" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x00B0 ), "ImplantTemplateGroupVariationDimensionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x00B2 ), "ImplantTemplateGroupVariationDimensionName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x00B4 ), "ImplantTemplateGroupVariationDimensionRankSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x00B6 ), "ReferencedImplantTemplateGroupMemberID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0078, 0x00B8 ), "ImplantTemplateGroupVariationDimensionRank", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0130 ), "StorageMediaFileSetID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0140 ), "StorageMediaFileSetUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x0088, 0x0200 ), "IconImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0010 ), "NumberOfCopies", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x001E ), "PrinterConfigurationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0020 ), "PrintPriority", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0030 ), "MediumType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0040 ), "FilmDestination", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0050 ), "FilmSessionLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0060 ), "MemoryAllocation", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0061 ), "MaximumMemoryAllocation", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x00A0 ), "MemoryBitDepth", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x00A1 ), "PrintingBitDepth", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x00A2 ), "MediaInstalledSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x00A4 ), "OtherMediaAvailableSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x00A8 ), "SupportedImageDisplayFormatsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2000, 0x0500 ), "ReferencedFilmBoxSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0010 ), "ImageDisplayFormat", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0030 ), "AnnotationDisplayFormatID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0040 ), "FilmOrientation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0050 ), "FilmSizeID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0052 ), "PrinterResolutionID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0054 ), "DefaultPrinterResolutionID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0060 ), "MagnificationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0080 ), "SmoothingType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x00A6 ), "DefaultMagnificationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x00A7 ), "OtherMagnificationTypesAvailable", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x00A8 ), "DefaultSmoothingType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x00A9 ), "OtherSmoothingTypesAvailable", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0100 ), "BorderDensity", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0110 ), "EmptyImageDensity", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0120 ), "MinDensity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0130 ), "MaxDensity", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0140 ), "Trim", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0150 ), "ConfigurationInformation", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0152 ), "ConfigurationInformationDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0154 ), "MaximumCollatedFilms", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x015E ), "Illumination", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0160 ), "ReflectedAmbientLight", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0376 ), "PrinterPixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0500 ), "ReferencedFilmSessionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0510 ), "ReferencedImageBoxSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2010, 0x0520 ), "ReferencedBasicAnnotationBoxSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0010 ), "ImageBoxPosition", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0020 ), "Polarity", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0030 ), "RequestedImageSize", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0040 ), "RequestedDecimateCropBehavior", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0050 ), "RequestedResolutionID", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x00A0 ), "RequestedImageSizeFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x00A2 ), "DecimateCropResult", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0110 ), "BasicGrayscaleImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2020, 0x0111 ), "BasicColorImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2030, 0x0010 ), "AnnotationPosition", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2030, 0x0020 ), "TextString", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x2050, 0x0010 ), "PresentationLUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2050, 0x0020 ), "PresentationLUTShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2050, 0x0500 ), "ReferencedPresentationLUTSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0020 ), "ExecutionStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0030 ), "ExecutionStatusInfo", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0040 ), "CreationDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0050 ), "CreationTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0070 ), "Originator", "AE" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0160 ), "OwnerID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x2100, 0x0170 ), "NumberOfFilms", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x2110, 0x0010 ), "PrinterStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2110, 0x0020 ), "PrinterStatusInfo", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2110, 0x0030 ), "PrinterName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0001 ), "LabelUsingInformationExtractedFromInstances", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0002 ), "LabelText", "UT" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0003 ), "LabelStyleSelection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0004 ), "MediaDisposition", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0005 ), "BarcodeValue", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0006 ), "BarcodeSymbology", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0007 ), "AllowMediaSplitting", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0008 ), "IncludeNonDICOMObjects", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0009 ), "IncludeDisplayApplication", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x000A ), "PreserveCompositeInstancesAfterMediaCreation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x000B ), "TotalNumberOfPiecesOfMediaCreated", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x000C ), "RequestedMediaApplicationProfile", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x000D ), "ReferencedStorageMediaSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x000E ), "FailureAttributes", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x000F ), "AllowLossyCompression", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x2200, 0x0020 ), "RequestPriority", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0002 ), "RTImageLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0003 ), "RTImageName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0004 ), "RTImageDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x000A ), "ReportedValuesOrigin", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x000C ), "RTImagePlane", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x000D ), "XRayImageReceptorTranslation", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x000E ), "XRayImageReceptorAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0010 ), "RTImageOrientation", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0011 ), "ImagePlanePixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0012 ), "RTImagePosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0020 ), "RadiationMachineName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0022 ), "RadiationMachineSAD", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0024 ), "RadiationMachineSSD", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0026 ), "RTImageSID", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0028 ), "SourceToReferenceObjectDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0029 ), "FractionNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0030 ), "ExposureSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0032 ), "MetersetExposure", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0034 ), "DiaphragmPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0040 ), "FluenceMapSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0041 ), "FluenceDataSource", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0042 ), "FluenceDataScale", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0050 ), "PrimaryFluenceModeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0051 ), "FluenceMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3002, 0x0052 ), "FluenceModeID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0001 ), "DVHType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0002 ), "DoseUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0004 ), "DoseType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0006 ), "DoseComment", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0008 ), "NormalizationPoint", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x000A ), "DoseSummationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x000C ), "GridFrameOffsetVector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x000E ), "DoseGridScaling", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0010 ), "RTDoseROISequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0012 ), "DoseValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0014 ), "TissueHeterogeneityCorrection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0040 ), "DVHNormalizationPoint", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0042 ), "DVHNormalizationDoseValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0050 ), "DVHSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0052 ), "DVHDoseScaling", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0054 ), "DVHVolumeUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0056 ), "DVHNumberOfBins", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0058 ), "DVHData", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0060 ), "DVHReferencedROISequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0062 ), "DVHROIContributionType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0070 ), "DVHMinimumDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0072 ), "DVHMaximumDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3004, 0x0074 ), "DVHMeanDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0002 ), "StructureSetLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0004 ), "StructureSetName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0006 ), "StructureSetDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0008 ), "StructureSetDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0009 ), "StructureSetTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0010 ), "ReferencedFrameOfReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0012 ), "RTReferencedStudySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0014 ), "RTReferencedSeriesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0016 ), "ContourImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0020 ), "StructureSetROISequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0022 ), "ROINumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0024 ), "ReferencedFrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0026 ), "ROIName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0028 ), "ROIDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x002A ), "ROIDisplayColor", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x002C ), "ROIVolume", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0030 ), "RTRelatedROISequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0033 ), "RTROIRelationship", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0036 ), "ROIGenerationAlgorithm", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0038 ), "ROIGenerationDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0039 ), "ROIContourSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0040 ), "ContourSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0042 ), "ContourGeometricType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0044 ), "ContourSlabThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0045 ), "ContourOffsetVector", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0046 ), "NumberOfContourPoints", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0048 ), "ContourNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0049 ), "AttachedContours", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0050 ), "ContourData", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0080 ), "RTROIObservationsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0082 ), "ObservationNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0084 ), "ReferencedROINumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0085 ), "ROIObservationLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0086 ), "RTROIIdentificationCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x0088 ), "ROIObservationDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00A0 ), "RelatedRTROIObservationsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00A4 ), "RTROIInterpretedType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00A6 ), "ROIInterpreter", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00B0 ), "ROIPhysicalPropertiesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00B2 ), "ROIPhysicalProperty", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00B4 ), "ROIPhysicalPropertyValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00B6 ), "ROIElementalCompositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00B7 ), "ROIElementalCompositionAtomicNumber", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00B8 ), "ROIElementalCompositionAtomicMassFraction", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00C0 ), "FrameOfReferenceRelationshipSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00C2 ), "RelatedFrameOfReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00C4 ), "FrameOfReferenceTransformationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00C6 ), "FrameOfReferenceTransformationMatrix", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3006, 0x00C8 ), "FrameOfReferenceTransformationComment", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0010 ), "MeasuredDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0012 ), "MeasuredDoseDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0014 ), "MeasuredDoseType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0016 ), "MeasuredDoseValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0020 ), "TreatmentSessionBeamSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0021 ), "TreatmentSessionIonBeamSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0022 ), "CurrentFractionNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0024 ), "TreatmentControlPointDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0025 ), "TreatmentControlPointTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x002A ), "TreatmentTerminationStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x002B ), "TreatmentTerminationCode", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x002C ), "TreatmentVerificationStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0030 ), "ReferencedTreatmentRecordSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0032 ), "SpecifiedPrimaryMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0033 ), "SpecifiedSecondaryMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0036 ), "DeliveredPrimaryMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0037 ), "DeliveredSecondaryMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x003A ), "SpecifiedTreatmentTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x003B ), "DeliveredTreatmentTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0040 ), "ControlPointDeliverySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0041 ), "IonControlPointDeliverySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0042 ), "SpecifiedMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0044 ), "DeliveredMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0045 ), "MetersetRateSet", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0046 ), "MetersetRateDelivered", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0047 ), "ScanSpotMetersetsDelivered", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0048 ), "DoseRateDelivered", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0050 ), "TreatmentSummaryCalculatedDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0052 ), "CumulativeDoseToDoseReference", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0054 ), "FirstTreatmentDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0056 ), "MostRecentTreatmentDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x005A ), "NumberOfFractionsDelivered", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0060 ), "OverrideSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0061 ), "ParameterSequencePointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0062 ), "OverrideParameterPointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0063 ), "ParameterItemIndex", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0064 ), "MeasuredDoseReferenceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0065 ), "ParameterPointer", "AT" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0066 ), "OverrideReason", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0068 ), "CorrectedParameterSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x006A ), "CorrectionValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0070 ), "CalculatedDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0072 ), "CalculatedDoseReferenceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0074 ), "CalculatedDoseReferenceDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0076 ), "CalculatedDoseReferenceDoseValue", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0078 ), "StartMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x007A ), "EndMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0080 ), "ReferencedMeasuredDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0082 ), "ReferencedMeasuredDoseReferenceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0090 ), "ReferencedCalculatedDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0092 ), "ReferencedCalculatedDoseReferenceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00A0 ), "BeamLimitingDeviceLeafPairsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00B0 ), "RecordedWedgeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00C0 ), "RecordedCompensatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00D0 ), "RecordedBlockSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00E0 ), "TreatmentSummaryMeasuredDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00F0 ), "RecordedSnoutSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00F2 ), "RecordedRangeShifterSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00F4 ), "RecordedLateralSpreadingDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x00F6 ), "RecordedRangeModulatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0100 ), "RecordedSourceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0105 ), "SourceSerialNumber", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0110 ), "TreatmentSessionApplicationSetupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0116 ), "ApplicationSetupCheck", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0120 ), "RecordedBrachyAccessoryDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0122 ), "ReferencedBrachyAccessoryDeviceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0130 ), "RecordedChannelSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0132 ), "SpecifiedChannelTotalTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0134 ), "DeliveredChannelTotalTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0136 ), "SpecifiedNumberOfPulses", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0138 ), "DeliveredNumberOfPulses", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x013A ), "SpecifiedPulseRepetitionInterval", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x013C ), "DeliveredPulseRepetitionInterval", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0140 ), "RecordedSourceApplicatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0142 ), "ReferencedSourceApplicatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0150 ), "RecordedChannelShieldSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0152 ), "ReferencedChannelShieldNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0160 ), "BrachyControlPointDeliveredSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0162 ), "SafePositionExitDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0164 ), "SafePositionExitTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0166 ), "SafePositionReturnDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0168 ), "SafePositionReturnTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0200 ), "CurrentTreatmentStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0202 ), "TreatmentStatusComment", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0220 ), "FractionGroupSummarySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0223 ), "ReferencedFractionNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0224 ), "FractionGroupType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0230 ), "BeamStopperPosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0240 ), "FractionStatusSummarySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0250 ), "TreatmentDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x3008, 0x0251 ), "TreatmentTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0002 ), "RTPlanLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0003 ), "RTPlanName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0004 ), "RTPlanDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0006 ), "RTPlanDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0007 ), "RTPlanTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0009 ), "TreatmentProtocols", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x000A ), "PlanIntent", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x000B ), "TreatmentSites", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x000C ), "RTPlanGeometry", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x000E ), "PrescriptionDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0010 ), "DoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0012 ), "DoseReferenceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0013 ), "DoseReferenceUID", "UI" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0014 ), "DoseReferenceStructureType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0015 ), "NominalBeamEnergyUnit", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0016 ), "DoseReferenceDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0018 ), "DoseReferencePointCoordinates", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x001A ), "NominalPriorDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0020 ), "DoseReferenceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0021 ), "ConstraintWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0022 ), "DeliveryWarningDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0023 ), "DeliveryMaximumDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0025 ), "TargetMinimumDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0026 ), "TargetPrescriptionDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0027 ), "TargetMaximumDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0028 ), "TargetUnderdoseVolumeFraction", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x002A ), "OrganAtRiskFullVolumeDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x002B ), "OrganAtRiskLimitDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x002C ), "OrganAtRiskMaximumDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x002D ), "OrganAtRiskOverdoseVolumeFraction", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0040 ), "ToleranceTableSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0042 ), "ToleranceTableNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0043 ), "ToleranceTableLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0044 ), "GantryAngleTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0046 ), "BeamLimitingDeviceAngleTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0048 ), "BeamLimitingDeviceToleranceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x004A ), "BeamLimitingDevicePositionTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x004B ), "SnoutPositionTolerance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x004C ), "PatientSupportAngleTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x004E ), "TableTopEccentricAngleTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x004F ), "TableTopPitchAngleTolerance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0050 ), "TableTopRollAngleTolerance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0051 ), "TableTopVerticalPositionTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0052 ), "TableTopLongitudinalPositionTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0053 ), "TableTopLateralPositionTolerance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0055 ), "RTPlanRelationship", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0070 ), "FractionGroupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0071 ), "FractionGroupNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0072 ), "FractionGroupDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0078 ), "NumberOfFractionsPlanned", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0079 ), "NumberOfFractionPatternDigitsPerDay", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x007A ), "RepeatFractionCycleLength", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x007B ), "FractionPattern", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0080 ), "NumberOfBeams", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0082 ), "BeamDoseSpecificationPoint", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0084 ), "BeamDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0086 ), "BeamMeterset", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0088 ), "BeamDosePointDepth", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0089 ), "BeamDosePointEquivalentDepth", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x008A ), "BeamDosePointSSD", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00A0 ), "NumberOfBrachyApplicationSetups", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00A2 ), "BrachyApplicationSetupDoseSpecificationPoint", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00A4 ), "BrachyApplicationSetupDose", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00B0 ), "BeamSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00B2 ), "TreatmentMachineName", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00B3 ), "PrimaryDosimeterUnit", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00B4 ), "SourceAxisDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00B6 ), "BeamLimitingDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00B8 ), "RTBeamLimitingDeviceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00BA ), "SourceToBeamLimitingDeviceDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00BB ), "IsocenterToBeamLimitingDeviceDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00BC ), "NumberOfLeafJawPairs", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00BE ), "LeafPositionBoundaries", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C0 ), "BeamNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C2 ), "BeamName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C3 ), "BeamDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C4 ), "BeamType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C6 ), "RadiationType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C7 ), "HighDoseTechniqueType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00C8 ), "ReferenceImageNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00CA ), "PlannedVerificationImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00CC ), "ImagingDeviceSpecificAcquisitionParameters", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00CE ), "TreatmentDeliveryType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D0 ), "NumberOfWedges", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D1 ), "WedgeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D2 ), "WedgeNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D3 ), "WedgeType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D4 ), "WedgeID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D5 ), "WedgeAngle", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D6 ), "WedgeFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D7 ), "TotalWedgeTrayWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D8 ), "WedgeOrientation", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00D9 ), "IsocenterToWedgeTrayDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00DA ), "SourceToWedgeTrayDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00DB ), "WedgeThinEdgePosition", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00DC ), "BolusID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00DD ), "BolusDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E0 ), "NumberOfCompensators", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E1 ), "MaterialID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E2 ), "TotalCompensatorTrayFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E3 ), "CompensatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E4 ), "CompensatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E5 ), "CompensatorID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E6 ), "SourceToCompensatorTrayDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E7 ), "CompensatorRows", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E8 ), "CompensatorColumns", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00E9 ), "CompensatorPixelSpacing", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00EA ), "CompensatorPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00EB ), "CompensatorTransmissionData", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00EC ), "CompensatorThicknessData", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00ED ), "NumberOfBoli", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00EE ), "CompensatorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F0 ), "NumberOfBlocks", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F2 ), "TotalBlockTrayFactor", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F3 ), "TotalBlockTrayWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F4 ), "BlockSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F5 ), "BlockTrayID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F6 ), "SourceToBlockTrayDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F7 ), "IsocenterToBlockTrayDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F8 ), "BlockType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00F9 ), "AccessoryCode", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00FA ), "BlockDivergence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00FB ), "BlockMountingPosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00FC ), "BlockNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x00FE ), "BlockName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0100 ), "BlockThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0102 ), "BlockTransmission", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0104 ), "BlockNumberOfPoints", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0106 ), "BlockData", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0107 ), "ApplicatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0108 ), "ApplicatorID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0109 ), "ApplicatorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x010A ), "ApplicatorDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x010C ), "CumulativeDoseReferenceCoefficient", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x010E ), "FinalCumulativeMetersetWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0110 ), "NumberOfControlPoints", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0111 ), "ControlPointSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0112 ), "ControlPointIndex", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0114 ), "NominalBeamEnergy", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0115 ), "DoseRateSet", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0116 ), "WedgePositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0118 ), "WedgePosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x011A ), "BeamLimitingDevicePositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x011C ), "LeafJawPositions", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x011E ), "GantryAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x011F ), "GantryRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0120 ), "BeamLimitingDeviceAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0121 ), "BeamLimitingDeviceRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0122 ), "PatientSupportAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0123 ), "PatientSupportRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0124 ), "TableTopEccentricAxisDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0125 ), "TableTopEccentricAngle", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0126 ), "TableTopEccentricRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0128 ), "TableTopVerticalPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0129 ), "TableTopLongitudinalPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x012A ), "TableTopLateralPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x012C ), "IsocenterPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x012E ), "SurfaceEntryPoint", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0130 ), "SourceToSurfaceDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0134 ), "CumulativeMetersetWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0140 ), "TableTopPitchAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0142 ), "TableTopPitchRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0144 ), "TableTopRollAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0146 ), "TableTopRollRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0148 ), "HeadFixationAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x014A ), "GantryPitchAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x014C ), "GantryPitchRotationDirection", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x014E ), "GantryPitchAngleTolerance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0180 ), "PatientSetupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0182 ), "PatientSetupNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0183 ), "PatientSetupLabel", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0184 ), "PatientAdditionalPosition", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0190 ), "FixationDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0192 ), "FixationDeviceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0194 ), "FixationDeviceLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0196 ), "FixationDeviceDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0198 ), "FixationDevicePosition", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0199 ), "FixationDevicePitchAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x019A ), "FixationDeviceRollAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01A0 ), "ShieldingDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01A2 ), "ShieldingDeviceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01A4 ), "ShieldingDeviceLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01A6 ), "ShieldingDeviceDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01A8 ), "ShieldingDevicePosition", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01B0 ), "SetupTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01B2 ), "SetupTechniqueDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01B4 ), "SetupDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01B6 ), "SetupDeviceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01B8 ), "SetupDeviceLabel", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01BA ), "SetupDeviceDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01BC ), "SetupDeviceParameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01D0 ), "SetupReferenceDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01D2 ), "TableTopVerticalSetupDisplacement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01D4 ), "TableTopLongitudinalSetupDisplacement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x01D6 ), "TableTopLateralSetupDisplacement", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0200 ), "BrachyTreatmentTechnique", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0202 ), "BrachyTreatmentType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0206 ), "TreatmentMachineSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0210 ), "SourceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0212 ), "SourceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0214 ), "SourceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0216 ), "SourceManufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0218 ), "ActiveSourceDiameter", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x021A ), "ActiveSourceLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0222 ), "SourceEncapsulationNominalThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0224 ), "SourceEncapsulationNominalTransmission", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0226 ), "SourceIsotopeName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0228 ), "SourceIsotopeHalfLife", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0229 ), "SourceStrengthUnits", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x022A ), "ReferenceAirKermaRate", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x022B ), "SourceStrength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x022C ), "SourceStrengthReferenceDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x022E ), "SourceStrengthReferenceTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0230 ), "ApplicationSetupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0232 ), "ApplicationSetupType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0234 ), "ApplicationSetupNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0236 ), "ApplicationSetupName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0238 ), "ApplicationSetupManufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0240 ), "TemplateNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0242 ), "TemplateType", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0244 ), "TemplateName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0250 ), "TotalReferenceAirKerma", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0260 ), "BrachyAccessoryDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0262 ), "BrachyAccessoryDeviceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0263 ), "BrachyAccessoryDeviceID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0264 ), "BrachyAccessoryDeviceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0266 ), "BrachyAccessoryDeviceName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x026A ), "BrachyAccessoryDeviceNominalThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x026C ), "BrachyAccessoryDeviceNominalTransmission", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0280 ), "ChannelSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0282 ), "ChannelNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0284 ), "ChannelLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0286 ), "ChannelTotalTime", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0288 ), "SourceMovementType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x028A ), "NumberOfPulses", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x028C ), "PulseRepetitionInterval", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0290 ), "SourceApplicatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0291 ), "SourceApplicatorID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0292 ), "SourceApplicatorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0294 ), "SourceApplicatorName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0296 ), "SourceApplicatorLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0298 ), "SourceApplicatorManufacturer", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x029C ), "SourceApplicatorWallNominalThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x029E ), "SourceApplicatorWallNominalTransmission", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02A0 ), "SourceApplicatorStepSize", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02A2 ), "TransferTubeNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02A4 ), "TransferTubeLength", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02B0 ), "ChannelShieldSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02B2 ), "ChannelShieldNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02B3 ), "ChannelShieldID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02B4 ), "ChannelShieldName", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02B8 ), "ChannelShieldNominalThickness", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02BA ), "ChannelShieldNominalTransmission", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02C8 ), "FinalCumulativeTimeWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02D0 ), "BrachyControlPointSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02D2 ), "ControlPointRelativePosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02D4 ), "ControlPoint3DPosition", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02D6 ), "CumulativeTimeWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E0 ), "CompensatorDivergence", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E1 ), "CompensatorMountingPosition", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E2 ), "SourceToCompensatorDistance", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E3 ), "TotalCompensatorTrayWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E4 ), "IsocenterToCompensatorTrayDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E5 ), "CompensatorColumnOffset", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E6 ), "IsocenterToCompensatorDistances", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E7 ), "CompensatorRelativeStoppingPowerRatio", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02E8 ), "CompensatorMillingToolDiameter", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02EA ), "IonRangeCompensatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x02EB ), "CompensatorDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0302 ), "RadiationMassNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0304 ), "RadiationAtomicNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0306 ), "RadiationChargeState", "SS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0308 ), "ScanMode", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x030A ), "VirtualSourceAxisDistances", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x030C ), "SnoutSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x030D ), "SnoutPosition", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x030F ), "SnoutID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0312 ), "NumberOfRangeShifters", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0314 ), "RangeShifterSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0316 ), "RangeShifterNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0318 ), "RangeShifterID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0320 ), "RangeShifterType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0322 ), "RangeShifterDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0330 ), "NumberOfLateralSpreadingDevices", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0332 ), "LateralSpreadingDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0334 ), "LateralSpreadingDeviceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0336 ), "LateralSpreadingDeviceID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0338 ), "LateralSpreadingDeviceType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x033A ), "LateralSpreadingDeviceDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x033C ), "LateralSpreadingDeviceWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0340 ), "NumberOfRangeModulators", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0342 ), "RangeModulatorSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0344 ), "RangeModulatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0346 ), "RangeModulatorID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0348 ), "RangeModulatorType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x034A ), "RangeModulatorDescription", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x034C ), "BeamCurrentModulationID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0350 ), "PatientSupportType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0352 ), "PatientSupportID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0354 ), "PatientSupportAccessoryCode", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0356 ), "FixationLightAzimuthalAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0358 ), "FixationLightPolarAngle", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x035A ), "MetersetRate", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0360 ), "RangeShifterSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0362 ), "RangeShifterSetting", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0364 ), "IsocenterToRangeShifterDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0366 ), "RangeShifterWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0370 ), "LateralSpreadingDeviceSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0372 ), "LateralSpreadingDeviceSetting", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0374 ), "IsocenterToLateralSpreadingDeviceDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0380 ), "RangeModulatorSettingsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0382 ), "RangeModulatorGatingStartValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0384 ), "RangeModulatorGatingStopValue", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0386 ), "RangeModulatorGatingStartWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0388 ), "RangeModulatorGatingStopWaterEquivalentThickness", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x038A ), "IsocenterToRangeModulatorDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0390 ), "ScanSpotTuneID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0392 ), "NumberOfScanSpotPositions", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0394 ), "ScanSpotPositionMap", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0396 ), "ScanSpotMetersetWeights", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0398 ), "ScanningSpotSize", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x039A ), "NumberOfPaintings", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03A0 ), "IonToleranceTableSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03A2 ), "IonBeamSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03A4 ), "IonBeamLimitingDeviceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03A6 ), "IonBlockSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03A8 ), "IonControlPointSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03AA ), "IonWedgeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x03AC ), "IonWedgePositionSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0401 ), "ReferencedSetupImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0402 ), "SetupImageComment", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0410 ), "MotionSynchronizationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0412 ), "ControlPointOrientation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0420 ), "GeneralAccessorySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0421 ), "GeneralAccessoryID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0422 ), "GeneralAccessoryDescription", "ST" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0423 ), "GeneralAccessoryType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0424 ), "GeneralAccessoryNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0431 ), "ApplicatorGeometrySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0432 ), "ApplicatorApertureShape", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0433 ), "ApplicatorOpening", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0434 ), "ApplicatorOpeningX", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0435 ), "ApplicatorOpeningY", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300A, 0x0436 ), "SourceToApplicatorMountingPositionDistance", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0002 ), "ReferencedRTPlanSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0004 ), "ReferencedBeamSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0006 ), "ReferencedBeamNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0007 ), "ReferencedReferenceImageNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0008 ), "StartCumulativeMetersetWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0009 ), "EndCumulativeMetersetWeight", "DS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x000A ), "ReferencedBrachyApplicationSetupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x000C ), "ReferencedBrachyApplicationSetupNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x000E ), "ReferencedSourceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0020 ), "ReferencedFractionGroupSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0022 ), "ReferencedFractionGroupNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0040 ), "ReferencedVerificationImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0042 ), "ReferencedReferenceImageSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0050 ), "ReferencedDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0051 ), "ReferencedDoseReferenceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0055 ), "BrachyReferencedDoseReferenceSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0060 ), "ReferencedStructureSetSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x006A ), "ReferencedPatientSetupNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0080 ), "ReferencedDoseSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00A0 ), "ReferencedToleranceTableNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00B0 ), "ReferencedBolusSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00C0 ), "ReferencedWedgeNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00D0 ), "ReferencedCompensatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00E0 ), "ReferencedBlockNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00F0 ), "ReferencedControlPointIndex", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00F2 ), "ReferencedControlPointSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00F4 ), "ReferencedStartControlPointIndex", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x00F6 ), "ReferencedStopControlPointIndex", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0100 ), "ReferencedRangeShifterNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0102 ), "ReferencedLateralSpreadingDeviceNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300C, 0x0104 ), "ReferencedRangeModulatorNumber", "IS" )); mAddEntry (DicomElement ( DicomTag ( 0x300E, 0x0002 ), "ApprovalStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x300E, 0x0004 ), "ReviewDate", "DA" )); mAddEntry (DicomElement ( DicomTag ( 0x300E, 0x0005 ), "ReviewTime", "TM" )); mAddEntry (DicomElement ( DicomTag ( 0x300E, 0x0008 ), "ReviewerName", "PN" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x0001 ), "LowEnergyDetectors", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x0002 ), "HighEnergyDetectors", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x0004 ), "DetectorGeometrySequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1001 ), "ThreatROIVoxelSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1004 ), "ThreatROIBase", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1005 ), "ThreatROIExtents", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1006 ), "ThreatROIBitmap", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1007 ), "RouteSegmentID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1008 ), "GantryType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1009 ), "OOIOwnerType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x100A ), "RouteSegmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1010 ), "PotentialThreatObjectID", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1011 ), "ThreatSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1012 ), "ThreatCategory", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1013 ), "ThreatCategoryDescription", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1014 ), "ATDAbilityAssessment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1015 ), "ATDAssessmentFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1016 ), "ATDAssessmentProbability", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1017 ), "Mass", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1018 ), "Density", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1019 ), "ZEffective", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x101A ), "BoardingPassID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x101B ), "CenterOfMass", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x101C ), "CenterOfPTO", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x101D ), "BoundingPolygon", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x101E ), "RouteSegmentStartLocationID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x101F ), "RouteSegmentEndLocationID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1020 ), "RouteSegmentLocationIDType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1021 ), "AbortReason", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1023 ), "VolumeOfPTO", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1024 ), "AbortFlag", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1025 ), "RouteSegmentStartTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1026 ), "RouteSegmentEndTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1027 ), "TDRType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1028 ), "InternationalRouteSegment", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1029 ), "ThreatDetectionAlgorithmandVersion", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x102A ), "AssignedLocation", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x102B ), "AlarmDecisionTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1031 ), "AlarmDecision", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1033 ), "NumberOfTotalObjects", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1034 ), "NumberOfAlarmObjects", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1037 ), "PTORepresentationSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1038 ), "ATDAssessmentSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1039 ), "TIPType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x103A ), "DICOSVersion", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1041 ), "OOIOwnerCreationTime", "DT" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1042 ), "OOIType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1043 ), "OOISize", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1044 ), "AcquisitionStatus", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1045 ), "BasisMaterialsCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1046 ), "PhantomType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1047 ), "OOIOwnerSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1048 ), "ScanType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1051 ), "ItineraryID", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1052 ), "ItineraryIDType", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1053 ), "ItineraryIDAssigningAuthority", "LO" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1054 ), "RouteID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1055 ), "RouteIDAssigningAuthority", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1056 ), "InboundArrivalType", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1058 ), "CarrierID", "SH" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1059 ), "CarrierIDAssigningAuthority", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1060 ), "SourceOrientation", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1061 ), "SourcePosition", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1062 ), "BeltHeight", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1064 ), "AlgorithmRoutingCodeSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1067 ), "TransportClassification", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1068 ), "OOITypeDescriptor", "LT" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x1069 ), "TotalProcessingTime", "FL" )); mAddEntry (DicomElement ( DicomTag ( 0x4010, 0x106C ), "DetectorCalibrationData", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0x4FFE, 0x0001 ), "MACParametersSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x5200, 0x9229 ), "SharedFunctionalGroupsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x5200, 0x9230 ), "PerFrameFunctionalGroupsSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x0100 ), "WaveformSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x0110 ), "ChannelMinimumValue", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x0112 ), "ChannelMaximumValue", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x1004 ), "WaveformBitsAllocated", "US" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x1006 ), "WaveformSampleInterpretation", "CS" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x100A ), "WaveformPaddingValue", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x5400, 0x1010 ), "WaveformData", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x5600, 0x0010 ), "FirstOrderPhaseCorrectionAngle", "OF" )); mAddEntry (DicomElement ( DicomTag ( 0x5600, 0x0020 ), "SpectroscopyData", "OF" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0010 ), "OverlayRows", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0011 ), "OverlayColumns", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0015 ), "NumberOfFramesInOverlay", "IS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0022 ), "OverlayDescription", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0040 ), "OverlayType", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0045 ), "OverlaySubtype", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0050 ), "OverlayOrigin", "SS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0051 ), "ImageFrameOrigin", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0100 ), "OverlayBitsAllocated", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x0102 ), "OverlayBitPosition", "US" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1001 ), "OverlayActivationLayer", "CS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1301 ), "ROIArea", "IS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1302 ), "ROIMean", "DS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1303 ), "ROIStandardDeviation", "DS" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x1500 ), "OverlayLabel", "LO" )); //mAddEntry (DicomElement ( DicomTag ( 0x60xx, 0x3000 ), "OverlayData", "OB or OW" )); mAddEntry (DicomElement ( DicomTag ( 0x7FE0, 0x0010 ), "PixelData", "OW or OB" )); mAddEntry (DicomElement ( DicomTag ( 0xFFFA, 0xFFFA ), "DigitalSignaturesSequence", "SQ" )); mAddEntry (DicomElement ( DicomTag ( 0xFFFC, 0xFFFC ), "DataSetTrailingPadding", "OB" )); mAddEntry (DicomElement ( DicomTag ( 0xFFFE, 0xE000 ), "Item", "" )); mAddEntry (DicomElement ( DicomTag ( 0xFFFE, 0xE00D ), "ItemDelimitationItem", "" )); mAddEntry (DicomElement ( DicomTag ( 0xFFFE, 0xE0DD ), "SequenceDelimitationItem", "" )); mriconvert/utf8proc-v1.1.6/0002755000175000000620000000000012361300460014652 5ustar stevestaffmriconvert/utf8proc-v1.1.6/ruby/0002755000175000000620000000000012361300460015633 5ustar stevestaffmriconvert/utf8proc-v1.1.6/ruby/gem/0002755000175000000620000000000012361300460016403 5ustar stevestaffmriconvert/utf8proc-v1.1.6/ruby/gem/utf8proc.gemspec0000644000175000000620000000065212361300460021523 0ustar stevestaffrequire 'rubygems' SPEC = Gem::Specification.new do |s| s.name = 'utf8proc' s.version = '1.1.6' s.author = 'Public Software Group e. V., Berlin, Germany' s.homepage = 'http://www.public-software-group.org/utf8proc' s.summary = 'UTF-8 Unicode string processing' s.files = ['LICENSE', 'lib/utf8proc.rb', 'ext/utf8proc_native.c'] s.require_path = 'lib/' s.extensions = ['ext/extconf.rb'] s.has_rdoc = false end mriconvert/utf8proc-v1.1.6/ruby/gem/LICENSE0000644000175000000620000000655012361300460017414 0ustar stevestaff Copyright (c) 2009 Public Software Group e. V., Berlin, Germany Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This software distribution contains derived data from a modified version of the Unicode data files. The following license applies to that data: COPYRIGHT AND PERMISSION NOTICE Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified. THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be registered in some jurisdictions. All other trademarks and registered trademarks mentioned herein are the property of their respective owners. mriconvert/utf8proc-v1.1.6/ruby/utf8proc_native.c0000644000175000000620000001322512361300460021120 0ustar stevestaff/* * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * File name: ruby/utf8proc_native.c * * Description: * Native part of the ruby wrapper for libutf8proc. */ #include "../utf8proc.c" #include "ruby.h" #ifndef RSTRING_PTR #define RSTRING_PTR(s) (RSTRING(s)->ptr) #endif #ifndef RSTRING_LEN #define RSTRING_LEN(s) (RSTRING(s)->len) #endif typedef struct utf8proc_ruby_mapenv_struct { int32_t *buffer; } utf8proc_ruby_mapenv_t; void utf8proc_ruby_mapenv_free(utf8proc_ruby_mapenv_t *env) { free(env->buffer); free(env); } VALUE utf8proc_ruby_module; VALUE utf8proc_ruby_options; VALUE utf8proc_ruby_eUnicodeError; VALUE utf8proc_ruby_eInvalidUtf8Error; VALUE utf8proc_ruby_eCodeNotAssignedError; VALUE utf8proc_ruby_map_error(ssize_t result) { VALUE excpt_class; switch (result) { case UTF8PROC_ERROR_NOMEM: excpt_class = rb_eNoMemError; break; case UTF8PROC_ERROR_OVERFLOW: case UTF8PROC_ERROR_INVALIDOPTS: excpt_class = rb_eArgError; break; case UTF8PROC_ERROR_INVALIDUTF8: excpt_class = utf8proc_ruby_eInvalidUtf8Error; break; case UTF8PROC_ERROR_NOTASSIGNED: excpt_class = utf8proc_ruby_eCodeNotAssignedError; break; default: excpt_class = rb_eRuntimeError; } rb_raise(excpt_class, "%s", utf8proc_errmsg(result)); return Qnil; } VALUE utf8proc_ruby_map(VALUE self, VALUE str_param, VALUE options_param) { VALUE str; int options; VALUE env_obj; utf8proc_ruby_mapenv_t *env; ssize_t result; VALUE retval; str = StringValue(str_param); options = NUM2INT(options_param) & ~UTF8PROC_NULLTERM; env_obj = Data_Make_Struct(rb_cObject, utf8proc_ruby_mapenv_t, NULL, utf8proc_ruby_mapenv_free, env); result = utf8proc_decompose(RSTRING_PTR(str), RSTRING_LEN(str), NULL, 0, options); if (result < 0) { utf8proc_ruby_map_error(result); return Qnil; /* needed to prevent problems with optimization */ } env->buffer = ALLOC_N(int32_t, result+1); result = utf8proc_decompose(RSTRING_PTR(str), RSTRING_LEN(str), env->buffer, result, options); if (result < 0) { free(env->buffer); env->buffer = 0; utf8proc_ruby_map_error(result); return Qnil; /* needed to prevent problems with optimization */ } result = utf8proc_reencode(env->buffer, result, options); if (result < 0) { free(env->buffer); env->buffer = 0; utf8proc_ruby_map_error(result); return Qnil; /* needed to prevent problems with optimization */ } retval = rb_str_new((char *)env->buffer, result); free(env->buffer); env->buffer = 0; return retval; } static VALUE utf8proc_ruby_char(VALUE self, VALUE code_param) { char buffer[4]; ssize_t result; int uc; uc = NUM2INT(code_param); if (!utf8proc_codepoint_valid(uc)) rb_raise(rb_eArgError, "Invalid Unicode code point"); result = utf8proc_encode_char(uc, buffer); return rb_str_new(buffer, result); } #define register_utf8proc_option(sym, field) \ rb_hash_aset(utf8proc_ruby_options, ID2SYM(rb_intern(sym)), INT2FIX(field)) void Init_utf8proc_native() { utf8proc_ruby_module = rb_define_module("Utf8Proc"); rb_define_module_function(utf8proc_ruby_module, "utf8map", utf8proc_ruby_map, 2); rb_define_module_function(utf8proc_ruby_module, "utf8char", utf8proc_ruby_char, 1); utf8proc_ruby_eUnicodeError = rb_define_class_under(utf8proc_ruby_module, "UnicodeError", rb_eStandardError); utf8proc_ruby_eInvalidUtf8Error = rb_define_class_under( utf8proc_ruby_module, "InvalidUtf8Error", utf8proc_ruby_eUnicodeError); utf8proc_ruby_eCodeNotAssignedError = rb_define_class_under( utf8proc_ruby_module, "CodeNotAssignedError", utf8proc_ruby_eUnicodeError); utf8proc_ruby_options = rb_hash_new(); register_utf8proc_option("stable", UTF8PROC_STABLE); register_utf8proc_option("compat", UTF8PROC_COMPAT); register_utf8proc_option("compose", UTF8PROC_COMPOSE); register_utf8proc_option("decompose", UTF8PROC_DECOMPOSE); register_utf8proc_option("ignore", UTF8PROC_IGNORE); register_utf8proc_option("rejectna", UTF8PROC_REJECTNA); register_utf8proc_option("nlf2ls", UTF8PROC_NLF2LS); register_utf8proc_option("nlf2ps", UTF8PROC_NLF2PS); register_utf8proc_option("nlf2lf", UTF8PROC_NLF2LF); register_utf8proc_option("stripcc", UTF8PROC_STRIPCC); register_utf8proc_option("casefold", UTF8PROC_CASEFOLD); register_utf8proc_option("charbound", UTF8PROC_CHARBOUND); register_utf8proc_option("lump", UTF8PROC_LUMP); register_utf8proc_option("stripmark", UTF8PROC_STRIPMARK); OBJ_FREEZE(utf8proc_ruby_options); rb_define_const(utf8proc_ruby_module, "Options", utf8proc_ruby_options); } mriconvert/utf8proc-v1.1.6/ruby/utf8proc.rb0000644000175000000620000000551212361300460017733 0ustar stevestaff# Copyright (c) 2009 Public Software Group e. V., Berlin, Germany # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # # File name: ruby/utf8proc.rb # # Description: # Part of the ruby wrapper for libutf8proc, which is written in ruby. # require 'utf8proc_native' module Utf8Proc SpecialChars = { :HT => "\x09", :LF => "\x0A", :VT => "\x0B", :FF => "\x0C", :CR => "\x0D", :FS => "\x1C", :GS => "\x1D", :RS => "\x1E", :US => "\x1F", :LS => "\xE2\x80\xA8", :PS => "\xE2\x80\xA9", } module StringExtensions def utf8map(*option_array) options = 0 option_array.each do |option| flag = Utf8Proc::Options[option] raise ArgumentError, "Unknown argument given to String#utf8map." unless flag options |= flag end return Utf8Proc::utf8map(self, options) end def utf8map!(*option_array) self.replace(self.utf8map(*option_array)) end def utf8nfd; utf8map( :stable, :decompose); end def utf8nfd!; utf8map!(:stable, :decompose); end def utf8nfc; utf8map( :stable, :compose); end def utf8nfc!; utf8map!(:stable, :compose); end def utf8nfkd; utf8map( :stable, :decompose, :compat); end def utf8nfkd!; utf8map!(:stable, :decompose, :compat); end def utf8nfkc; utf8map( :stable, :compose, :compat); end def utf8nfkc!; utf8map!(:stable, :compose, :compat); end def utf8chars result = self.utf8map(:charbound).split("\377") result.shift if result.first == "" result end def char_ary # depecated, use String#utf8chars instead utf8chars end end module IntegerExtensions def utf8 return Utf8Proc::utf8char(self) end end end class String include(Utf8Proc::StringExtensions) end class Integer include(Utf8Proc::IntegerExtensions) end mriconvert/utf8proc-v1.1.6/ruby/extconf.rb0000644000175000000620000000006212361300460017622 0ustar stevestaffrequire 'mkmf' create_makefile("utf8proc_native") mriconvert/utf8proc-v1.1.6/lump.txt0000644000175000000620000000224512361300460016371 0ustar stevestaffU+0020 <-- all space characters (general category Zs) U+0027 ' <-- left/right single quotation mark U+2018..2019, modifier letter apostrophe U+02BC, modifier letter vertical line U+02C8 U+002D - <-- all dash characters (general category Pd), minus U+2212 U+002F / <-- fraction slash U+2044, division slash U+2215 U+003A : <-- ratio U+2236 U+003C < <-- single left-pointing angle quotation mark U+2039, left-pointing angle bracket U+2329, left angle bracket U+3008 U+003E > <-- single right-pointing angle quotation mark U+203A, right-pointing angle bracket U+232A, right angle bracket U+3009 U+005C \ <-- set minus U+2216 U+005E ^ <-- modifier letter up arrowhead U+02C4, modifier letter circumflex accent U+02C6, caret U+2038, up arrowhead U+2303 U+005F _ <-- all connector characters (general category Pc), modifier letter low macron U+02CD U+0060 ` <-- modifier letter grave accent U+02CB U+007C | <-- divides U+2223 U+007E ~ <-- tilde operator U+223C mriconvert/utf8proc-v1.1.6/LICENSE0000644000175000000620000000655612361300460015671 0ustar stevestaff Copyright (c) 2009, 2013 Public Software Group e. V., Berlin, Germany Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This software distribution contains derived data from a modified version of the Unicode data files. The following license applies to that data: COPYRIGHT AND PERMISSION NOTICE Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified. THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be registered in some jurisdictions. All other trademarks and registered trademarks mentioned herein are the property of their respective owners. mriconvert/utf8proc-v1.1.6/Makefile0000644000175000000620000000355612361300460016321 0ustar stevestaff# libutf8proc Makefile # settings cflags = -O2 -std=c99 -pedantic -Wall -fpic $(CFLAGS) cc = $(CC) $(cflags) # meta targets c-library: libutf8proc.a libutf8proc.so ruby-library: ruby/utf8proc_native.so pgsql-library: pgsql/utf8proc_pgsql.so all: c-library ruby-library ruby-gem pgsql-library clean:: rm -f utf8proc.o libutf8proc.a libutf8proc.so cd ruby/ && test -e Makefile && (make clean && rm -f Makefile) || true rm -Rf ruby/gem/lib ruby/gem/ext rm -f ruby/gem/utf8proc-*.gem cd pgsql/ && make clean # real targets utf8proc.o: utf8proc.h utf8proc.c utf8proc_data.c $(cc) -c -o utf8proc.o utf8proc.c libutf8proc.a: utf8proc.o rm -f libutf8proc.a ar rs libutf8proc.a utf8proc.o libutf8proc.so: utf8proc.o $(cc) -shared -o libutf8proc.so utf8proc.o chmod a-x libutf8proc.so libutf8proc.dylib: utf8proc.o $(cc) -dynamiclib -o $@ $^ -install_name $(libdir)/$@ ruby/Makefile: ruby/extconf.rb cd ruby && ruby extconf.rb ruby/utf8proc_native.so: utf8proc.h utf8proc.c utf8proc_data.c \ ruby/utf8proc_native.c ruby/Makefile cd ruby && make ruby/gem/lib/utf8proc.rb: ruby/utf8proc.rb test -e ruby/gem/lib || mkdir ruby/gem/lib cp ruby/utf8proc.rb ruby/gem/lib/ ruby/gem/ext/extconf.rb: ruby/extconf.rb test -e ruby/gem/ext || mkdir ruby/gem/ext cp ruby/extconf.rb ruby/gem/ext/ ruby/gem/ext/utf8proc_native.c: utf8proc.h utf8proc_data.c utf8proc.c ruby/utf8proc_native.c test -e ruby/gem/ext || mkdir ruby/gem/ext cat utf8proc.h utf8proc_data.c utf8proc.c ruby/utf8proc_native.c | grep -v '#include "utf8proc.h"' | grep -v '#include "utf8proc_data.c"' | grep -v '#include "../utf8proc.c"' > ruby/gem/ext/utf8proc_native.c ruby-gem:: ruby/gem/lib/utf8proc.rb ruby/gem/ext/extconf.rb ruby/gem/ext/utf8proc_native.c cd ruby/gem && gem build utf8proc.gemspec pgsql/utf8proc_pgsql.so: utf8proc.h utf8proc.c utf8proc_data.c \ pgsql/utf8proc_pgsql.c cd pgsql && make mriconvert/utf8proc-v1.1.6/Changelog0000644000175000000620000000724312361300460016470 0ustar stevestaffChangelog 2006-06-02: - initial release of version 0.1 2006-06-05: - changed behaviour of PostgreSQL function to return NULL in case of invalid input, rather than raising an exceptional condition - improved efficiency of PostgreSQL function (no transformation to C string is done) 2006-06-20: - added -fpic compiler flag in Makefile - fixed bug in the C code for the ruby library (usage of non-existent function) Release of version 0.2 2006-07-18: - changed normalization from NFC to NFKC for postgresql unifold function 2006-08-04: - added support to mark the beginning of a grapheme cluster with 0xFF (option: CHARBOUND) - added the ruby method String#chars, which is returning an array of UTF-8 encoded grapheme clusters - added NLF2LF transformation in postgresql unifold function - added the DECOMPOSE option, if you neither use COMPOSE or DECOMPOSE, no normalization will be performed (different from previous versions) - using integer constants rather than C-strings for character properties - fixed (hopefully) a problem with the ruby library on Mac OS X, which occured when compiler optimization was switched on Release of version 0.3 2006-09-17: - added the LUMP option, which lumps certain characters together (see lump.txt) (also used for the PostgreSQL "unifold" function) - added the STRIPMARK option, which strips marking characters (or marks of composed characters) - deprecated ruby method String#char_ary in favour of String#utf8chars Release of version 1.0 2006-09-20: - included a gem file for the ruby version of the library Release of version 1.0.1 2006-09-21: - included a check in Integer#utf8, which raises an exception, if the given code-point is invalid because of being too high (this was missing yet) 2006-12-26: - added support for PostgreSQL version 8.2 Release of version 1.0.2 2007-03-16: - Fixed a bug in the ruby library, which caused an error, when splitting an empty string at grapheme cluster boundaries (method String#utf8chars). Release of version 1.0.3 2007-06-25: - Added a new PostgreSQL function 'unistrip', which behaves like 'unifold', but also removes all character marks (e.g. accents). 2007-07-22: - Changed license from BSD to MIT style. - Added a new function 'utf8proc_codepoint_valid' to the C library. - Changed compiler flags in Makefile from -g -O0 to -O2 - The ruby script, which was used to build the utf8proc_data.c file, is now included in the distribution. Release of version 1.1.1 2007-07-25: - Fixed a serious bug in the data file generator, which caused characters being treated incorrectly, when stripping default ignorable characters or calculating grapheme cluster boundaries. Release of version 1.1.2 2008-10-04: - Added a function utf8proc_version returning a string containing the version number of the library. - Included a target libutf8proc.dylib for MacOSX. 2009-05-01: - PostgreSQL 8.3 compatibility (use of SET_VARSIZE macro) Release of version 1.1.3 2009-06-14: - replaced C++ style comments for compatibility reasons - added typecasts to suppress compiler warnings - removed redundant source files for ruby-gemfile generation 2009-08-19: - Changed copyright notice for Public Software Group e. V. - Minor changes in the README file - Release of version 1.1.4 2009-08-20: - Use RSTRING_PTR() and RSTRING_LEN() instead of RSTRING()->ptr and RSTRING()->len for ruby1.9 compatibility (and #define them, if not existent) 2009-10-02: - Patches for compatibility with Microsoft Visual Studio 2009-10-08: - Fixes to make utf8proc usable in C++ programs 2009-10-16: - Release of version 1.1.5 2013-11-27: - PostgreSQL 9.2 and 9.3 compatibility (lowercase 'c' language name) - Release of version 1.1.6 mriconvert/utf8proc-v1.1.6/utf8proc.c0000644000175000000620000004750012361300460016574 0ustar stevestaff/* * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * This library contains derived data from a modified version of the * Unicode data files. * * The original data files are available at * http://www.unicode.org/Public/UNIDATA/ * * Please notice the copyright statement in the file "utf8proc_data.c". */ /* * File name: utf8proc.c * * Description: * Implementation of libutf8proc. */ #include "utf8proc.h" #include "utf8proc_data.c" const int8_t utf8proc_utf8class[256] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 }; #define UTF8PROC_HANGUL_SBASE 0xAC00 #define UTF8PROC_HANGUL_LBASE 0x1100 #define UTF8PROC_HANGUL_VBASE 0x1161 #define UTF8PROC_HANGUL_TBASE 0x11A7 #define UTF8PROC_HANGUL_LCOUNT 19 #define UTF8PROC_HANGUL_VCOUNT 21 #define UTF8PROC_HANGUL_TCOUNT 28 #define UTF8PROC_HANGUL_NCOUNT 588 #define UTF8PROC_HANGUL_SCOUNT 11172 /* END is exclusive */ #define UTF8PROC_HANGUL_L_START 0x1100 #define UTF8PROC_HANGUL_L_END 0x115A #define UTF8PROC_HANGUL_L_FILLER 0x115F #define UTF8PROC_HANGUL_V_START 0x1160 #define UTF8PROC_HANGUL_V_END 0x11A3 #define UTF8PROC_HANGUL_T_START 0x11A8 #define UTF8PROC_HANGUL_T_END 0x11FA #define UTF8PROC_HANGUL_S_START 0xAC00 #define UTF8PROC_HANGUL_S_END 0xD7A4 #define UTF8PROC_BOUNDCLASS_START 0 #define UTF8PROC_BOUNDCLASS_OTHER 1 #define UTF8PROC_BOUNDCLASS_CR 2 #define UTF8PROC_BOUNDCLASS_LF 3 #define UTF8PROC_BOUNDCLASS_CONTROL 4 #define UTF8PROC_BOUNDCLASS_EXTEND 5 #define UTF8PROC_BOUNDCLASS_L 6 #define UTF8PROC_BOUNDCLASS_V 7 #define UTF8PROC_BOUNDCLASS_T 8 #define UTF8PROC_BOUNDCLASS_LV 9 #define UTF8PROC_BOUNDCLASS_LVT 10 const char *utf8proc_version(void) { return "1.1.6"; } const char *utf8proc_errmsg(ssize_t errcode) { switch (errcode) { case UTF8PROC_ERROR_NOMEM: return "Memory for processing UTF-8 data could not be allocated."; case UTF8PROC_ERROR_OVERFLOW: return "UTF-8 string is too long to be processed."; case UTF8PROC_ERROR_INVALIDUTF8: return "Invalid UTF-8 string"; case UTF8PROC_ERROR_NOTASSIGNED: return "Unassigned Unicode code point found in UTF-8 string."; case UTF8PROC_ERROR_INVALIDOPTS: return "Invalid options for UTF-8 processing chosen."; default: return "An unknown error occured while processing UTF-8 data."; } } ssize_t utf8proc_iterate( const uint8_t *str, ssize_t strlen, int32_t *dst ) { int length; int i; int32_t uc = -1; *dst = -1; if (!strlen) return 0; length = utf8proc_utf8class[str[0]]; if (!length) return UTF8PROC_ERROR_INVALIDUTF8; if (strlen >= 0 && length > strlen) return UTF8PROC_ERROR_INVALIDUTF8; for (i=1; i= 0xD800 && uc < 0xE000) || (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1; break; case 4: uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F); if (uc < 0x10000 || uc >= 0x110000) uc = -1; break; } if (uc < 0 || ((uc & 0xFFFF) >= 0xFFFE)) return UTF8PROC_ERROR_INVALIDUTF8; *dst = uc; return length; } bool utf8proc_codepoint_valid(int32_t uc) { if (uc < 0 || uc >= 0x110000 || ((uc & 0xFFFF) >= 0xFFFE) || (uc >= 0xD800 && uc < 0xE000) || (uc >= 0xFDD0 && uc < 0xFDF0)) return false; else return true; } ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst) { if (uc < 0x00) { return 0; } else if (uc < 0x80) { dst[0] = uc; return 1; } else if (uc < 0x800) { dst[0] = 0xC0 + (uc >> 6); dst[1] = 0x80 + (uc & 0x3F); return 2; } else if (uc == 0xFFFF) { dst[0] = 0xFF; return 1; } else if (uc == 0xFFFE) { dst[0] = 0xFE; return 1; } else if (uc < 0x10000) { dst[0] = 0xE0 + (uc >> 12); dst[1] = 0x80 + ((uc >> 6) & 0x3F); dst[2] = 0x80 + (uc & 0x3F); return 3; } else if (uc < 0x110000) { dst[0] = 0xF0 + (uc >> 18); dst[1] = 0x80 + ((uc >> 12) & 0x3F); dst[2] = 0x80 + ((uc >> 6) & 0x3F); dst[3] = 0x80 + (uc & 0x3F); return 4; } else return 0; } const utf8proc_property_t *utf8proc_get_property(int32_t uc) { /* ASSERT: uc >= 0 && uc < 0x110000 */ return utf8proc_properties + ( utf8proc_stage2table[ utf8proc_stage1table[uc >> 8] + (uc & 0xFF) ] ); } #define utf8proc_decompose_lump(replacement_uc) \ return utf8proc_decompose_char((replacement_uc), dst, bufsize, \ options & ~UTF8PROC_LUMP, last_boundclass) ssize_t utf8proc_decompose_char(int32_t uc, int32_t *dst, ssize_t bufsize, int options, int *last_boundclass) { /* ASSERT: uc >= 0 && uc < 0x110000 */ const utf8proc_property_t *property; utf8proc_propval_t category; int32_t hangul_sindex; property = utf8proc_get_property(uc); category = property->category; hangul_sindex = uc - UTF8PROC_HANGUL_SBASE; if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) { if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) { int32_t hangul_tindex; if (bufsize >= 1) { dst[0] = UTF8PROC_HANGUL_LBASE + hangul_sindex / UTF8PROC_HANGUL_NCOUNT; if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE + (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT; } hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT; if (!hangul_tindex) return 2; if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex; return 3; } } if (options & UTF8PROC_REJECTNA) { if (!category) return UTF8PROC_ERROR_NOTASSIGNED; } if (options & UTF8PROC_IGNORE) { if (property->ignorable) return 0; } if (options & UTF8PROC_LUMP) { if (category == UTF8PROC_CATEGORY_ZS) utf8proc_decompose_lump(0x0020); if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8) utf8proc_decompose_lump(0x0027); if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212) utf8proc_decompose_lump(0x002D); if (uc == 0x2044 || uc == 0x2215) utf8proc_decompose_lump(0x002F); if (uc == 0x2236) utf8proc_decompose_lump(0x003A); if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008) utf8proc_decompose_lump(0x003C); if (uc == 0x203A || uc == 0x232A || uc == 0x3009) utf8proc_decompose_lump(0x003E); if (uc == 0x2216) utf8proc_decompose_lump(0x005C); if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303) utf8proc_decompose_lump(0x005E); if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD) utf8proc_decompose_lump(0x005F); if (uc == 0x02CB) utf8proc_decompose_lump(0x0060); if (uc == 0x2223) utf8proc_decompose_lump(0x007C); if (uc == 0x223C) utf8proc_decompose_lump(0x007E); if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) { if (category == UTF8PROC_CATEGORY_ZL || category == UTF8PROC_CATEGORY_ZP) utf8proc_decompose_lump(0x000A); } } if (options & UTF8PROC_STRIPMARK) { if (category == UTF8PROC_CATEGORY_MN || category == UTF8PROC_CATEGORY_MC || category == UTF8PROC_CATEGORY_ME) return 0; } if (options & UTF8PROC_CASEFOLD) { if (property->casefold_mapping) { const int32_t *casefold_entry; ssize_t written = 0; for (casefold_entry = property->casefold_mapping; *casefold_entry >= 0; casefold_entry++) { written += utf8proc_decompose_char(*casefold_entry, dst+written, (bufsize > written) ? (bufsize - written) : 0, options, last_boundclass); if (written < 0) return UTF8PROC_ERROR_OVERFLOW; } return written; } } if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) { if (property->decomp_mapping && (!property->decomp_type || (options & UTF8PROC_COMPAT))) { const int32_t *decomp_entry; ssize_t written = 0; for (decomp_entry = property->decomp_mapping; *decomp_entry >= 0; decomp_entry++) { written += utf8proc_decompose_char(*decomp_entry, dst+written, (bufsize > written) ? (bufsize - written) : 0, options, last_boundclass); if (written < 0) return UTF8PROC_ERROR_OVERFLOW; } return written; } } if (options & UTF8PROC_CHARBOUND) { bool boundary; int tbc, lbc; tbc = (uc == 0x000D) ? UTF8PROC_BOUNDCLASS_CR : (uc == 0x000A) ? UTF8PROC_BOUNDCLASS_LF : ((category == UTF8PROC_CATEGORY_ZL || category == UTF8PROC_CATEGORY_ZP || category == UTF8PROC_CATEGORY_CC || category == UTF8PROC_CATEGORY_CF) && !(uc == 0x200C || uc == 0x200D)) ? UTF8PROC_BOUNDCLASS_CONTROL : property->extend ? UTF8PROC_BOUNDCLASS_EXTEND : ((uc >= UTF8PROC_HANGUL_L_START && uc < UTF8PROC_HANGUL_L_END) || uc == UTF8PROC_HANGUL_L_FILLER) ? UTF8PROC_BOUNDCLASS_L : (uc >= UTF8PROC_HANGUL_V_START && uc < UTF8PROC_HANGUL_V_END) ? UTF8PROC_BOUNDCLASS_V : (uc >= UTF8PROC_HANGUL_T_START && uc < UTF8PROC_HANGUL_T_END) ? UTF8PROC_BOUNDCLASS_T : (uc >= UTF8PROC_HANGUL_S_START && uc < UTF8PROC_HANGUL_S_END) ? ( ((uc-UTF8PROC_HANGUL_SBASE) % UTF8PROC_HANGUL_TCOUNT == 0) ? UTF8PROC_BOUNDCLASS_LV : UTF8PROC_BOUNDCLASS_LVT ) : UTF8PROC_BOUNDCLASS_OTHER; lbc = *last_boundclass; boundary = (tbc == UTF8PROC_BOUNDCLASS_EXTEND) ? false : (lbc == UTF8PROC_BOUNDCLASS_START) ? true : (lbc == UTF8PROC_BOUNDCLASS_CR && tbc == UTF8PROC_BOUNDCLASS_LF) ? false : (lbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true : (tbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true : (lbc == UTF8PROC_BOUNDCLASS_L && (tbc == UTF8PROC_BOUNDCLASS_L || tbc == UTF8PROC_BOUNDCLASS_V || tbc == UTF8PROC_BOUNDCLASS_LV || tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false : ((lbc == UTF8PROC_BOUNDCLASS_LV || lbc == UTF8PROC_BOUNDCLASS_V) && (tbc == UTF8PROC_BOUNDCLASS_V || tbc == UTF8PROC_BOUNDCLASS_T)) ? false : ((lbc == UTF8PROC_BOUNDCLASS_LVT || lbc == UTF8PROC_BOUNDCLASS_T) && tbc == UTF8PROC_BOUNDCLASS_T) ? false : true; *last_boundclass = tbc; if (boundary) { if (bufsize >= 1) dst[0] = 0xFFFF; if (bufsize >= 2) dst[1] = uc; return 2; } } if (bufsize >= 1) *dst = uc; return 1; } ssize_t utf8proc_decompose( const uint8_t *str, ssize_t strlen, int32_t *buffer, ssize_t bufsize, int options ) { /* strlen will be ignored, if UTF8PROC_NULLTERM is set in options */ ssize_t wpos = 0; if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE)) return UTF8PROC_ERROR_INVALIDOPTS; if ((options & UTF8PROC_STRIPMARK) && !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE)) return UTF8PROC_ERROR_INVALIDOPTS; { int32_t uc; ssize_t rpos = 0; ssize_t decomp_result; int boundclass = UTF8PROC_BOUNDCLASS_START; while (1) { if (options & UTF8PROC_NULLTERM) { rpos += utf8proc_iterate(str + rpos, -1, &uc); /* checking of return value is not neccessary, as 'uc' is < 0 in case of error */ if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8; if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW; if (uc == 0) break; } else { if (rpos >= strlen) break; rpos += utf8proc_iterate(str + rpos, strlen - rpos, &uc); if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8; } decomp_result = utf8proc_decompose_char( uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options, &boundclass ); if (decomp_result < 0) return decomp_result; wpos += decomp_result; /* prohibiting integer overflows due to too long strings: */ if (wpos < 0 || wpos > SSIZE_MAX/sizeof(int32_t)/2) return UTF8PROC_ERROR_OVERFLOW; } } if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) { ssize_t pos = 0; while (pos < wpos-1) { int32_t uc1, uc2; const utf8proc_property_t *property1, *property2; uc1 = buffer[pos]; uc2 = buffer[pos+1]; property1 = utf8proc_get_property(uc1); property2 = utf8proc_get_property(uc2); if (property1->combining_class > property2->combining_class && property2->combining_class > 0) { buffer[pos] = uc2; buffer[pos+1] = uc1; if (pos > 0) pos--; else pos++; } else { pos++; } } } return wpos; } ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options) { /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored ASSERT: 'buffer' has one spare byte of free space at the end! */ if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) { ssize_t rpos; ssize_t wpos = 0; int32_t uc; for (rpos = 0; rpos < length; rpos++) { uc = buffer[rpos]; if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++; if (uc == 0x000A || uc == 0x000D || uc == 0x0085 || ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) { if (options & UTF8PROC_NLF2LS) { if (options & UTF8PROC_NLF2PS) { buffer[wpos++] = 0x000A; } else { buffer[wpos++] = 0x2028; } } else { if (options & UTF8PROC_NLF2PS) { buffer[wpos++] = 0x2029; } else { buffer[wpos++] = 0x0020; } } } else if ((options & UTF8PROC_STRIPCC) && (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) { if (uc == 0x0009) buffer[wpos++] = 0x0020; } else { buffer[wpos++] = uc; } } length = wpos; } if (options & UTF8PROC_COMPOSE) { int32_t *starter = NULL; int32_t current_char; const utf8proc_property_t *starter_property = NULL, *current_property; utf8proc_propval_t max_combining_class = -1; ssize_t rpos; ssize_t wpos = 0; int32_t composition; for (rpos = 0; rpos < length; rpos++) { current_char = buffer[rpos]; current_property = utf8proc_get_property(current_char); if (starter && current_property->combining_class > max_combining_class) { /* combination perhaps possible */ int32_t hangul_lindex; int32_t hangul_sindex; hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE; if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) { int32_t hangul_vindex; hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE; if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) { *starter = UTF8PROC_HANGUL_SBASE + (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) * UTF8PROC_HANGUL_TCOUNT; starter_property = NULL; continue; } } hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE; if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT && (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) { int32_t hangul_tindex; hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE; if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) { *starter += hangul_tindex; starter_property = NULL; continue; } } if (!starter_property) { starter_property = utf8proc_get_property(*starter); } if (starter_property->comb1st_index >= 0 && current_property->comb2nd_index >= 0) { composition = utf8proc_combinations[ starter_property->comb1st_index + current_property->comb2nd_index ]; if (composition >= 0 && (!(options & UTF8PROC_STABLE) || !(utf8proc_get_property(composition)->comp_exclusion))) { *starter = composition; starter_property = NULL; continue; } } } buffer[wpos] = current_char; if (current_property->combining_class) { if (current_property->combining_class > max_combining_class) { max_combining_class = current_property->combining_class; } } else { starter = buffer + wpos; starter_property = NULL; max_combining_class = -1; } wpos++; } length = wpos; } { ssize_t rpos, wpos = 0; int32_t uc; for (rpos = 0; rpos < length; rpos++) { uc = buffer[rpos]; wpos += utf8proc_encode_char(uc, ((uint8_t *)buffer) + wpos); } ((uint8_t *)buffer)[wpos] = 0; return wpos; } } ssize_t utf8proc_map( const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options ) { int32_t *buffer; ssize_t result; *dstptr = NULL; result = utf8proc_decompose(str, strlen, NULL, 0, options); if (result < 0) return result; buffer = malloc(result * sizeof(int32_t) + 1); if (!buffer) return UTF8PROC_ERROR_NOMEM; result = utf8proc_decompose(str, strlen, buffer, result, options); if (result < 0) { free(buffer); return result; } result = utf8proc_reencode(buffer, result, options); if (result < 0) { free(buffer); return result; } { int32_t *newptr; newptr = realloc(buffer, (size_t)result+1); if (newptr) buffer = newptr; } *dstptr = (uint8_t *)buffer; return result; } uint8_t *utf8proc_NFD(const uint8_t *str) { uint8_t *retval; utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | UTF8PROC_DECOMPOSE); return retval; } uint8_t *utf8proc_NFC(const uint8_t *str) { uint8_t *retval; utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | UTF8PROC_COMPOSE); return retval; } uint8_t *utf8proc_NFKD(const uint8_t *str) { uint8_t *retval; utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT); return retval; } uint8_t *utf8proc_NFKC(const uint8_t *str) { uint8_t *retval; utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | UTF8PROC_COMPOSE | UTF8PROC_COMPAT); return retval; } mriconvert/utf8proc-v1.1.6/pgsql/0002755000175000000620000000000012361300460016000 5ustar stevestaffmriconvert/utf8proc-v1.1.6/pgsql/utf8proc_pgsql.c0000644000175000000620000001102512361300460021121 0ustar stevestaff/* * Copyright (c) Public Software Group e. V., Berlin, Germany * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * File name: pgsql/utf8proc_pgsql.c * * Description: * PostgreSQL extension to provide two functions 'unifold' and 'unistrip', * which can be used to case-fold and normalize index fields and * optionally strip marks (e.g. accents) from strings. */ #include "../utf8proc.c" #include #include #include #include #include #include #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif #define UTF8PROC_PGSQL_FOLD_OPTS ( UTF8PROC_REJECTNA | UTF8PROC_COMPAT | \ UTF8PROC_COMPOSE | UTF8PROC_STABLE | UTF8PROC_IGNORE | UTF8PROC_STRIPCC | \ UTF8PROC_NLF2LF | UTF8PROC_CASEFOLD | UTF8PROC_LUMP ) #define UTF8PROC_PGSQL_STRIP_OPTS ( UTF8PROC_REJECTNA | UTF8PROC_COMPAT | \ UTF8PROC_COMPOSE | UTF8PROC_STABLE | UTF8PROC_IGNORE | UTF8PROC_STRIPCC | \ UTF8PROC_NLF2LF | UTF8PROC_CASEFOLD | UTF8PROC_LUMP | UTF8PROC_STRIPMARK ) ssize_t utf8proc_pgsql_utf8map( text *input_string, text **output_string_ptr, int options ) { ssize_t result; text *output_string; result = utf8proc_decompose( VARDATA(input_string), VARSIZE(input_string) - VARHDRSZ, NULL, 0, options ); if (result < 0) return result; if (result > (SIZE_MAX-1-VARHDRSZ)/sizeof(int32_t)) return UTF8PROC_ERROR_OVERFLOW; /* reserve one extra byte for termination */ *output_string_ptr = palloc(result * sizeof(int32_t) + 1 + VARHDRSZ); output_string = *output_string_ptr; if (!output_string) return UTF8PROC_ERROR_NOMEM; result = utf8proc_decompose( VARDATA(input_string), VARSIZE(input_string) - VARHDRSZ, (int32_t *)VARDATA(output_string), result, options ); if (result < 0) return result; result = utf8proc_reencode( (int32_t *)VARDATA(output_string), result, options ); if (result >= 0) SET_VARSIZE(output_string, result + VARHDRSZ); return result; } void utf8proc_pgsql_utf8map_errchk(ssize_t result, text *output_string) { if (result < 0) { int sqlerrcode; if (output_string) pfree(output_string); switch(result) { case UTF8PROC_ERROR_NOMEM: sqlerrcode = ERRCODE_OUT_OF_MEMORY; break; case UTF8PROC_ERROR_OVERFLOW: sqlerrcode = ERRCODE_PROGRAM_LIMIT_EXCEEDED; break; case UTF8PROC_ERROR_INVALIDUTF8: case UTF8PROC_ERROR_NOTASSIGNED: return; default: sqlerrcode = ERRCODE_INTERNAL_ERROR; } ereport(ERROR, ( errcode(sqlerrcode), errmsg("%s", utf8proc_errmsg(result)) )); } } PG_FUNCTION_INFO_V1(utf8proc_pgsql_unifold); Datum utf8proc_pgsql_unifold(PG_FUNCTION_ARGS) { text *input_string; text *output_string = NULL; ssize_t result; input_string = PG_GETARG_TEXT_P(0); result = utf8proc_pgsql_utf8map( input_string, &output_string, UTF8PROC_PGSQL_FOLD_OPTS ); PG_FREE_IF_COPY(input_string, 0); utf8proc_pgsql_utf8map_errchk(result, output_string); if (result >= 0) { PG_RETURN_TEXT_P(output_string); } else { PG_RETURN_NULL(); } } PG_FUNCTION_INFO_V1(utf8proc_pgsql_unistrip); Datum utf8proc_pgsql_unistrip(PG_FUNCTION_ARGS) { text *input_string; text *output_string = NULL; ssize_t result; input_string = PG_GETARG_TEXT_P(0); result = utf8proc_pgsql_utf8map( input_string, &output_string, UTF8PROC_PGSQL_STRIP_OPTS ); PG_FREE_IF_COPY(input_string, 0); utf8proc_pgsql_utf8map_errchk(result, output_string); if (result >= 0) { PG_RETURN_TEXT_P(output_string); } else { PG_RETURN_NULL(); } } mriconvert/utf8proc-v1.1.6/pgsql/Makefile0000644000175000000620000000036212361300460017437 0ustar stevestaffutf8proc_pgsql.so: utf8proc_pgsql.o ld -shared -o utf8proc_pgsql.so utf8proc_pgsql.o utf8proc_pgsql.o: utf8proc_pgsql.c gcc -Wall -fpic -c -I`pg_config --includedir-server` \ -o utf8proc_pgsql.o utf8proc_pgsql.c clean: rm -f *.o *.so mriconvert/utf8proc-v1.1.6/pgsql/utf8proc.sql0000644000175000000620000000045012361300460020270 0ustar stevestaffCREATE OR REPLACE FUNCTION unifold (text) RETURNS text LANGUAGE 'c' IMMUTABLE STRICT AS '$libdir/utf8proc_pgsql.so', 'utf8proc_pgsql_unifold'; CREATE OR REPLACE FUNCTION unistrip (text) RETURNS text LANGUAGE 'c' IMMUTABLE STRICT AS '$libdir/utf8proc_pgsql.so', 'utf8proc_pgsql_unistrip'; mriconvert/utf8proc-v1.1.6/utf8proc_data.c0000644000175000000620000440503412361300460017571 0ustar stevestaff/* * This file contains derived data from a modified version of the * Unicode data files. * * The original data files are available at * http://www.unicode.org/Public/UNIDATA/ * * * COPYRIGHT AND PERMISSION NOTICE * * Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed * under the Terms of Use in http://www.unicode.org/copyright.html. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of the Unicode data files and any associated documentation (the "Data * Files") or Unicode software and any associated documentation (the * "Software") to deal in the Data Files or Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, and/or sell copies of the Data Files or Software, and * to permit persons to whom the Data Files or Software are furnished to do * so, provided that (a) the above copyright notice(s) and this permission * notice appear with all copies of the Data Files or Software, (b) both the * above copyright notice(s) and this permission notice appear in associated * documentation, and (c) there is clear notice in each modified Data File or * in the Software as well as in the documentation associated with the Data * File(s) or Software that the data or software has been modified. * * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THE DATA FILES OR SOFTWARE. * * Except as contained in this notice, the name of a copyright holder shall * not be used in advertising or otherwise to promote the sale, use or other * dealings in these Data Files or Software without prior written * authorization of the copyright holder. */ const int32_t utf8proc_sequences[] = { 97, -1, 98, -1, 99, -1, 100, -1, 101, -1, 102, -1, 103, -1, 104, -1, 105, -1, 106, -1, 107, -1, 108, -1, 109, -1, 110, -1, 111, -1, 112, -1, 113, -1, 114, -1, 115, -1, 116, -1, 117, -1, 118, -1, 119, -1, 120, -1, 121, -1, 122, -1, 32, -1, 32, 776, -1, 32, 772, -1, 50, -1, 51, -1, 32, 769, -1, 956, -1, 32, 807, -1, 49, -1, 49, 8260, 52, -1, 49, 8260, 50, -1, 51, 8260, 52, -1, 65, 768, -1, 224, -1, 65, 769, -1, 225, -1, 65, 770, -1, 226, -1, 65, 771, -1, 227, -1, 65, 776, -1, 228, -1, 65, 778, -1, 229, -1, 230, -1, 67, 807, -1, 231, -1, 69, 768, -1, 232, -1, 69, 769, -1, 233, -1, 69, 770, -1, 234, -1, 69, 776, -1, 235, -1, 73, 768, -1, 236, -1, 73, 769, -1, 237, -1, 73, 770, -1, 238, -1, 73, 776, -1, 239, -1, 240, -1, 78, 771, -1, 241, -1, 79, 768, -1, 242, -1, 79, 769, -1, 243, -1, 79, 770, -1, 244, -1, 79, 771, -1, 245, -1, 79, 776, -1, 246, -1, 248, -1, 85, 768, -1, 249, -1, 85, 769, -1, 250, -1, 85, 770, -1, 251, -1, 85, 776, -1, 252, -1, 89, 769, -1, 253, -1, 254, -1, 115, 115, -1, 97, 768, -1, 97, 769, -1, 97, 770, -1, 97, 771, -1, 97, 776, -1, 97, 778, -1, 99, 807, -1, 101, 768, -1, 101, 769, -1, 101, 770, -1, 101, 776, -1, 105, 768, -1, 105, 769, -1, 105, 770, -1, 105, 776, -1, 110, 771, -1, 111, 768, -1, 111, 769, -1, 111, 770, -1, 111, 771, -1, 111, 776, -1, 117, 768, -1, 117, 769, -1, 117, 770, -1, 117, 776, -1, 121, 769, -1, 121, 776, -1, 65, 772, -1, 257, -1, 97, 772, -1, 65, 774, -1, 259, -1, 97, 774, -1, 65, 808, -1, 261, -1, 97, 808, -1, 67, 769, -1, 263, -1, 99, 769, -1, 67, 770, -1, 265, -1, 99, 770, -1, 67, 775, -1, 267, -1, 99, 775, -1, 67, 780, -1, 269, -1, 99, 780, -1, 68, 780, -1, 271, -1, 100, 780, -1, 273, -1, 69, 772, -1, 275, -1, 101, 772, -1, 69, 774, -1, 277, -1, 101, 774, -1, 69, 775, -1, 279, -1, 101, 775, -1, 69, 808, -1, 281, -1, 101, 808, -1, 69, 780, -1, 283, -1, 101, 780, -1, 71, 770, -1, 285, -1, 103, 770, -1, 71, 774, -1, 287, -1, 103, 774, -1, 71, 775, -1, 289, -1, 103, 775, -1, 71, 807, -1, 291, -1, 103, 807, -1, 72, 770, -1, 293, -1, 104, 770, -1, 295, -1, 73, 771, -1, 297, -1, 105, 771, -1, 73, 772, -1, 299, -1, 105, 772, -1, 73, 774, -1, 301, -1, 105, 774, -1, 73, 808, -1, 303, -1, 105, 808, -1, 73, 775, -1, 105, 775, -1, 73, 74, -1, 307, -1, 105, 106, -1, 74, 770, -1, 309, -1, 106, 770, -1, 75, 807, -1, 311, -1, 107, 807, -1, 76, 769, -1, 314, -1, 108, 769, -1, 76, 807, -1, 316, -1, 108, 807, -1, 76, 780, -1, 318, -1, 108, 780, -1, 76, 183, -1, 320, -1, 108, 183, -1, 322, -1, 78, 769, -1, 324, -1, 110, 769, -1, 78, 807, -1, 326, -1, 110, 807, -1, 78, 780, -1, 328, -1, 110, 780, -1, 700, 110, -1, 331, -1, 79, 772, -1, 333, -1, 111, 772, -1, 79, 774, -1, 335, -1, 111, 774, -1, 79, 779, -1, 337, -1, 111, 779, -1, 339, -1, 82, 769, -1, 341, -1, 114, 769, -1, 82, 807, -1, 343, -1, 114, 807, -1, 82, 780, -1, 345, -1, 114, 780, -1, 83, 769, -1, 347, -1, 115, 769, -1, 83, 770, -1, 349, -1, 115, 770, -1, 83, 807, -1, 351, -1, 115, 807, -1, 83, 780, -1, 353, -1, 115, 780, -1, 84, 807, -1, 355, -1, 116, 807, -1, 84, 780, -1, 357, -1, 116, 780, -1, 359, -1, 85, 771, -1, 361, -1, 117, 771, -1, 85, 772, -1, 363, -1, 117, 772, -1, 85, 774, -1, 365, -1, 117, 774, -1, 85, 778, -1, 367, -1, 117, 778, -1, 85, 779, -1, 369, -1, 117, 779, -1, 85, 808, -1, 371, -1, 117, 808, -1, 87, 770, -1, 373, -1, 119, 770, -1, 89, 770, -1, 375, -1, 121, 770, -1, 89, 776, -1, 255, -1, 90, 769, -1, 378, -1, 122, 769, -1, 90, 775, -1, 380, -1, 122, 775, -1, 90, 780, -1, 382, -1, 122, 780, -1, 595, -1, 387, -1, 389, -1, 596, -1, 392, -1, 598, -1, 599, -1, 396, -1, 477, -1, 601, -1, 603, -1, 402, -1, 608, -1, 611, -1, 617, -1, 616, -1, 409, -1, 623, -1, 626, -1, 629, -1, 79, 795, -1, 417, -1, 111, 795, -1, 419, -1, 421, -1, 640, -1, 424, -1, 643, -1, 429, -1, 648, -1, 85, 795, -1, 432, -1, 117, 795, -1, 650, -1, 651, -1, 436, -1, 438, -1, 658, -1, 441, -1, 445, -1, 68, 381, -1, 454, -1, 68, 382, -1, 100, 382, -1, 76, 74, -1, 457, -1, 76, 106, -1, 108, 106, -1, 78, 74, -1, 460, -1, 78, 106, -1, 110, 106, -1, 65, 780, -1, 462, -1, 97, 780, -1, 73, 780, -1, 464, -1, 105, 780, -1, 79, 780, -1, 466, -1, 111, 780, -1, 85, 780, -1, 468, -1, 117, 780, -1, 220, 772, -1, 470, -1, 252, 772, -1, 220, 769, -1, 472, -1, 252, 769, -1, 220, 780, -1, 474, -1, 252, 780, -1, 220, 768, -1, 476, -1, 252, 768, -1, 196, 772, -1, 479, -1, 228, 772, -1, 550, 772, -1, 481, -1, 551, 772, -1, 198, 772, -1, 483, -1, 230, 772, -1, 485, -1, 71, 780, -1, 487, -1, 103, 780, -1, 75, 780, -1, 489, -1, 107, 780, -1, 79, 808, -1, 491, -1, 111, 808, -1, 490, 772, -1, 493, -1, 491, 772, -1, 439, 780, -1, 495, -1, 658, 780, -1, 106, 780, -1, 68, 90, -1, 499, -1, 68, 122, -1, 100, 122, -1, 71, 769, -1, 501, -1, 103, 769, -1, 405, -1, 447, -1, 78, 768, -1, 505, -1, 110, 768, -1, 197, 769, -1, 507, -1, 229, 769, -1, 198, 769, -1, 509, -1, 230, 769, -1, 216, 769, -1, 511, -1, 248, 769, -1, 65, 783, -1, 513, -1, 97, 783, -1, 65, 785, -1, 515, -1, 97, 785, -1, 69, 783, -1, 517, -1, 101, 783, -1, 69, 785, -1, 519, -1, 101, 785, -1, 73, 783, -1, 521, -1, 105, 783, -1, 73, 785, -1, 523, -1, 105, 785, -1, 79, 783, -1, 525, -1, 111, 783, -1, 79, 785, -1, 527, -1, 111, 785, -1, 82, 783, -1, 529, -1, 114, 783, -1, 82, 785, -1, 531, -1, 114, 785, -1, 85, 783, -1, 533, -1, 117, 783, -1, 85, 785, -1, 535, -1, 117, 785, -1, 83, 806, -1, 537, -1, 115, 806, -1, 84, 806, -1, 539, -1, 116, 806, -1, 541, -1, 72, 780, -1, 543, -1, 104, 780, -1, 414, -1, 547, -1, 549, -1, 65, 775, -1, 551, -1, 97, 775, -1, 69, 807, -1, 553, -1, 101, 807, -1, 214, 772, -1, 555, -1, 246, 772, -1, 213, 772, -1, 557, -1, 245, 772, -1, 79, 775, -1, 559, -1, 111, 775, -1, 558, 772, -1, 561, -1, 559, 772, -1, 89, 772, -1, 563, -1, 121, 772, -1, 11365, -1, 572, -1, 410, -1, 11366, -1, 578, -1, 384, -1, 649, -1, 652, -1, 583, -1, 585, -1, 587, -1, 589, -1, 591, -1, 614, -1, 633, -1, 635, -1, 641, -1, 32, 774, -1, 32, 775, -1, 32, 778, -1, 32, 808, -1, 32, 771, -1, 32, 779, -1, 661, -1, 768, -1, 769, -1, 787, -1, 776, 769, -1, 953, -1, 697, -1, 32, 837, -1, 59, -1, 168, 769, -1, 913, 769, -1, 940, -1, 183, -1, 917, 769, -1, 941, -1, 919, 769, -1, 942, -1, 921, 769, -1, 943, -1, 927, 769, -1, 972, -1, 933, 769, -1, 973, -1, 937, 769, -1, 974, -1, 970, 769, -1, 953, 776, 769, -1, 945, -1, 946, -1, 947, -1, 948, -1, 949, -1, 950, -1, 951, -1, 952, -1, 954, -1, 955, -1, 957, -1, 958, -1, 959, -1, 960, -1, 961, -1, 963, -1, 964, -1, 965, -1, 966, -1, 967, -1, 968, -1, 969, -1, 921, 776, -1, 970, -1, 933, 776, -1, 971, -1, 945, 769, -1, 949, 769, -1, 951, 769, -1, 953, 769, -1, 971, 769, -1, 965, 776, 769, -1, 953, 776, -1, 965, 776, -1, 959, 769, -1, 965, 769, -1, 969, 769, -1, 933, -1, 978, 769, -1, 978, 776, -1, 985, -1, 987, -1, 989, -1, 991, -1, 993, -1, 995, -1, 997, -1, 999, -1, 1001, -1, 1003, -1, 1005, -1, 1007, -1, 962, -1, 920, -1, 1016, -1, 931, -1, 1010, -1, 1019, -1, 891, -1, 892, -1, 893, -1, 1045, 768, -1, 1104, -1, 1045, 776, -1, 1105, -1, 1106, -1, 1043, 769, -1, 1107, -1, 1108, -1, 1109, -1, 1110, -1, 1030, 776, -1, 1111, -1, 1112, -1, 1113, -1, 1114, -1, 1115, -1, 1050, 769, -1, 1116, -1, 1048, 768, -1, 1117, -1, 1059, 774, -1, 1118, -1, 1119, -1, 1072, -1, 1073, -1, 1074, -1, 1075, -1, 1076, -1, 1077, -1, 1078, -1, 1079, -1, 1080, -1, 1048, 774, -1, 1081, -1, 1082, -1, 1083, -1, 1084, -1, 1085, -1, 1086, -1, 1087, -1, 1088, -1, 1089, -1, 1090, -1, 1091, -1, 1092, -1, 1093, -1, 1094, -1, 1095, -1, 1096, -1, 1097, -1, 1098, -1, 1099, -1, 1100, -1, 1101, -1, 1102, -1, 1103, -1, 1080, 774, -1, 1077, 768, -1, 1077, 776, -1, 1075, 769, -1, 1110, 776, -1, 1082, 769, -1, 1080, 768, -1, 1091, 774, -1, 1121, -1, 1123, -1, 1125, -1, 1127, -1, 1129, -1, 1131, -1, 1133, -1, 1135, -1, 1137, -1, 1139, -1, 1141, -1, 1140, 783, -1, 1143, -1, 1141, 783, -1, 1145, -1, 1147, -1, 1149, -1, 1151, -1, 1153, -1, 1163, -1, 1165, -1, 1167, -1, 1169, -1, 1171, -1, 1173, -1, 1175, -1, 1177, -1, 1179, -1, 1181, -1, 1183, -1, 1185, -1, 1187, -1, 1189, -1, 1191, -1, 1193, -1, 1195, -1, 1197, -1, 1199, -1, 1201, -1, 1203, -1, 1205, -1, 1207, -1, 1209, -1, 1211, -1, 1213, -1, 1215, -1, 1231, -1, 1046, 774, -1, 1218, -1, 1078, 774, -1, 1220, -1, 1222, -1, 1224, -1, 1226, -1, 1228, -1, 1230, -1, 1040, 774, -1, 1233, -1, 1072, 774, -1, 1040, 776, -1, 1235, -1, 1072, 776, -1, 1237, -1, 1045, 774, -1, 1239, -1, 1077, 774, -1, 1241, -1, 1240, 776, -1, 1243, -1, 1241, 776, -1, 1046, 776, -1, 1245, -1, 1078, 776, -1, 1047, 776, -1, 1247, -1, 1079, 776, -1, 1249, -1, 1048, 772, -1, 1251, -1, 1080, 772, -1, 1048, 776, -1, 1253, -1, 1080, 776, -1, 1054, 776, -1, 1255, -1, 1086, 776, -1, 1257, -1, 1256, 776, -1, 1259, -1, 1257, 776, -1, 1069, 776, -1, 1261, -1, 1101, 776, -1, 1059, 772, -1, 1263, -1, 1091, 772, -1, 1059, 776, -1, 1265, -1, 1091, 776, -1, 1059, 779, -1, 1267, -1, 1091, 779, -1, 1063, 776, -1, 1269, -1, 1095, 776, -1, 1271, -1, 1067, 776, -1, 1273, -1, 1099, 776, -1, 1275, -1, 1277, -1, 1279, -1, 1281, -1, 1283, -1, 1285, -1, 1287, -1, 1289, -1, 1291, -1, 1293, -1, 1295, -1, 1297, -1, 1299, -1, 1377, -1, 1378, -1, 1379, -1, 1380, -1, 1381, -1, 1382, -1, 1383, -1, 1384, -1, 1385, -1, 1386, -1, 1387, -1, 1388, -1, 1389, -1, 1390, -1, 1391, -1, 1392, -1, 1393, -1, 1394, -1, 1395, -1, 1396, -1, 1397, -1, 1398, -1, 1399, -1, 1400, -1, 1401, -1, 1402, -1, 1403, -1, 1404, -1, 1405, -1, 1406, -1, 1407, -1, 1408, -1, 1409, -1, 1410, -1, 1411, -1, 1412, -1, 1413, -1, 1414, -1, 1381, 1410, -1, 1575, 1619, -1, 1575, 1620, -1, 1608, 1620, -1, 1575, 1621, -1, 1610, 1620, -1, 1575, 1652, -1, 1608, 1652, -1, 1735, 1652, -1, 1610, 1652, -1, 1749, 1620, -1, 1729, 1620, -1, 1746, 1620, -1, 2344, 2364, -1, 2352, 2364, -1, 2355, 2364, -1, 2325, 2364, -1, 2326, 2364, -1, 2327, 2364, -1, 2332, 2364, -1, 2337, 2364, -1, 2338, 2364, -1, 2347, 2364, -1, 2351, 2364, -1, 2503, 2494, -1, 2503, 2519, -1, 2465, 2492, -1, 2466, 2492, -1, 2479, 2492, -1, 2610, 2620, -1, 2616, 2620, -1, 2582, 2620, -1, 2583, 2620, -1, 2588, 2620, -1, 2603, 2620, -1, 2887, 2902, -1, 2887, 2878, -1, 2887, 2903, -1, 2849, 2876, -1, 2850, 2876, -1, 2962, 3031, -1, 3014, 3006, -1, 3015, 3006, -1, 3014, 3031, -1, 3142, 3158, -1, 3263, 3285, -1, 3270, 3285, -1, 3270, 3286, -1, 3270, 3266, -1, 3274, 3285, -1, 3398, 3390, -1, 3399, 3390, -1, 3398, 3415, -1, 3545, 3530, -1, 3545, 3535, -1, 3548, 3530, -1, 3545, 3551, -1, 3661, 3634, -1, 3789, 3762, -1, 3755, 3737, -1, 3755, 3745, -1, 3851, -1, 3906, 4023, -1, 3916, 4023, -1, 3921, 4023, -1, 3926, 4023, -1, 3931, 4023, -1, 3904, 4021, -1, 3953, 3954, -1, 3953, 3956, -1, 4018, 3968, -1, 4018, 3969, -1, 4019, 3968, -1, 4019, 3969, -1, 3953, 3968, -1, 3986, 4023, -1, 3996, 4023, -1, 4001, 4023, -1, 4006, 4023, -1, 4011, 4023, -1, 3984, 4021, -1, 4133, 4142, -1, 11520, -1, 11521, -1, 11522, -1, 11523, -1, 11524, -1, 11525, -1, 11526, -1, 11527, -1, 11528, -1, 11529, -1, 11530, -1, 11531, -1, 11532, -1, 11533, -1, 11534, -1, 11535, -1, 11536, -1, 11537, -1, 11538, -1, 11539, -1, 11540, -1, 11541, -1, 11542, -1, 11543, -1, 11544, -1, 11545, -1, 11546, -1, 11547, -1, 11548, -1, 11549, -1, 11550, -1, 11551, -1, 11552, -1, 11553, -1, 11554, -1, 11555, -1, 11556, -1, 11557, -1, 4316, -1, 6917, 6965, -1, 6919, 6965, -1, 6921, 6965, -1, 6923, 6965, -1, 6925, 6965, -1, 6929, 6965, -1, 6970, 6965, -1, 6972, 6965, -1, 6974, 6965, -1, 6975, 6965, -1, 6978, 6965, -1, 65, -1, 198, -1, 66, -1, 68, -1, 69, -1, 398, -1, 71, -1, 72, -1, 73, -1, 74, -1, 75, -1, 76, -1, 77, -1, 78, -1, 79, -1, 546, -1, 80, -1, 82, -1, 84, -1, 85, -1, 87, -1, 592, -1, 593, -1, 7426, -1, 604, -1, 7446, -1, 7447, -1, 7453, -1, 7461, -1, 594, -1, 597, -1, 607, -1, 609, -1, 613, -1, 618, -1, 7547, -1, 669, -1, 621, -1, 7557, -1, 671, -1, 625, -1, 624, -1, 627, -1, 628, -1, 632, -1, 642, -1, 427, -1, 7452, -1, 656, -1, 657, -1, 65, 805, -1, 7681, -1, 97, 805, -1, 66, 775, -1, 7683, -1, 98, 775, -1, 66, 803, -1, 7685, -1, 98, 803, -1, 66, 817, -1, 7687, -1, 98, 817, -1, 199, 769, -1, 7689, -1, 231, 769, -1, 68, 775, -1, 7691, -1, 100, 775, -1, 68, 803, -1, 7693, -1, 100, 803, -1, 68, 817, -1, 7695, -1, 100, 817, -1, 68, 807, -1, 7697, -1, 100, 807, -1, 68, 813, -1, 7699, -1, 100, 813, -1, 274, 768, -1, 7701, -1, 275, 768, -1, 274, 769, -1, 7703, -1, 275, 769, -1, 69, 813, -1, 7705, -1, 101, 813, -1, 69, 816, -1, 7707, -1, 101, 816, -1, 552, 774, -1, 7709, -1, 553, 774, -1, 70, 775, -1, 7711, -1, 102, 775, -1, 71, 772, -1, 7713, -1, 103, 772, -1, 72, 775, -1, 7715, -1, 104, 775, -1, 72, 803, -1, 7717, -1, 104, 803, -1, 72, 776, -1, 7719, -1, 104, 776, -1, 72, 807, -1, 7721, -1, 104, 807, -1, 72, 814, -1, 7723, -1, 104, 814, -1, 73, 816, -1, 7725, -1, 105, 816, -1, 207, 769, -1, 7727, -1, 239, 769, -1, 75, 769, -1, 7729, -1, 107, 769, -1, 75, 803, -1, 7731, -1, 107, 803, -1, 75, 817, -1, 7733, -1, 107, 817, -1, 76, 803, -1, 7735, -1, 108, 803, -1, 7734, 772, -1, 7737, -1, 7735, 772, -1, 76, 817, -1, 7739, -1, 108, 817, -1, 76, 813, -1, 7741, -1, 108, 813, -1, 77, 769, -1, 7743, -1, 109, 769, -1, 77, 775, -1, 7745, -1, 109, 775, -1, 77, 803, -1, 7747, -1, 109, 803, -1, 78, 775, -1, 7749, -1, 110, 775, -1, 78, 803, -1, 7751, -1, 110, 803, -1, 78, 817, -1, 7753, -1, 110, 817, -1, 78, 813, -1, 7755, -1, 110, 813, -1, 213, 769, -1, 7757, -1, 245, 769, -1, 213, 776, -1, 7759, -1, 245, 776, -1, 332, 768, -1, 7761, -1, 333, 768, -1, 332, 769, -1, 7763, -1, 333, 769, -1, 80, 769, -1, 7765, -1, 112, 769, -1, 80, 775, -1, 7767, -1, 112, 775, -1, 82, 775, -1, 7769, -1, 114, 775, -1, 82, 803, -1, 7771, -1, 114, 803, -1, 7770, 772, -1, 7773, -1, 7771, 772, -1, 82, 817, -1, 7775, -1, 114, 817, -1, 83, 775, -1, 7777, -1, 115, 775, -1, 83, 803, -1, 7779, -1, 115, 803, -1, 346, 775, -1, 7781, -1, 347, 775, -1, 352, 775, -1, 7783, -1, 353, 775, -1, 7778, 775, -1, 7785, -1, 7779, 775, -1, 84, 775, -1, 7787, -1, 116, 775, -1, 84, 803, -1, 7789, -1, 116, 803, -1, 84, 817, -1, 7791, -1, 116, 817, -1, 84, 813, -1, 7793, -1, 116, 813, -1, 85, 804, -1, 7795, -1, 117, 804, -1, 85, 816, -1, 7797, -1, 117, 816, -1, 85, 813, -1, 7799, -1, 117, 813, -1, 360, 769, -1, 7801, -1, 361, 769, -1, 362, 776, -1, 7803, -1, 363, 776, -1, 86, 771, -1, 7805, -1, 118, 771, -1, 86, 803, -1, 7807, -1, 118, 803, -1, 87, 768, -1, 7809, -1, 119, 768, -1, 87, 769, -1, 7811, -1, 119, 769, -1, 87, 776, -1, 7813, -1, 119, 776, -1, 87, 775, -1, 7815, -1, 119, 775, -1, 87, 803, -1, 7817, -1, 119, 803, -1, 88, 775, -1, 7819, -1, 120, 775, -1, 88, 776, -1, 7821, -1, 120, 776, -1, 89, 775, -1, 7823, -1, 121, 775, -1, 90, 770, -1, 7825, -1, 122, 770, -1, 90, 803, -1, 7827, -1, 122, 803, -1, 90, 817, -1, 7829, -1, 122, 817, -1, 104, 817, -1, 116, 776, -1, 119, 778, -1, 121, 778, -1, 97, 702, -1, 383, 775, -1, 65, 803, -1, 7841, -1, 97, 803, -1, 65, 777, -1, 7843, -1, 97, 777, -1, 194, 769, -1, 7845, -1, 226, 769, -1, 194, 768, -1, 7847, -1, 226, 768, -1, 194, 777, -1, 7849, -1, 226, 777, -1, 194, 771, -1, 7851, -1, 226, 771, -1, 7840, 770, -1, 7853, -1, 7841, 770, -1, 258, 769, -1, 7855, -1, 259, 769, -1, 258, 768, -1, 7857, -1, 259, 768, -1, 258, 777, -1, 7859, -1, 259, 777, -1, 258, 771, -1, 7861, -1, 259, 771, -1, 7840, 774, -1, 7863, -1, 7841, 774, -1, 69, 803, -1, 7865, -1, 101, 803, -1, 69, 777, -1, 7867, -1, 101, 777, -1, 69, 771, -1, 7869, -1, 101, 771, -1, 202, 769, -1, 7871, -1, 234, 769, -1, 202, 768, -1, 7873, -1, 234, 768, -1, 202, 777, -1, 7875, -1, 234, 777, -1, 202, 771, -1, 7877, -1, 234, 771, -1, 7864, 770, -1, 7879, -1, 7865, 770, -1, 73, 777, -1, 7881, -1, 105, 777, -1, 73, 803, -1, 7883, -1, 105, 803, -1, 79, 803, -1, 7885, -1, 111, 803, -1, 79, 777, -1, 7887, -1, 111, 777, -1, 212, 769, -1, 7889, -1, 244, 769, -1, 212, 768, -1, 7891, -1, 244, 768, -1, 212, 777, -1, 7893, -1, 244, 777, -1, 212, 771, -1, 7895, -1, 244, 771, -1, 7884, 770, -1, 7897, -1, 7885, 770, -1, 416, 769, -1, 7899, -1, 417, 769, -1, 416, 768, -1, 7901, -1, 417, 768, -1, 416, 777, -1, 7903, -1, 417, 777, -1, 416, 771, -1, 7905, -1, 417, 771, -1, 416, 803, -1, 7907, -1, 417, 803, -1, 85, 803, -1, 7909, -1, 117, 803, -1, 85, 777, -1, 7911, -1, 117, 777, -1, 431, 769, -1, 7913, -1, 432, 769, -1, 431, 768, -1, 7915, -1, 432, 768, -1, 431, 777, -1, 7917, -1, 432, 777, -1, 431, 771, -1, 7919, -1, 432, 771, -1, 431, 803, -1, 7921, -1, 432, 803, -1, 89, 768, -1, 7923, -1, 121, 768, -1, 89, 803, -1, 7925, -1, 121, 803, -1, 89, 777, -1, 7927, -1, 121, 777, -1, 89, 771, -1, 7929, -1, 121, 771, -1, 945, 787, -1, 945, 788, -1, 7936, 768, -1, 7937, 768, -1, 7936, 769, -1, 7937, 769, -1, 7936, 834, -1, 7937, 834, -1, 913, 787, -1, 7936, -1, 913, 788, -1, 7937, -1, 7944, 768, -1, 7938, -1, 7945, 768, -1, 7939, -1, 7944, 769, -1, 7940, -1, 7945, 769, -1, 7941, -1, 7944, 834, -1, 7942, -1, 7945, 834, -1, 7943, -1, 949, 787, -1, 949, 788, -1, 7952, 768, -1, 7953, 768, -1, 7952, 769, -1, 7953, 769, -1, 917, 787, -1, 7952, -1, 917, 788, -1, 7953, -1, 7960, 768, -1, 7954, -1, 7961, 768, -1, 7955, -1, 7960, 769, -1, 7956, -1, 7961, 769, -1, 7957, -1, 951, 787, -1, 951, 788, -1, 7968, 768, -1, 7969, 768, -1, 7968, 769, -1, 7969, 769, -1, 7968, 834, -1, 7969, 834, -1, 919, 787, -1, 7968, -1, 919, 788, -1, 7969, -1, 7976, 768, -1, 7970, -1, 7977, 768, -1, 7971, -1, 7976, 769, -1, 7972, -1, 7977, 769, -1, 7973, -1, 7976, 834, -1, 7974, -1, 7977, 834, -1, 7975, -1, 953, 787, -1, 953, 788, -1, 7984, 768, -1, 7985, 768, -1, 7984, 769, -1, 7985, 769, -1, 7984, 834, -1, 7985, 834, -1, 921, 787, -1, 7984, -1, 921, 788, -1, 7985, -1, 7992, 768, -1, 7986, -1, 7993, 768, -1, 7987, -1, 7992, 769, -1, 7988, -1, 7993, 769, -1, 7989, -1, 7992, 834, -1, 7990, -1, 7993, 834, -1, 7991, -1, 959, 787, -1, 959, 788, -1, 8000, 768, -1, 8001, 768, -1, 8000, 769, -1, 8001, 769, -1, 927, 787, -1, 8000, -1, 927, 788, -1, 8001, -1, 8008, 768, -1, 8002, -1, 8009, 768, -1, 8003, -1, 8008, 769, -1, 8004, -1, 8009, 769, -1, 8005, -1, 965, 787, -1, 965, 788, -1, 8016, 768, -1, 965, 787, 768, -1, 8017, 768, -1, 8016, 769, -1, 965, 787, 769, -1, 8017, 769, -1, 8016, 834, -1, 965, 787, 834, -1, 8017, 834, -1, 933, 788, -1, 8017, -1, 8025, 768, -1, 8019, -1, 8025, 769, -1, 8021, -1, 8025, 834, -1, 8023, -1, 969, 787, -1, 969, 788, -1, 8032, 768, -1, 8033, 768, -1, 8032, 769, -1, 8033, 769, -1, 8032, 834, -1, 8033, 834, -1, 937, 787, -1, 8032, -1, 937, 788, -1, 8033, -1, 8040, 768, -1, 8034, -1, 8041, 768, -1, 8035, -1, 8040, 769, -1, 8036, -1, 8041, 769, -1, 8037, -1, 8040, 834, -1, 8038, -1, 8041, 834, -1, 8039, -1, 945, 768, -1, 949, 768, -1, 951, 768, -1, 953, 768, -1, 959, 768, -1, 965, 768, -1, 969, 768, -1, 7936, 837, -1, 7936, 953, -1, 7937, 837, -1, 7937, 953, -1, 7938, 837, -1, 7938, 953, -1, 7939, 837, -1, 7939, 953, -1, 7940, 837, -1, 7940, 953, -1, 7941, 837, -1, 7941, 953, -1, 7942, 837, -1, 7942, 953, -1, 7943, 837, -1, 7943, 953, -1, 7944, 837, -1, 8064, -1, 7945, 837, -1, 8065, -1, 7946, 837, -1, 8066, -1, 7947, 837, -1, 8067, -1, 7948, 837, -1, 8068, -1, 7949, 837, -1, 8069, -1, 7950, 837, -1, 8070, -1, 7951, 837, -1, 8071, -1, 7968, 837, -1, 7968, 953, -1, 7969, 837, -1, 7969, 953, -1, 7970, 837, -1, 7970, 953, -1, 7971, 837, -1, 7971, 953, -1, 7972, 837, -1, 7972, 953, -1, 7973, 837, -1, 7973, 953, -1, 7974, 837, -1, 7974, 953, -1, 7975, 837, -1, 7975, 953, -1, 7976, 837, -1, 8080, -1, 7977, 837, -1, 8081, -1, 7978, 837, -1, 8082, -1, 7979, 837, -1, 8083, -1, 7980, 837, -1, 8084, -1, 7981, 837, -1, 8085, -1, 7982, 837, -1, 8086, -1, 7983, 837, -1, 8087, -1, 8032, 837, -1, 8032, 953, -1, 8033, 837, -1, 8033, 953, -1, 8034, 837, -1, 8034, 953, -1, 8035, 837, -1, 8035, 953, -1, 8036, 837, -1, 8036, 953, -1, 8037, 837, -1, 8037, 953, -1, 8038, 837, -1, 8038, 953, -1, 8039, 837, -1, 8039, 953, -1, 8040, 837, -1, 8096, -1, 8041, 837, -1, 8097, -1, 8042, 837, -1, 8098, -1, 8043, 837, -1, 8099, -1, 8044, 837, -1, 8100, -1, 8045, 837, -1, 8101, -1, 8046, 837, -1, 8102, -1, 8047, 837, -1, 8103, -1, 945, 774, -1, 945, 772, -1, 8048, 837, -1, 8048, 953, -1, 945, 837, -1, 945, 953, -1, 940, 837, -1, 940, 953, -1, 945, 834, -1, 8118, 837, -1, 945, 834, 953, -1, 913, 774, -1, 8112, -1, 913, 772, -1, 8113, -1, 913, 768, -1, 8048, -1, 902, -1, 8049, -1, 913, 837, -1, 8115, -1, 32, 787, -1, 32, 834, -1, 168, 834, -1, 8052, 837, -1, 8052, 953, -1, 951, 837, -1, 951, 953, -1, 942, 837, -1, 942, 953, -1, 951, 834, -1, 8134, 837, -1, 951, 834, 953, -1, 917, 768, -1, 8050, -1, 904, -1, 8051, -1, 919, 768, -1, 8052, -1, 905, -1, 8053, -1, 919, 837, -1, 8131, -1, 8127, 768, -1, 8127, 769, -1, 8127, 834, -1, 953, 774, -1, 953, 772, -1, 970, 768, -1, 953, 776, 768, -1, 912, -1, 953, 834, -1, 970, 834, -1, 953, 776, 834, -1, 921, 774, -1, 8144, -1, 921, 772, -1, 8145, -1, 921, 768, -1, 8054, -1, 906, -1, 8055, -1, 8190, 768, -1, 8190, 769, -1, 8190, 834, -1, 965, 774, -1, 965, 772, -1, 971, 768, -1, 965, 776, 768, -1, 944, -1, 961, 787, -1, 961, 788, -1, 965, 834, -1, 971, 834, -1, 965, 776, 834, -1, 933, 774, -1, 8160, -1, 933, 772, -1, 8161, -1, 933, 768, -1, 8058, -1, 910, -1, 8059, -1, 929, 788, -1, 8165, -1, 168, 768, -1, 901, -1, 96, -1, 8060, 837, -1, 8060, 953, -1, 969, 837, -1, 969, 953, -1, 974, 837, -1, 974, 953, -1, 969, 834, -1, 8182, 837, -1, 969, 834, 953, -1, 927, 768, -1, 8056, -1, 908, -1, 8057, -1, 937, 768, -1, 8060, -1, 911, -1, 8061, -1, 937, 837, -1, 8179, -1, 180, -1, 32, 788, -1, 8194, -1, 8195, -1, 8208, -1, 32, 819, -1, 46, -1, 46, 46, -1, 46, 46, 46, -1, 8242, 8242, -1, 8242, 8242, 8242, -1, 8245, 8245, -1, 8245, 8245, 8245, -1, 33, 33, -1, 32, 773, -1, 63, 63, -1, 63, 33, -1, 33, 63, -1, 8242, 8242, 8242, 8242, -1, 48, -1, 52, -1, 53, -1, 54, -1, 55, -1, 56, -1, 57, -1, 43, -1, 8722, -1, 61, -1, 40, -1, 41, -1, 82, 115, -1, 97, 47, 99, -1, 97, 47, 115, -1, 67, -1, 176, 67, -1, 99, 47, 111, -1, 99, 47, 117, -1, 400, -1, 176, 70, -1, 78, 111, -1, 81, -1, 83, 77, -1, 84, 69, 76, -1, 84, 77, -1, 90, -1, 937, -1, 197, -1, 70, -1, 8526, -1, 1488, -1, 1489, -1, 1490, -1, 1491, -1, 70, 65, 88, -1, 915, -1, 928, -1, 8721, -1, 49, 8260, 51, -1, 50, 8260, 51, -1, 49, 8260, 53, -1, 50, 8260, 53, -1, 51, 8260, 53, -1, 52, 8260, 53, -1, 49, 8260, 54, -1, 53, 8260, 54, -1, 49, 8260, 56, -1, 51, 8260, 56, -1, 53, 8260, 56, -1, 55, 8260, 56, -1, 49, 8260, -1, 8560, -1, 73, 73, -1, 8561, -1, 73, 73, 73, -1, 8562, -1, 73, 86, -1, 8563, -1, 86, -1, 8564, -1, 86, 73, -1, 8565, -1, 86, 73, 73, -1, 8566, -1, 86, 73, 73, 73, -1, 8567, -1, 73, 88, -1, 8568, -1, 88, -1, 8569, -1, 88, 73, -1, 8570, -1, 88, 73, 73, -1, 8571, -1, 8572, -1, 8573, -1, 8574, -1, 8575, -1, 105, 105, -1, 105, 105, 105, -1, 105, 118, -1, 118, 105, -1, 118, 105, 105, -1, 118, 105, 105, 105, -1, 105, 120, -1, 120, 105, -1, 120, 105, 105, -1, 8580, -1, 8592, 824, -1, 8594, 824, -1, 8596, 824, -1, 8656, 824, -1, 8660, 824, -1, 8658, 824, -1, 8707, 824, -1, 8712, 824, -1, 8715, 824, -1, 8739, 824, -1, 8741, 824, -1, 8747, 8747, -1, 8747, 8747, 8747, -1, 8750, 8750, -1, 8750, 8750, 8750, -1, 8764, 824, -1, 8771, 824, -1, 8773, 824, -1, 8776, 824, -1, 61, 824, -1, 8801, 824, -1, 8781, 824, -1, 60, 824, -1, 62, 824, -1, 8804, 824, -1, 8805, 824, -1, 8818, 824, -1, 8819, 824, -1, 8822, 824, -1, 8823, 824, -1, 8826, 824, -1, 8827, 824, -1, 8834, 824, -1, 8835, 824, -1, 8838, 824, -1, 8839, 824, -1, 8866, 824, -1, 8872, 824, -1, 8873, 824, -1, 8875, 824, -1, 8828, 824, -1, 8829, 824, -1, 8849, 824, -1, 8850, 824, -1, 8882, 824, -1, 8883, 824, -1, 8884, 824, -1, 8885, 824, -1, 12296, -1, 12297, -1, 49, 48, -1, 49, 49, -1, 49, 50, -1, 49, 51, -1, 49, 52, -1, 49, 53, -1, 49, 54, -1, 49, 55, -1, 49, 56, -1, 49, 57, -1, 50, 48, -1, 40, 49, 41, -1, 40, 50, 41, -1, 40, 51, 41, -1, 40, 52, 41, -1, 40, 53, 41, -1, 40, 54, 41, -1, 40, 55, 41, -1, 40, 56, 41, -1, 40, 57, 41, -1, 40, 49, 48, 41, -1, 40, 49, 49, 41, -1, 40, 49, 50, 41, -1, 40, 49, 51, 41, -1, 40, 49, 52, 41, -1, 40, 49, 53, 41, -1, 40, 49, 54, 41, -1, 40, 49, 55, 41, -1, 40, 49, 56, 41, -1, 40, 49, 57, 41, -1, 40, 50, 48, 41, -1, 49, 46, -1, 50, 46, -1, 51, 46, -1, 52, 46, -1, 53, 46, -1, 54, 46, -1, 55, 46, -1, 56, 46, -1, 57, 46, -1, 49, 48, 46, -1, 49, 49, 46, -1, 49, 50, 46, -1, 49, 51, 46, -1, 49, 52, 46, -1, 49, 53, 46, -1, 49, 54, 46, -1, 49, 55, 46, -1, 49, 56, 46, -1, 49, 57, 46, -1, 50, 48, 46, -1, 40, 97, 41, -1, 40, 98, 41, -1, 40, 99, 41, -1, 40, 100, 41, -1, 40, 101, 41, -1, 40, 102, 41, -1, 40, 103, 41, -1, 40, 104, 41, -1, 40, 105, 41, -1, 40, 106, 41, -1, 40, 107, 41, -1, 40, 108, 41, -1, 40, 109, 41, -1, 40, 110, 41, -1, 40, 111, 41, -1, 40, 112, 41, -1, 40, 113, 41, -1, 40, 114, 41, -1, 40, 115, 41, -1, 40, 116, 41, -1, 40, 117, 41, -1, 40, 118, 41, -1, 40, 119, 41, -1, 40, 120, 41, -1, 40, 121, 41, -1, 40, 122, 41, -1, 9424, -1, 9425, -1, 9426, -1, 9427, -1, 9428, -1, 9429, -1, 9430, -1, 9431, -1, 9432, -1, 9433, -1, 9434, -1, 9435, -1, 9436, -1, 9437, -1, 9438, -1, 9439, -1, 9440, -1, 9441, -1, 83, -1, 9442, -1, 9443, -1, 9444, -1, 9445, -1, 9446, -1, 9447, -1, 89, -1, 9448, -1, 9449, -1, 8747, 8747, 8747, 8747, -1, 58, 58, 61, -1, 61, 61, -1, 61, 61, 61, -1, 10973, 824, -1, 11312, -1, 11313, -1, 11314, -1, 11315, -1, 11316, -1, 11317, -1, 11318, -1, 11319, -1, 11320, -1, 11321, -1, 11322, -1, 11323, -1, 11324, -1, 11325, -1, 11326, -1, 11327, -1, 11328, -1, 11329, -1, 11330, -1, 11331, -1, 11332, -1, 11333, -1, 11334, -1, 11335, -1, 11336, -1, 11337, -1, 11338, -1, 11339, -1, 11340, -1, 11341, -1, 11342, -1, 11343, -1, 11344, -1, 11345, -1, 11346, -1, 11347, -1, 11348, -1, 11349, -1, 11350, -1, 11351, -1, 11352, -1, 11353, -1, 11354, -1, 11355, -1, 11356, -1, 11357, -1, 11358, -1, 11361, -1, 619, -1, 7549, -1, 637, -1, 11368, -1, 11370, -1, 11372, -1, 11382, -1, 11393, -1, 11395, -1, 11397, -1, 11399, -1, 11401, -1, 11403, -1, 11405, -1, 11407, -1, 11409, -1, 11411, -1, 11413, -1, 11415, -1, 11417, -1, 11419, -1, 11421, -1, 11423, -1, 11425, -1, 11427, -1, 11429, -1, 11431, -1, 11433, -1, 11435, -1, 11437, -1, 11439, -1, 11441, -1, 11443, -1, 11445, -1, 11447, -1, 11449, -1, 11451, -1, 11453, -1, 11455, -1, 11457, -1, 11459, -1, 11461, -1, 11463, -1, 11465, -1, 11467, -1, 11469, -1, 11471, -1, 11473, -1, 11475, -1, 11477, -1, 11479, -1, 11481, -1, 11483, -1, 11485, -1, 11487, -1, 11489, -1, 11491, -1, 11617, -1, 27597, -1, 40863, -1, 19968, -1, 20008, -1, 20022, -1, 20031, -1, 20057, -1, 20101, -1, 20108, -1, 20128, -1, 20154, -1, 20799, -1, 20837, -1, 20843, -1, 20866, -1, 20886, -1, 20907, -1, 20960, -1, 20981, -1, 20992, -1, 21147, -1, 21241, -1, 21269, -1, 21274, -1, 21304, -1, 21313, -1, 21340, -1, 21353, -1, 21378, -1, 21430, -1, 21448, -1, 21475, -1, 22231, -1, 22303, -1, 22763, -1, 22786, -1, 22794, -1, 22805, -1, 22823, -1, 22899, -1, 23376, -1, 23424, -1, 23544, -1, 23567, -1, 23586, -1, 23608, -1, 23662, -1, 23665, -1, 24027, -1, 24037, -1, 24049, -1, 24062, -1, 24178, -1, 24186, -1, 24191, -1, 24308, -1, 24318, -1, 24331, -1, 24339, -1, 24400, -1, 24417, -1, 24435, -1, 24515, -1, 25096, -1, 25142, -1, 25163, -1, 25903, -1, 25908, -1, 25991, -1, 26007, -1, 26020, -1, 26041, -1, 26080, -1, 26085, -1, 26352, -1, 26376, -1, 26408, -1, 27424, -1, 27490, -1, 27513, -1, 27571, -1, 27595, -1, 27604, -1, 27611, -1, 27663, -1, 27668, -1, 27700, -1, 28779, -1, 29226, -1, 29238, -1, 29243, -1, 29247, -1, 29255, -1, 29273, -1, 29275, -1, 29356, -1, 29572, -1, 29577, -1, 29916, -1, 29926, -1, 29976, -1, 29983, -1, 29992, -1, 30000, -1, 30091, -1, 30098, -1, 30326, -1, 30333, -1, 30382, -1, 30399, -1, 30446, -1, 30683, -1, 30690, -1, 30707, -1, 31034, -1, 31160, -1, 31166, -1, 31348, -1, 31435, -1, 31481, -1, 31859, -1, 31992, -1, 32566, -1, 32593, -1, 32650, -1, 32701, -1, 32769, -1, 32780, -1, 32786, -1, 32819, -1, 32895, -1, 32905, -1, 33251, -1, 33258, -1, 33267, -1, 33276, -1, 33292, -1, 33307, -1, 33311, -1, 33390, -1, 33394, -1, 33400, -1, 34381, -1, 34411, -1, 34880, -1, 34892, -1, 34915, -1, 35198, -1, 35211, -1, 35282, -1, 35328, -1, 35895, -1, 35910, -1, 35925, -1, 35960, -1, 35997, -1, 36196, -1, 36208, -1, 36275, -1, 36523, -1, 36554, -1, 36763, -1, 36784, -1, 36789, -1, 37009, -1, 37193, -1, 37318, -1, 37324, -1, 37329, -1, 38263, -1, 38272, -1, 38428, -1, 38582, -1, 38585, -1, 38632, -1, 38737, -1, 38750, -1, 38754, -1, 38761, -1, 38859, -1, 38893, -1, 38899, -1, 38913, -1, 39080, -1, 39131, -1, 39135, -1, 39318, -1, 39321, -1, 39340, -1, 39592, -1, 39640, -1, 39647, -1, 39717, -1, 39727, -1, 39730, -1, 39740, -1, 39770, -1, 40165, -1, 40565, -1, 40575, -1, 40613, -1, 40635, -1, 40643, -1, 40653, -1, 40657, -1, 40697, -1, 40701, -1, 40718, -1, 40723, -1, 40736, -1, 40763, -1, 40778, -1, 40786, -1, 40845, -1, 40860, -1, 40864, -1, 12306, -1, 21316, -1, 21317, -1, 12363, 12441, -1, 12365, 12441, -1, 12367, 12441, -1, 12369, 12441, -1, 12371, 12441, -1, 12373, 12441, -1, 12375, 12441, -1, 12377, 12441, -1, 12379, 12441, -1, 12381, 12441, -1, 12383, 12441, -1, 12385, 12441, -1, 12388, 12441, -1, 12390, 12441, -1, 12392, 12441, -1, 12399, 12441, -1, 12399, 12442, -1, 12402, 12441, -1, 12402, 12442, -1, 12405, 12441, -1, 12405, 12442, -1, 12408, 12441, -1, 12408, 12442, -1, 12411, 12441, -1, 12411, 12442, -1, 12358, 12441, -1, 32, 12441, -1, 32, 12442, -1, 12445, 12441, -1, 12424, 12426, -1, 12459, 12441, -1, 12461, 12441, -1, 12463, 12441, -1, 12465, 12441, -1, 12467, 12441, -1, 12469, 12441, -1, 12471, 12441, -1, 12473, 12441, -1, 12475, 12441, -1, 12477, 12441, -1, 12479, 12441, -1, 12481, 12441, -1, 12484, 12441, -1, 12486, 12441, -1, 12488, 12441, -1, 12495, 12441, -1, 12495, 12442, -1, 12498, 12441, -1, 12498, 12442, -1, 12501, 12441, -1, 12501, 12442, -1, 12504, 12441, -1, 12504, 12442, -1, 12507, 12441, -1, 12507, 12442, -1, 12454, 12441, -1, 12527, 12441, -1, 12528, 12441, -1, 12529, 12441, -1, 12530, 12441, -1, 12541, 12441, -1, 12467, 12488, -1, 4352, -1, 4353, -1, 4522, -1, 4354, -1, 4524, -1, 4525, -1, 4355, -1, 4356, -1, 4357, -1, 4528, -1, 4529, -1, 4530, -1, 4531, -1, 4532, -1, 4533, -1, 4378, -1, 4358, -1, 4359, -1, 4360, -1, 4385, -1, 4361, -1, 4362, -1, 4363, -1, 4364, -1, 4365, -1, 4366, -1, 4367, -1, 4368, -1, 4369, -1, 4370, -1, 4449, -1, 4450, -1, 4451, -1, 4452, -1, 4453, -1, 4454, -1, 4455, -1, 4456, -1, 4457, -1, 4458, -1, 4459, -1, 4460, -1, 4461, -1, 4462, -1, 4463, -1, 4464, -1, 4465, -1, 4466, -1, 4467, -1, 4468, -1, 4469, -1, 4448, -1, 4372, -1, 4373, -1, 4551, -1, 4552, -1, 4556, -1, 4558, -1, 4563, -1, 4567, -1, 4569, -1, 4380, -1, 4573, -1, 4575, -1, 4381, -1, 4382, -1, 4384, -1, 4386, -1, 4387, -1, 4391, -1, 4393, -1, 4395, -1, 4396, -1, 4397, -1, 4398, -1, 4399, -1, 4402, -1, 4406, -1, 4416, -1, 4423, -1, 4428, -1, 4593, -1, 4594, -1, 4439, -1, 4440, -1, 4441, -1, 4484, -1, 4485, -1, 4488, -1, 4497, -1, 4498, -1, 4500, -1, 4510, -1, 4513, -1, 19977, -1, 22235, -1, 19978, -1, 20013, -1, 19979, -1, 30002, -1, 19993, -1, 19969, -1, 22825, -1, 22320, -1, 40, 4352, 41, -1, 40, 4354, 41, -1, 40, 4355, 41, -1, 40, 4357, 41, -1, 40, 4358, 41, -1, 40, 4359, 41, -1, 40, 4361, 41, -1, 40, 4363, 41, -1, 40, 4364, 41, -1, 40, 4366, 41, -1, 40, 4367, 41, -1, 40, 4368, 41, -1, 40, 4369, 41, -1, 40, 4370, 41, -1, 40, 4352, 4449, 41, -1, 40, 4354, 4449, 41, -1, 40, 4355, 4449, 41, -1, 40, 4357, 4449, 41, -1, 40, 4358, 4449, 41, -1, 40, 4359, 4449, 41, -1, 40, 4361, 4449, 41, -1, 40, 4363, 4449, 41, -1, 40, 4364, 4449, 41, -1, 40, 4366, 4449, 41, -1, 40, 4367, 4449, 41, -1, 40, 4368, 4449, 41, -1, 40, 4369, 4449, 41, -1, 40, 4370, 4449, 41, -1, 40, 4364, 4462, 41, -1, 40, 4363, 4457, 4364, 4453, 4523, 41, -1, 40, 4363, 4457, 4370, 4462, 41, -1, 40, 19968, 41, -1, 40, 20108, 41, -1, 40, 19977, 41, -1, 40, 22235, 41, -1, 40, 20116, 41, -1, 40, 20845, 41, -1, 40, 19971, 41, -1, 40, 20843, 41, -1, 40, 20061, 41, -1, 40, 21313, 41, -1, 40, 26376, 41, -1, 40, 28779, 41, -1, 40, 27700, 41, -1, 40, 26408, 41, -1, 40, 37329, 41, -1, 40, 22303, 41, -1, 40, 26085, 41, -1, 40, 26666, 41, -1, 40, 26377, 41, -1, 40, 31038, 41, -1, 40, 21517, 41, -1, 40, 29305, 41, -1, 40, 36001, 41, -1, 40, 31069, 41, -1, 40, 21172, 41, -1, 40, 20195, 41, -1, 40, 21628, 41, -1, 40, 23398, 41, -1, 40, 30435, 41, -1, 40, 20225, 41, -1, 40, 36039, 41, -1, 40, 21332, 41, -1, 40, 31085, 41, -1, 40, 20241, 41, -1, 40, 33258, 41, -1, 40, 33267, 41, -1, 80, 84, 69, -1, 50, 49, -1, 50, 50, -1, 50, 51, -1, 50, 52, -1, 50, 53, -1, 50, 54, -1, 50, 55, -1, 50, 56, -1, 50, 57, -1, 51, 48, -1, 51, 49, -1, 51, 50, -1, 51, 51, -1, 51, 52, -1, 51, 53, -1, 4352, 4449, -1, 4354, 4449, -1, 4355, 4449, -1, 4357, 4449, -1, 4358, 4449, -1, 4359, 4449, -1, 4361, 4449, -1, 4363, 4449, -1, 4364, 4449, -1, 4366, 4449, -1, 4367, 4449, -1, 4368, 4449, -1, 4369, 4449, -1, 4370, 4449, -1, 4366, 4449, 4535, 4352, 4457, -1, 4364, 4462, 4363, 4468, -1, 4363, 4462, -1, 20116, -1, 20845, -1, 19971, -1, 20061, -1, 26666, -1, 26377, -1, 31038, -1, 21517, -1, 29305, -1, 36001, -1, 31069, -1, 21172, -1, 31192, -1, 30007, -1, 36969, -1, 20778, -1, 21360, -1, 27880, -1, 38917, -1, 20241, -1, 20889, -1, 27491, -1, 24038, -1, 21491, -1, 21307, -1, 23447, -1, 23398, -1, 30435, -1, 20225, -1, 36039, -1, 21332, -1, 22812, -1, 51, 54, -1, 51, 55, -1, 51, 56, -1, 51, 57, -1, 52, 48, -1, 52, 49, -1, 52, 50, -1, 52, 51, -1, 52, 52, -1, 52, 53, -1, 52, 54, -1, 52, 55, -1, 52, 56, -1, 52, 57, -1, 53, 48, -1, 49, 26376, -1, 50, 26376, -1, 51, 26376, -1, 52, 26376, -1, 53, 26376, -1, 54, 26376, -1, 55, 26376, -1, 56, 26376, -1, 57, 26376, -1, 49, 48, 26376, -1, 49, 49, 26376, -1, 49, 50, 26376, -1, 72, 103, -1, 101, 114, 103, -1, 101, 86, -1, 76, 84, 68, -1, 12450, -1, 12452, -1, 12454, -1, 12456, -1, 12458, -1, 12459, -1, 12461, -1, 12463, -1, 12465, -1, 12467, -1, 12469, -1, 12471, -1, 12473, -1, 12475, -1, 12477, -1, 12479, -1, 12481, -1, 12484, -1, 12486, -1, 12488, -1, 12490, -1, 12491, -1, 12492, -1, 12493, -1, 12494, -1, 12495, -1, 12498, -1, 12501, -1, 12504, -1, 12507, -1, 12510, -1, 12511, -1, 12512, -1, 12513, -1, 12514, -1, 12516, -1, 12518, -1, 12520, -1, 12521, -1, 12522, -1, 12523, -1, 12524, -1, 12525, -1, 12527, -1, 12528, -1, 12529, -1, 12530, -1, 12450, 12497, 12540, 12488, -1, 12450, 12523, 12501, 12449, -1, 12450, 12531, 12506, 12450, -1, 12450, 12540, 12523, -1, 12452, 12491, 12531, 12464, -1, 12452, 12531, 12481, -1, 12454, 12457, 12531, -1, 12456, 12473, 12463, 12540, 12489, -1, 12456, 12540, 12459, 12540, -1, 12458, 12531, 12473, -1, 12458, 12540, 12512, -1, 12459, 12452, 12522, -1, 12459, 12521, 12483, 12488, -1, 12459, 12525, 12522, 12540, -1, 12460, 12525, 12531, -1, 12460, 12531, 12510, -1, 12462, 12460, -1, 12462, 12491, 12540, -1, 12461, 12517, 12522, 12540, -1, 12462, 12523, 12480, 12540, -1, 12461, 12525, -1, 12461, 12525, 12464, 12521, 12512, -1, 12461, 12525, 12513, 12540, 12488, 12523, -1, 12461, 12525, 12527, 12483, 12488, -1, 12464, 12521, 12512, -1, 12464, 12521, 12512, 12488, 12531, -1, 12463, 12523, 12476, 12452, 12525, -1, 12463, 12525, 12540, 12493, -1, 12465, 12540, 12473, -1, 12467, 12523, 12490, -1, 12467, 12540, 12509, -1, 12469, 12452, 12463, 12523, -1, 12469, 12531, 12481, 12540, 12512, -1, 12471, 12522, 12531, 12464, -1, 12475, 12531, 12481, -1, 12475, 12531, 12488, -1, 12480, 12540, 12473, -1, 12487, 12471, -1, 12489, 12523, -1, 12488, 12531, -1, 12490, 12494, -1, 12494, 12483, 12488, -1, 12495, 12452, 12484, -1, 12497, 12540, 12475, 12531, 12488, -1, 12497, 12540, 12484, -1, 12496, 12540, 12524, 12523, -1, 12500, 12450, 12473, 12488, 12523, -1, 12500, 12463, 12523, -1, 12500, 12467, -1, 12499, 12523, -1, 12501, 12449, 12521, 12483, 12489, -1, 12501, 12451, 12540, 12488, -1, 12502, 12483, 12471, 12455, 12523, -1, 12501, 12521, 12531, -1, 12504, 12463, 12479, 12540, 12523, -1, 12506, 12477, -1, 12506, 12491, 12498, -1, 12504, 12523, 12484, -1, 12506, 12531, 12473, -1, 12506, 12540, 12472, -1, 12505, 12540, 12479, -1, 12509, 12452, 12531, 12488, -1, 12508, 12523, 12488, -1, 12507, 12531, -1, 12509, 12531, 12489, -1, 12507, 12540, 12523, -1, 12507, 12540, 12531, -1, 12510, 12452, 12463, 12525, -1, 12510, 12452, 12523, -1, 12510, 12483, 12495, -1, 12510, 12523, 12463, -1, 12510, 12531, 12471, 12519, 12531, -1, 12511, 12463, 12525, 12531, -1, 12511, 12522, -1, 12511, 12522, 12496, 12540, 12523, -1, 12513, 12460, -1, 12513, 12460, 12488, 12531, -1, 12513, 12540, 12488, 12523, -1, 12516, 12540, 12489, -1, 12516, 12540, 12523, -1, 12518, 12450, 12531, -1, 12522, 12483, 12488, 12523, -1, 12522, 12521, -1, 12523, 12500, 12540, -1, 12523, 12540, 12502, 12523, -1, 12524, 12512, -1, 12524, 12531, 12488, 12466, 12531, -1, 12527, 12483, 12488, -1, 48, 28857, -1, 49, 28857, -1, 50, 28857, -1, 51, 28857, -1, 52, 28857, -1, 53, 28857, -1, 54, 28857, -1, 55, 28857, -1, 56, 28857, -1, 57, 28857, -1, 49, 48, 28857, -1, 49, 49, 28857, -1, 49, 50, 28857, -1, 49, 51, 28857, -1, 49, 52, 28857, -1, 49, 53, 28857, -1, 49, 54, 28857, -1, 49, 55, 28857, -1, 49, 56, 28857, -1, 49, 57, 28857, -1, 50, 48, 28857, -1, 50, 49, 28857, -1, 50, 50, 28857, -1, 50, 51, 28857, -1, 50, 52, 28857, -1, 104, 80, 97, -1, 100, 97, -1, 65, 85, -1, 98, 97, 114, -1, 111, 86, -1, 112, 99, -1, 100, 109, -1, 100, 109, 178, -1, 100, 109, 179, -1, 73, 85, -1, 24179, 25104, -1, 26157, 21644, -1, 22823, 27491, -1, 26126, 27835, -1, 26666, 24335, 20250, 31038, -1, 112, 65, -1, 110, 65, -1, 956, 65, -1, 109, 65, -1, 107, 65, -1, 75, 66, -1, 77, 66, -1, 71, 66, -1, 99, 97, 108, -1, 107, 99, 97, 108, -1, 112, 70, -1, 110, 70, -1, 956, 70, -1, 956, 103, -1, 109, 103, -1, 107, 103, -1, 72, 122, -1, 107, 72, 122, -1, 77, 72, 122, -1, 71, 72, 122, -1, 84, 72, 122, -1, 956, 8467, -1, 109, 8467, -1, 100, 8467, -1, 107, 8467, -1, 102, 109, -1, 110, 109, -1, 956, 109, -1, 109, 109, -1, 99, 109, -1, 107, 109, -1, 109, 109, 178, -1, 99, 109, 178, -1, 109, 178, -1, 107, 109, 178, -1, 109, 109, 179, -1, 99, 109, 179, -1, 109, 179, -1, 107, 109, 179, -1, 109, 8725, 115, -1, 109, 8725, 115, 178, -1, 80, 97, -1, 107, 80, 97, -1, 77, 80, 97, -1, 71, 80, 97, -1, 114, 97, 100, -1, 114, 97, 100, 8725, 115, -1, 114, 97, 100, 8725, 115, 178, -1, 112, 115, -1, 110, 115, -1, 956, 115, -1, 109, 115, -1, 112, 86, -1, 110, 86, -1, 956, 86, -1, 109, 86, -1, 107, 86, -1, 77, 86, -1, 112, 87, -1, 110, 87, -1, 956, 87, -1, 109, 87, -1, 107, 87, -1, 77, 87, -1, 107, 937, -1, 77, 937, -1, 97, 46, 109, 46, -1, 66, 113, -1, 99, 99, -1, 99, 100, -1, 67, 8725, 107, 103, -1, 67, 111, 46, -1, 100, 66, -1, 71, 121, -1, 104, 97, -1, 72, 80, -1, 105, 110, -1, 75, 75, -1, 75, 77, -1, 107, 116, -1, 108, 109, -1, 108, 110, -1, 108, 111, 103, -1, 108, 120, -1, 109, 98, -1, 109, 105, 108, -1, 109, 111, 108, -1, 80, 72, -1, 112, 46, 109, 46, -1, 80, 80, 77, -1, 80, 82, -1, 115, 114, -1, 83, 118, -1, 87, 98, -1, 86, 8725, 109, -1, 65, 8725, 109, -1, 49, 26085, -1, 50, 26085, -1, 51, 26085, -1, 52, 26085, -1, 53, 26085, -1, 54, 26085, -1, 55, 26085, -1, 56, 26085, -1, 57, 26085, -1, 49, 48, 26085, -1, 49, 49, 26085, -1, 49, 50, 26085, -1, 49, 51, 26085, -1, 49, 52, 26085, -1, 49, 53, 26085, -1, 49, 54, 26085, -1, 49, 55, 26085, -1, 49, 56, 26085, -1, 49, 57, 26085, -1, 50, 48, 26085, -1, 50, 49, 26085, -1, 50, 50, 26085, -1, 50, 51, 26085, -1, 50, 52, 26085, -1, 50, 53, 26085, -1, 50, 54, 26085, -1, 50, 55, 26085, -1, 50, 56, 26085, -1, 50, 57, 26085, -1, 51, 48, 26085, -1, 51, 49, 26085, -1, 103, 97, 108, -1, 35912, -1, 26356, -1, 36040, -1, 28369, -1, 20018, -1, 21477, -1, 22865, -1, 21895, -1, 22856, -1, 25078, -1, 30313, -1, 32645, -1, 34367, -1, 34746, -1, 35064, -1, 37007, -1, 27138, -1, 27931, -1, 28889, -1, 29662, -1, 33853, -1, 37226, -1, 39409, -1, 20098, -1, 21365, -1, 27396, -1, 29211, -1, 34349, -1, 40478, -1, 23888, -1, 28651, -1, 34253, -1, 35172, -1, 25289, -1, 33240, -1, 34847, -1, 24266, -1, 26391, -1, 28010, -1, 29436, -1, 37070, -1, 20358, -1, 20919, -1, 21214, -1, 25796, -1, 27347, -1, 29200, -1, 30439, -1, 34310, -1, 34396, -1, 36335, -1, 38706, -1, 39791, -1, 40442, -1, 30860, -1, 31103, -1, 32160, -1, 33737, -1, 37636, -1, 35542, -1, 22751, -1, 24324, -1, 31840, -1, 32894, -1, 29282, -1, 30922, -1, 36034, -1, 38647, -1, 22744, -1, 23650, -1, 27155, -1, 28122, -1, 28431, -1, 32047, -1, 32311, -1, 38475, -1, 21202, -1, 32907, -1, 20956, -1, 20940, -1, 31260, -1, 32190, -1, 33777, -1, 38517, -1, 35712, -1, 25295, -1, 35582, -1, 20025, -1, 23527, -1, 24594, -1, 29575, -1, 30064, -1, 21271, -1, 30971, -1, 20415, -1, 24489, -1, 19981, -1, 27852, -1, 25976, -1, 32034, -1, 21443, -1, 22622, -1, 30465, -1, 33865, -1, 35498, -1, 27578, -1, 27784, -1, 25342, -1, 33509, -1, 25504, -1, 30053, -1, 20142, -1, 20841, -1, 20937, -1, 26753, -1, 31975, -1, 33391, -1, 35538, -1, 37327, -1, 21237, -1, 21570, -1, 24300, -1, 26053, -1, 28670, -1, 31018, -1, 38317, -1, 39530, -1, 40599, -1, 40654, -1, 26310, -1, 27511, -1, 36706, -1, 24180, -1, 24976, -1, 25088, -1, 25754, -1, 28451, -1, 29001, -1, 29833, -1, 31178, -1, 32244, -1, 32879, -1, 36646, -1, 34030, -1, 36899, -1, 37706, -1, 21015, -1, 21155, -1, 21693, -1, 28872, -1, 35010, -1, 24265, -1, 24565, -1, 25467, -1, 27566, -1, 31806, -1, 29557, -1, 20196, -1, 22265, -1, 23994, -1, 24604, -1, 29618, -1, 29801, -1, 32666, -1, 32838, -1, 37428, -1, 38646, -1, 38728, -1, 38936, -1, 20363, -1, 31150, -1, 37300, -1, 38584, -1, 24801, -1, 20102, -1, 20698, -1, 23534, -1, 23615, -1, 26009, -1, 29134, -1, 30274, -1, 34044, -1, 36988, -1, 26248, -1, 38446, -1, 21129, -1, 26491, -1, 26611, -1, 27969, -1, 28316, -1, 29705, -1, 30041, -1, 30827, -1, 32016, -1, 39006, -1, 25134, -1, 38520, -1, 20523, -1, 23833, -1, 28138, -1, 36650, -1, 24459, -1, 24900, -1, 26647, -1, 38534, -1, 21033, -1, 21519, -1, 23653, -1, 26131, -1, 26446, -1, 26792, -1, 27877, -1, 29702, -1, 30178, -1, 32633, -1, 35023, -1, 35041, -1, 38626, -1, 21311, -1, 28346, -1, 21533, -1, 29136, -1, 29848, -1, 34298, -1, 38563, -1, 40023, -1, 40607, -1, 26519, -1, 28107, -1, 33256, -1, 31520, -1, 31890, -1, 29376, -1, 28825, -1, 35672, -1, 20160, -1, 33590, -1, 21050, -1, 20999, -1, 24230, -1, 25299, -1, 31958, -1, 23429, -1, 27934, -1, 26292, -1, 36667, -1, 38477, -1, 24275, -1, 20800, -1, 21952, -1, 22618, -1, 26228, -1, 20958, -1, 29482, -1, 30410, -1, 31036, -1, 31070, -1, 31077, -1, 31119, -1, 38742, -1, 31934, -1, 34322, -1, 35576, -1, 36920, -1, 37117, -1, 39151, -1, 39164, -1, 39208, -1, 40372, -1, 20398, -1, 20711, -1, 20813, -1, 21193, -1, 21220, -1, 21329, -1, 21917, -1, 22022, -1, 22120, -1, 22592, -1, 22696, -1, 23652, -1, 24724, -1, 24936, -1, 24974, -1, 25074, -1, 25935, -1, 26082, -1, 26257, -1, 26757, -1, 28023, -1, 28186, -1, 28450, -1, 29038, -1, 29227, -1, 29730, -1, 30865, -1, 31049, -1, 31048, -1, 31056, -1, 31062, -1, 31117, -1, 31118, -1, 31296, -1, 31361, -1, 31680, -1, 32265, -1, 32321, -1, 32626, -1, 32773, -1, 33261, -1, 33401, -1, 33879, -1, 35088, -1, 35222, -1, 35585, -1, 35641, -1, 36051, -1, 36104, -1, 36790, -1, 38627, -1, 38911, -1, 38971, -1, 20006, -1, 20917, -1, 20840, -1, 20352, -1, 20805, -1, 20864, -1, 21191, -1, 21242, -1, 21845, -1, 21913, -1, 21986, -1, 22707, -1, 22852, -1, 22868, -1, 23138, -1, 23336, -1, 24274, -1, 24281, -1, 24425, -1, 24493, -1, 24792, -1, 24910, -1, 24840, -1, 24928, -1, 25140, -1, 25540, -1, 25628, -1, 25682, -1, 25942, -1, 26395, -1, 26454, -1, 28379, -1, 28363, -1, 28702, -1, 30631, -1, 29237, -1, 29359, -1, 29809, -1, 29958, -1, 30011, -1, 30237, -1, 30239, -1, 30427, -1, 30452, -1, 30538, -1, 30528, -1, 30924, -1, 31409, -1, 31867, -1, 32091, -1, 32574, -1, 33618, -1, 33775, -1, 34681, -1, 35137, -1, 35206, -1, 35519, -1, 35531, -1, 35565, -1, 35722, -1, 36664, -1, 36978, -1, 37273, -1, 37494, -1, 38524, -1, 38875, -1, 38923, -1, 39698, -1, 141386, -1, 141380, -1, 144341, -1, 15261, -1, 16408, -1, 16441, -1, 152137, -1, 154832, -1, 163539, -1, 40771, -1, 40846, -1, 102, 102, -1, 102, 105, -1, 102, 108, -1, 102, 102, 105, -1, 102, 102, 108, -1, 383, 116, -1, 115, 116, -1, 1396, 1398, -1, 1396, 1381, -1, 1396, 1387, -1, 1406, 1398, -1, 1396, 1389, -1, 1497, 1460, -1, 1522, 1463, -1, 1506, -1, 1492, -1, 1499, -1, 1500, -1, 1501, -1, 1512, -1, 1514, -1, 1513, 1473, -1, 1513, 1474, -1, 64329, 1473, -1, 64329, 1474, -1, 1488, 1463, -1, 1488, 1464, -1, 1488, 1468, -1, 1489, 1468, -1, 1490, 1468, -1, 1491, 1468, -1, 1492, 1468, -1, 1493, 1468, -1, 1494, 1468, -1, 1496, 1468, -1, 1497, 1468, -1, 1498, 1468, -1, 1499, 1468, -1, 1500, 1468, -1, 1502, 1468, -1, 1504, 1468, -1, 1505, 1468, -1, 1507, 1468, -1, 1508, 1468, -1, 1510, 1468, -1, 1511, 1468, -1, 1512, 1468, -1, 1513, 1468, -1, 1514, 1468, -1, 1493, 1465, -1, 1489, 1471, -1, 1499, 1471, -1, 1508, 1471, -1, 1488, 1500, -1, 1649, -1, 1659, -1, 1662, -1, 1664, -1, 1658, -1, 1663, -1, 1657, -1, 1700, -1, 1702, -1, 1668, -1, 1667, -1, 1670, -1, 1671, -1, 1677, -1, 1676, -1, 1678, -1, 1672, -1, 1688, -1, 1681, -1, 1705, -1, 1711, -1, 1715, -1, 1713, -1, 1722, -1, 1723, -1, 1728, -1, 1729, -1, 1726, -1, 1746, -1, 1747, -1, 1709, -1, 1735, -1, 1734, -1, 1736, -1, 1655, -1, 1739, -1, 1733, -1, 1737, -1, 1744, -1, 1609, -1, 1574, 1575, -1, 1574, 1749, -1, 1574, 1608, -1, 1574, 1735, -1, 1574, 1734, -1, 1574, 1736, -1, 1574, 1744, -1, 1574, 1609, -1, 1740, -1, 1574, 1580, -1, 1574, 1581, -1, 1574, 1605, -1, 1574, 1610, -1, 1576, 1580, -1, 1576, 1581, -1, 1576, 1582, -1, 1576, 1605, -1, 1576, 1609, -1, 1576, 1610, -1, 1578, 1580, -1, 1578, 1581, -1, 1578, 1582, -1, 1578, 1605, -1, 1578, 1609, -1, 1578, 1610, -1, 1579, 1580, -1, 1579, 1605, -1, 1579, 1609, -1, 1579, 1610, -1, 1580, 1581, -1, 1580, 1605, -1, 1581, 1580, -1, 1581, 1605, -1, 1582, 1580, -1, 1582, 1581, -1, 1582, 1605, -1, 1587, 1580, -1, 1587, 1581, -1, 1587, 1582, -1, 1587, 1605, -1, 1589, 1581, -1, 1589, 1605, -1, 1590, 1580, -1, 1590, 1581, -1, 1590, 1582, -1, 1590, 1605, -1, 1591, 1581, -1, 1591, 1605, -1, 1592, 1605, -1, 1593, 1580, -1, 1593, 1605, -1, 1594, 1580, -1, 1594, 1605, -1, 1601, 1580, -1, 1601, 1581, -1, 1601, 1582, -1, 1601, 1605, -1, 1601, 1609, -1, 1601, 1610, -1, 1602, 1581, -1, 1602, 1605, -1, 1602, 1609, -1, 1602, 1610, -1, 1603, 1575, -1, 1603, 1580, -1, 1603, 1581, -1, 1603, 1582, -1, 1603, 1604, -1, 1603, 1605, -1, 1603, 1609, -1, 1603, 1610, -1, 1604, 1580, -1, 1604, 1581, -1, 1604, 1582, -1, 1604, 1605, -1, 1604, 1609, -1, 1604, 1610, -1, 1605, 1580, -1, 1605, 1581, -1, 1605, 1582, -1, 1605, 1605, -1, 1605, 1609, -1, 1605, 1610, -1, 1606, 1580, -1, 1606, 1581, -1, 1606, 1582, -1, 1606, 1605, -1, 1606, 1609, -1, 1606, 1610, -1, 1607, 1580, -1, 1607, 1605, -1, 1607, 1609, -1, 1607, 1610, -1, 1610, 1580, -1, 1610, 1581, -1, 1610, 1582, -1, 1610, 1605, -1, 1610, 1609, -1, 1610, 1610, -1, 1584, 1648, -1, 1585, 1648, -1, 1609, 1648, -1, 32, 1612, 1617, -1, 32, 1613, 1617, -1, 32, 1614, 1617, -1, 32, 1615, 1617, -1, 32, 1616, 1617, -1, 32, 1617, 1648, -1, 1574, 1585, -1, 1574, 1586, -1, 1574, 1606, -1, 1576, 1585, -1, 1576, 1586, -1, 1576, 1606, -1, 1578, 1585, -1, 1578, 1586, -1, 1578, 1606, -1, 1579, 1585, -1, 1579, 1586, -1, 1579, 1606, -1, 1605, 1575, -1, 1606, 1585, -1, 1606, 1586, -1, 1606, 1606, -1, 1610, 1585, -1, 1610, 1586, -1, 1610, 1606, -1, 1574, 1582, -1, 1574, 1607, -1, 1576, 1607, -1, 1578, 1607, -1, 1589, 1582, -1, 1604, 1607, -1, 1606, 1607, -1, 1607, 1648, -1, 1610, 1607, -1, 1579, 1607, -1, 1587, 1607, -1, 1588, 1605, -1, 1588, 1607, -1, 1600, 1614, 1617, -1, 1600, 1615, 1617, -1, 1600, 1616, 1617, -1, 1591, 1609, -1, 1591, 1610, -1, 1593, 1609, -1, 1593, 1610, -1, 1594, 1609, -1, 1594, 1610, -1, 1587, 1609, -1, 1587, 1610, -1, 1588, 1609, -1, 1588, 1610, -1, 1581, 1609, -1, 1581, 1610, -1, 1580, 1609, -1, 1580, 1610, -1, 1582, 1609, -1, 1582, 1610, -1, 1589, 1609, -1, 1589, 1610, -1, 1590, 1609, -1, 1590, 1610, -1, 1588, 1580, -1, 1588, 1581, -1, 1588, 1582, -1, 1588, 1585, -1, 1587, 1585, -1, 1589, 1585, -1, 1590, 1585, -1, 1575, 1611, -1, 1578, 1580, 1605, -1, 1578, 1581, 1580, -1, 1578, 1581, 1605, -1, 1578, 1582, 1605, -1, 1578, 1605, 1580, -1, 1578, 1605, 1581, -1, 1578, 1605, 1582, -1, 1580, 1605, 1581, -1, 1581, 1605, 1610, -1, 1581, 1605, 1609, -1, 1587, 1581, 1580, -1, 1587, 1580, 1581, -1, 1587, 1580, 1609, -1, 1587, 1605, 1581, -1, 1587, 1605, 1580, -1, 1587, 1605, 1605, -1, 1589, 1581, 1581, -1, 1589, 1605, 1605, -1, 1588, 1581, 1605, -1, 1588, 1580, 1610, -1, 1588, 1605, 1582, -1, 1588, 1605, 1605, -1, 1590, 1581, 1609, -1, 1590, 1582, 1605, -1, 1591, 1605, 1581, -1, 1591, 1605, 1605, -1, 1591, 1605, 1610, -1, 1593, 1580, 1605, -1, 1593, 1605, 1605, -1, 1593, 1605, 1609, -1, 1594, 1605, 1605, -1, 1594, 1605, 1610, -1, 1594, 1605, 1609, -1, 1601, 1582, 1605, -1, 1602, 1605, 1581, -1, 1602, 1605, 1605, -1, 1604, 1581, 1605, -1, 1604, 1581, 1610, -1, 1604, 1581, 1609, -1, 1604, 1580, 1580, -1, 1604, 1582, 1605, -1, 1604, 1605, 1581, -1, 1605, 1581, 1580, -1, 1605, 1581, 1605, -1, 1605, 1581, 1610, -1, 1605, 1580, 1581, -1, 1605, 1580, 1605, -1, 1605, 1582, 1580, -1, 1605, 1582, 1605, -1, 1605, 1580, 1582, -1, 1607, 1605, 1580, -1, 1607, 1605, 1605, -1, 1606, 1581, 1605, -1, 1606, 1581, 1609, -1, 1606, 1580, 1605, -1, 1606, 1580, 1609, -1, 1606, 1605, 1610, -1, 1606, 1605, 1609, -1, 1610, 1605, 1605, -1, 1576, 1582, 1610, -1, 1578, 1580, 1610, -1, 1578, 1580, 1609, -1, 1578, 1582, 1610, -1, 1578, 1582, 1609, -1, 1578, 1605, 1610, -1, 1578, 1605, 1609, -1, 1580, 1605, 1610, -1, 1580, 1581, 1609, -1, 1580, 1605, 1609, -1, 1587, 1582, 1609, -1, 1589, 1581, 1610, -1, 1588, 1581, 1610, -1, 1590, 1581, 1610, -1, 1604, 1580, 1610, -1, 1604, 1605, 1610, -1, 1610, 1581, 1610, -1, 1610, 1580, 1610, -1, 1610, 1605, 1610, -1, 1605, 1605, 1610, -1, 1602, 1605, 1610, -1, 1606, 1581, 1610, -1, 1593, 1605, 1610, -1, 1603, 1605, 1610, -1, 1606, 1580, 1581, -1, 1605, 1582, 1610, -1, 1604, 1580, 1605, -1, 1603, 1605, 1605, -1, 1580, 1581, 1610, -1, 1581, 1580, 1610, -1, 1605, 1580, 1610, -1, 1601, 1605, 1610, -1, 1576, 1581, 1610, -1, 1587, 1582, 1610, -1, 1606, 1580, 1610, -1, 1589, 1604, 1746, -1, 1602, 1604, 1746, -1, 1575, 1604, 1604, 1607, -1, 1575, 1603, 1576, 1585, -1, 1605, 1581, 1605, 1583, -1, 1589, 1604, 1593, 1605, -1, 1585, 1587, 1608, 1604, -1, 1593, 1604, 1610, 1607, -1, 1608, 1587, 1604, 1605, -1, 1589, 1604, 1609, -1, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, -1, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, -1, 1585, 1740, 1575, 1604, -1, 44, -1, 12289, -1, 12290, -1, 58, -1, 33, -1, 63, -1, 12310, -1, 12311, -1, 8230, -1, 8229, -1, 8212, -1, 8211, -1, 95, -1, 123, -1, 125, -1, 12308, -1, 12309, -1, 12304, -1, 12305, -1, 12298, -1, 12299, -1, 12300, -1, 12301, -1, 12302, -1, 12303, -1, 91, -1, 93, -1, 8254, -1, 35, -1, 38, -1, 42, -1, 45, -1, 60, -1, 62, -1, 92, -1, 36, -1, 37, -1, 64, -1, 32, 1611, -1, 1600, 1611, -1, 32, 1612, -1, 32, 1613, -1, 32, 1614, -1, 1600, 1614, -1, 32, 1615, -1, 1600, 1615, -1, 32, 1616, -1, 1600, 1616, -1, 32, 1617, -1, 1600, 1617, -1, 32, 1618, -1, 1600, 1618, -1, 1569, -1, 1570, -1, 1571, -1, 1572, -1, 1573, -1, 1574, -1, 1575, -1, 1576, -1, 1577, -1, 1578, -1, 1579, -1, 1580, -1, 1581, -1, 1582, -1, 1583, -1, 1584, -1, 1585, -1, 1586, -1, 1587, -1, 1588, -1, 1589, -1, 1590, -1, 1591, -1, 1592, -1, 1593, -1, 1594, -1, 1601, -1, 1602, -1, 1603, -1, 1604, -1, 1605, -1, 1606, -1, 1607, -1, 1608, -1, 1610, -1, 1604, 1570, -1, 1604, 1571, -1, 1604, 1573, -1, 1604, 1575, -1, 34, -1, 39, -1, 47, -1, 65345, -1, 65346, -1, 65347, -1, 65348, -1, 65349, -1, 65350, -1, 65351, -1, 65352, -1, 65353, -1, 65354, -1, 65355, -1, 65356, -1, 65357, -1, 65358, -1, 65359, -1, 65360, -1, 65361, -1, 65362, -1, 65363, -1, 65364, -1, 65365, -1, 65366, -1, 65367, -1, 65368, -1, 65369, -1, 65370, -1, 94, -1, 124, -1, 126, -1, 10629, -1, 10630, -1, 12539, -1, 12449, -1, 12451, -1, 12453, -1, 12455, -1, 12457, -1, 12515, -1, 12517, -1, 12519, -1, 12483, -1, 12540, -1, 12531, -1, 12441, -1, 12442, -1, 12644, -1, 12593, -1, 12594, -1, 12595, -1, 12596, -1, 12597, -1, 12598, -1, 12599, -1, 12600, -1, 12601, -1, 12602, -1, 12603, -1, 12604, -1, 12605, -1, 12606, -1, 12607, -1, 12608, -1, 12609, -1, 12610, -1, 12611, -1, 12612, -1, 12613, -1, 12614, -1, 12615, -1, 12616, -1, 12617, -1, 12618, -1, 12619, -1, 12620, -1, 12621, -1, 12622, -1, 12623, -1, 12624, -1, 12625, -1, 12626, -1, 12627, -1, 12628, -1, 12629, -1, 12630, -1, 12631, -1, 12632, -1, 12633, -1, 12634, -1, 12635, -1, 12636, -1, 12637, -1, 12638, -1, 12639, -1, 12640, -1, 12641, -1, 12642, -1, 12643, -1, 162, -1, 163, -1, 172, -1, 175, -1, 166, -1, 165, -1, 8361, -1, 9474, -1, 8592, -1, 8593, -1, 8594, -1, 8595, -1, 9632, -1, 9675, -1, 66600, -1, 66601, -1, 66602, -1, 66603, -1, 66604, -1, 66605, -1, 66606, -1, 66607, -1, 66608, -1, 66609, -1, 66610, -1, 66611, -1, 66612, -1, 66613, -1, 66614, -1, 66615, -1, 66616, -1, 66617, -1, 66618, -1, 66619, -1, 66620, -1, 66621, -1, 66622, -1, 66623, -1, 66624, -1, 66625, -1, 66626, -1, 66627, -1, 66628, -1, 66629, -1, 66630, -1, 66631, -1, 66632, -1, 66633, -1, 66634, -1, 66635, -1, 66636, -1, 66637, -1, 66638, -1, 66639, -1, 119127, 119141, -1, 119128, 119141, -1, 119135, 119150, -1, 119135, 119151, -1, 119135, 119152, -1, 119135, 119153, -1, 119135, 119154, -1, 119225, 119141, -1, 119226, 119141, -1, 119227, 119150, -1, 119228, 119150, -1, 119227, 119151, -1, 119228, 119151, -1, 305, -1, 567, -1, 913, -1, 914, -1, 916, -1, 917, -1, 918, -1, 919, -1, 921, -1, 922, -1, 923, -1, 924, -1, 925, -1, 926, -1, 927, -1, 929, -1, 1012, -1, 932, -1, 934, -1, 935, -1, 936, -1, 8711, -1, 8706, -1, 1013, -1, 977, -1, 1008, -1, 981, -1, 1009, -1, 982, -1, 988, -1, 20029, -1, 20024, -1, 20033, -1, 131362, -1, 20320, -1, 20411, -1, 20482, -1, 20602, -1, 20633, -1, 20687, -1, 13470, -1, 132666, -1, 20820, -1, 20836, -1, 20855, -1, 132380, -1, 13497, -1, 20839, -1, 20877, -1, 132427, -1, 20887, -1, 20900, -1, 20172, -1, 20908, -1, 168415, -1, 20995, -1, 13535, -1, 21051, -1, 21062, -1, 21106, -1, 21111, -1, 13589, -1, 21253, -1, 21254, -1, 21321, -1, 21338, -1, 21363, -1, 21373, -1, 21375, -1, 133676, -1, 28784, -1, 21450, -1, 21471, -1, 133987, -1, 21483, -1, 21489, -1, 21510, -1, 21662, -1, 21560, -1, 21576, -1, 21608, -1, 21666, -1, 21750, -1, 21776, -1, 21843, -1, 21859, -1, 21892, -1, 21931, -1, 21939, -1, 21954, -1, 22294, -1, 22295, -1, 22097, -1, 22132, -1, 22766, -1, 22478, -1, 22516, -1, 22541, -1, 22411, -1, 22578, -1, 22577, -1, 22700, -1, 136420, -1, 22770, -1, 22775, -1, 22790, -1, 22810, -1, 22818, -1, 22882, -1, 136872, -1, 136938, -1, 23020, -1, 23067, -1, 23079, -1, 23000, -1, 23142, -1, 14062, -1, 14076, -1, 23304, -1, 23358, -1, 137672, -1, 23491, -1, 23512, -1, 23539, -1, 138008, -1, 23551, -1, 23558, -1, 24403, -1, 14209, -1, 23648, -1, 23744, -1, 23693, -1, 138724, -1, 23875, -1, 138726, -1, 23918, -1, 23915, -1, 23932, -1, 24033, -1, 24034, -1, 14383, -1, 24061, -1, 24104, -1, 24125, -1, 24169, -1, 14434, -1, 139651, -1, 14460, -1, 24240, -1, 24243, -1, 24246, -1, 172946, -1, 140081, -1, 33281, -1, 24354, -1, 14535, -1, 144056, -1, 156122, -1, 24418, -1, 24427, -1, 14563, -1, 24474, -1, 24525, -1, 24535, -1, 24569, -1, 24705, -1, 14650, -1, 14620, -1, 141012, -1, 24775, -1, 24904, -1, 24908, -1, 24954, -1, 25010, -1, 24996, -1, 25007, -1, 25054, -1, 25104, -1, 25115, -1, 25181, -1, 25265, -1, 25300, -1, 25424, -1, 142092, -1, 25405, -1, 25340, -1, 25448, -1, 25475, -1, 25572, -1, 142321, -1, 25634, -1, 25541, -1, 25513, -1, 14894, -1, 25705, -1, 25726, -1, 25757, -1, 25719, -1, 14956, -1, 25964, -1, 143370, -1, 26083, -1, 26360, -1, 26185, -1, 15129, -1, 15112, -1, 15076, -1, 20882, -1, 20885, -1, 26368, -1, 26268, -1, 32941, -1, 17369, -1, 26401, -1, 26462, -1, 26451, -1, 144323, -1, 15177, -1, 26618, -1, 26501, -1, 26706, -1, 144493, -1, 26766, -1, 26655, -1, 26900, -1, 26946, -1, 27043, -1, 27114, -1, 27304, -1, 145059, -1, 27355, -1, 15384, -1, 27425, -1, 145575, -1, 27476, -1, 15438, -1, 27506, -1, 27551, -1, 27579, -1, 146061, -1, 138507, -1, 146170, -1, 27726, -1, 146620, -1, 27839, -1, 27853, -1, 27751, -1, 27926, -1, 27966, -1, 28009, -1, 28024, -1, 28037, -1, 146718, -1, 27956, -1, 28207, -1, 28270, -1, 15667, -1, 28359, -1, 147153, -1, 28153, -1, 28526, -1, 147294, -1, 147342, -1, 28614, -1, 28729, -1, 28699, -1, 15766, -1, 28746, -1, 28797, -1, 28791, -1, 28845, -1, 132389, -1, 28997, -1, 148067, -1, 29084, -1, 148395, -1, 29224, -1, 29264, -1, 149000, -1, 29312, -1, 29333, -1, 149301, -1, 149524, -1, 29562, -1, 29579, -1, 16044, -1, 29605, -1, 16056, -1, 29767, -1, 29788, -1, 29829, -1, 29898, -1, 16155, -1, 29988, -1, 150582, -1, 30014, -1, 150674, -1, 139679, -1, 30224, -1, 151457, -1, 151480, -1, 151620, -1, 16380, -1, 16392, -1, 151795, -1, 151794, -1, 151833, -1, 151859, -1, 30494, -1, 30495, -1, 30603, -1, 16454, -1, 16534, -1, 152605, -1, 30798, -1, 16611, -1, 153126, -1, 153242, -1, 153285, -1, 31211, -1, 16687, -1, 31306, -1, 31311, -1, 153980, -1, 154279, -1, 31470, -1, 16898, -1, 154539, -1, 31686, -1, 31689, -1, 16935, -1, 154752, -1, 31954, -1, 17056, -1, 31976, -1, 31971, -1, 32000, -1, 155526, -1, 32099, -1, 17153, -1, 32199, -1, 32258, -1, 32325, -1, 17204, -1, 156200, -1, 156231, -1, 17241, -1, 156377, -1, 32634, -1, 156478, -1, 32661, -1, 32762, -1, 156890, -1, 156963, -1, 32864, -1, 157096, -1, 32880, -1, 144223, -1, 17365, -1, 32946, -1, 33027, -1, 17419, -1, 33086, -1, 23221, -1, 157607, -1, 157621, -1, 144275, -1, 144284, -1, 33284, -1, 36766, -1, 17515, -1, 33425, -1, 33419, -1, 33437, -1, 21171, -1, 33457, -1, 33459, -1, 33469, -1, 33510, -1, 158524, -1, 33565, -1, 33635, -1, 33709, -1, 33571, -1, 33725, -1, 33767, -1, 33619, -1, 33738, -1, 33740, -1, 33756, -1, 158774, -1, 159083, -1, 158933, -1, 17707, -1, 34033, -1, 34035, -1, 34070, -1, 160714, -1, 34148, -1, 159532, -1, 17757, -1, 17761, -1, 159665, -1, 159954, -1, 17771, -1, 34384, -1, 34407, -1, 34409, -1, 34473, -1, 34440, -1, 34574, -1, 34530, -1, 34600, -1, 34667, -1, 34694, -1, 17879, -1, 34785, -1, 34817, -1, 17913, -1, 34912, -1, 161383, -1, 35031, -1, 35038, -1, 17973, -1, 35066, -1, 13499, -1, 161966, -1, 162150, -1, 18110, -1, 18119, -1, 35488, -1, 162984, -1, 36011, -1, 36033, -1, 36123, -1, 36215, -1, 163631, -1, 133124, -1, 36299, -1, 36284, -1, 36336, -1, 133342, -1, 36564, -1, 165330, -1, 165357, -1, 37012, -1, 37105, -1, 37137, -1, 165678, -1, 37147, -1, 37432, -1, 37591, -1, 37592, -1, 37500, -1, 37881, -1, 37909, -1, 166906, -1, 38283, -1, 18837, -1, 38327, -1, 167287, -1, 18918, -1, 38595, -1, 23986, -1, 38691, -1, 168261, -1, 168474, -1, 19054, -1, 19062, -1, 38880, -1, 168970, -1, 19122, -1, 169110, -1, 38953, -1, 169398, -1, 39138, -1, 19251, -1, 39209, -1, 39335, -1, 39362, -1, 39422, -1, 19406, -1, 170800, -1, 40000, -1, 40189, -1, 19662, -1, 19693, -1, 40295, -1, 172238, -1, 19704, -1, 172293, -1, 172558, -1, 172689, -1, 19798, -1, 40702, -1, 40709, -1, 40719, -1, 40726, -1, 173568, -1, }; const uint16_t utf8proc_stage1table[] = { 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656, 6912, 2048, 7168, 7424, 7680, 7936, 8192, 8448, 8704, 8960, 9216, 9472, 9728, 9984, 10240, 10496, 10752, 11008, 11264, 11520, 11776, 12032, 12288, 12544, 12800, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 13056, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 13312, 13568, 5376, 5376, 5376, 13824, 2048, 2048, 14080, 14336, 2048, 2048, 2048, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 14592, 14848, 14848, 14848, 14848, 14848, 14848, 14848, 14848, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15360, 15616, 15872, 16128, 16384, 16640, 16896, 17152, 17408, 2048, 17664, 17920, 2048, 2048, 2048, 18176, 18432, 18688, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 5376, 5376, 5376, 18944, 19200, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 19456, 19712, 19968, 20224, 20480, 20736, 20992, 21248, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 21504, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 21760, 22016, 22272, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 22528, 22784, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 23040, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 23040, }; const uint16_t utf8proc_stage2table[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 6, 7, 8, 8, 9, 10, 9, 8, 8, 11, 12, 8, 13, 14, 15, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 8, 17, 18, 19, 8, 8, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 11, 8, 12, 46, 47, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 11, 74, 12, 74, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 75, 8, 10, 10, 10, 10, 76, 76, 77, 76, 78, 79, 74, 80, 76, 81, 82, 83, 84, 85, 86, 87, 76, 8, 88, 89, 90, 91, 92, 93, 94, 8, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 74, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 74, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 213, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 213, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 213, 213, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 213, 339, 340, 341, 213, 342, 339, 339, 339, 339, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 213, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 213, 213, 213, 213, 213, 213, 454, 455, 456, 457, 458, 213, 213, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 213, 213, 213, 474, 475, 213, 476, 477, 213, 478, 213, 479, 213, 213, 213, 213, 480, 213, 213, 481, 213, 213, 213, 213, 482, 483, 213, 484, 213, 213, 213, 485, 213, 213, 486, 213, 213, 487, 213, 213, 213, 213, 213, 213, 213, 488, 213, 213, 489, 213, 213, 490, 213, 213, 213, 213, 491, 492, 493, 494, 495, 213, 213, 213, 213, 213, 496, 213, 339, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 506, 507, 507, 507, 507, 507, 507, 507, 46, 46, 46, 46, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 507, 507, 46, 46, 46, 46, 46, 46, 508, 509, 510, 511, 512, 513, 46, 46, 514, 515, 516, 517, 518, 46, 46, 46, 46, 46, 46, 46, 46, 46, 507, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 524, 524, 532, 524, 533, 524, 534, 535, 536, 537, 537, 537, 537, 536, 538, 537, 537, 537, 537, 537, 539, 539, 540, 541, 542, 543, 544, 545, 537, 537, 537, 537, 546, 547, 537, 548, 549, 537, 537, 550, 550, 550, 550, 551, 537, 537, 537, 537, 524, 524, 524, 552, 553, 554, 555, 556, 557, 524, 537, 537, 537, 524, 524, 524, 537, 537, 558, 524, 524, 524, 537, 537, 537, 537, 524, 536, 537, 537, 524, 559, 560, 560, 559, 560, 560, 559, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 0, 0, 0, 0, 561, 46, 0, 0, 0, 0, 562, 563, 564, 565, 566, 0, 0, 0, 0, 0, 86, 567, 568, 569, 570, 571, 572, 0, 573, 0, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 0, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 0, 638, 639, 640, 641, 642, 643, 644, 213, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 213, 672, 673, 74, 674, 675, 676, 677, 678, 213, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 524, 524, 524, 524, 0, 813, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 0, 0, 507, 990, 990, 990, 990, 990, 990, 0, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 0, 990, 1030, 0, 0, 0, 0, 0, 0, 537, 524, 524, 524, 524, 537, 524, 524, 524, 1031, 537, 524, 524, 524, 524, 524, 524, 537, 537, 537, 537, 537, 537, 524, 524, 537, 524, 524, 1031, 1032, 524, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1042, 1043, 1044, 1045, 1046, 1047, 1046, 1048, 1049, 1046, 524, 537, 1046, 1041, 0, 0, 0, 0, 0, 0, 0, 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 0, 0, 0, 0, 0, 1050, 1050, 1050, 1046, 1046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051, 1051, 1051, 1051, 0, 0, 0, 0, 0, 0, 0, 1052, 14, 1053, 76, 76, 524, 524, 524, 524, 524, 524, 0, 0, 0, 0, 0, 1053, 0, 0, 1053, 1053, 0, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 0, 0, 0, 0, 0, 1061, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1062, 1054, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 537, 524, 524, 524, 524, 524, 537, 524, 524, 0, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 9, 1076, 1076, 1053, 1054, 1054, 1077, 1054, 1054, 1054, 1054, 1078, 1079, 1080, 1081, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1082, 1083, 1084, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1085, 1086, 1053, 1087, 524, 524, 524, 524, 524, 524, 524, 1051, 813, 524, 524, 524, 524, 537, 524, 1061, 1061, 524, 524, 76, 537, 524, 524, 537, 1054, 1054, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1054, 1054, 1054, 1088, 1088, 1054, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 0, 80, 1054, 1089, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 524, 537, 524, 524, 537, 524, 524, 537, 537, 537, 524, 537, 537, 524, 537, 524, 524, 524, 537, 524, 537, 524, 537, 524, 537, 524, 524, 0, 0, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 524, 524, 524, 524, 524, 524, 524, 537, 524, 1092, 1092, 76, 8, 8, 8, 1092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1090, 1090, 1093, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1094, 1095, 339, 339, 339, 339, 339, 339, 1096, 1097, 339, 1098, 1099, 339, 339, 339, 339, 339, 0, 0, 1100, 339, 1093, 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1093, 1093, 1093, 1093, 1101, 0, 0, 339, 524, 537, 524, 524, 0, 0, 0, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 339, 339, 1090, 1090, 990, 990, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 0, 1090, 1093, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 0, 0, 0, 339, 339, 339, 339, 0, 0, 1111, 339, 1112, 1093, 1093, 1090, 1090, 1090, 1090, 0, 0, 1113, 1093, 0, 0, 1114, 1115, 1101, 339, 0, 0, 0, 0, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 1117, 1118, 0, 1119, 339, 339, 1090, 1090, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 339, 339, 10, 10, 1120, 1120, 1120, 1120, 1120, 1120, 812, 0, 0, 0, 0, 0, 0, 1090, 1090, 1093, 0, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 1121, 0, 339, 1122, 0, 339, 339, 0, 0, 1111, 0, 1093, 1093, 1093, 1090, 1090, 0, 0, 0, 0, 1090, 1090, 0, 0, 1090, 1090, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1123, 1124, 1125, 339, 0, 1126, 0, 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1090, 1090, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1090, 1090, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 0, 339, 339, 339, 339, 339, 0, 0, 1111, 339, 1093, 1093, 1093, 1090, 1090, 1090, 1090, 1090, 0, 1090, 1090, 1093, 0, 1093, 1093, 1101, 0, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 1090, 1090, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1090, 1093, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 0, 339, 339, 339, 339, 339, 0, 0, 1111, 339, 1127, 1090, 1093, 1090, 1090, 1090, 0, 0, 0, 1128, 1129, 0, 0, 1130, 1131, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 1132, 1133, 0, 0, 0, 0, 1134, 1135, 0, 339, 339, 339, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 812, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1090, 339, 0, 339, 339, 339, 339, 339, 339, 0, 0, 0, 339, 339, 339, 0, 1136, 339, 1137, 339, 0, 0, 0, 339, 339, 0, 339, 0, 339, 339, 0, 0, 0, 339, 339, 0, 0, 0, 339, 339, 339, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 1138, 1093, 1090, 1093, 1093, 0, 0, 0, 1139, 1140, 1093, 0, 1141, 1142, 1143, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1120, 1120, 1120, 76, 76, 76, 76, 76, 76, 10, 76, 0, 0, 0, 0, 0, 0, 1093, 1093, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 0, 0, 0, 0, 1090, 1090, 1090, 1093, 1093, 1093, 1093, 0, 1145, 1090, 1146, 0, 1090, 1090, 1090, 1101, 0, 0, 0, 0, 0, 0, 0, 1147, 1148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1093, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 0, 0, 1111, 339, 1093, 1149, 1150, 1093, 1151, 1093, 1093, 0, 1152, 1153, 1154, 0, 1155, 1156, 1090, 1101, 0, 0, 0, 0, 0, 0, 0, 1157, 1158, 0, 0, 0, 0, 0, 0, 0, 339, 0, 339, 339, 1090, 1090, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1093, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 1159, 1093, 1093, 1090, 1090, 1090, 0, 0, 1160, 1161, 1093, 0, 1162, 1163, 1164, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1165, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1093, 1093, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 1166, 0, 0, 0, 0, 1167, 1093, 1093, 1090, 1090, 1090, 0, 1090, 0, 1093, 1168, 1169, 1093, 1170, 1171, 1172, 1173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1093, 1093, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1090, 339, 1174, 1090, 1090, 1090, 1090, 1175, 1175, 1101, 0, 0, 0, 0, 10, 339, 339, 339, 339, 339, 339, 507, 1090, 1176, 1176, 1176, 1176, 1090, 1090, 1090, 990, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 990, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 0, 339, 0, 0, 339, 339, 0, 339, 0, 0, 339, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 0, 339, 0, 339, 0, 0, 339, 339, 0, 339, 339, 339, 339, 1090, 339, 1177, 1090, 1090, 1090, 1090, 1178, 1178, 0, 1090, 1090, 339, 0, 0, 339, 339, 339, 339, 339, 0, 507, 0, 1179, 1179, 1179, 1179, 1090, 1090, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 1180, 1181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 812, 812, 812, 990, 990, 990, 990, 990, 990, 990, 990, 1182, 990, 990, 990, 990, 990, 990, 812, 812, 812, 812, 812, 537, 537, 812, 812, 812, 812, 812, 812, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 812, 537, 812, 537, 812, 1183, 11, 12, 11, 12, 1093, 1093, 339, 339, 339, 1184, 339, 339, 339, 339, 0, 339, 339, 339, 339, 1185, 339, 339, 339, 339, 1186, 339, 339, 339, 339, 1187, 339, 339, 339, 339, 1188, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1189, 339, 0, 0, 0, 0, 0, 0, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1191, 1191, 1191, 1191, 1090, 1093, 1191, 1199, 524, 524, 1101, 990, 524, 524, 339, 339, 339, 339, 0, 0, 0, 0, 1090, 1090, 1090, 1200, 1090, 1090, 1090, 1090, 0, 1090, 1090, 1090, 1090, 1201, 1090, 1090, 1090, 1090, 1202, 1090, 1090, 1090, 1090, 1203, 1090, 1090, 1090, 1090, 1204, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1205, 1090, 1090, 1090, 0, 812, 812, 812, 812, 812, 812, 812, 812, 537, 812, 812, 812, 812, 812, 812, 0, 0, 812, 990, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 1206, 1207, 339, 0, 339, 339, 0, 1093, 1090, 1208, 1090, 1090, 1093, 1090, 0, 0, 0, 1090, 1111, 1093, 1101, 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 990, 990, 990, 990, 990, 990, 339, 339, 339, 339, 339, 339, 1093, 1093, 1090, 1090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 990, 1247, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 1248, 1248, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 0, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 0, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 524, 812, 990, 990, 990, 990, 990, 990, 990, 990, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 990, 990, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 11, 12, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 990, 990, 990, 1249, 1249, 1249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 1090, 1090, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1090, 1090, 1101, 990, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1090, 1090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 0, 1090, 1090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1250, 1250, 1093, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1090, 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1101, 1090, 990, 990, 990, 507, 990, 990, 990, 10, 339, 524, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 1030, 8, 8, 8, 8, 558, 558, 558, 7, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 507, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 1090, 1090, 1090, 1093, 1093, 1093, 1093, 1090, 1090, 1252, 1252, 1252, 0, 0, 0, 0, 1093, 1093, 1090, 1093, 1093, 1093, 1093, 1093, 1093, 1031, 524, 537, 0, 0, 0, 0, 76, 0, 0, 0, 8, 8, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 339, 339, 339, 339, 339, 339, 339, 1093, 1093, 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 0, 0, 8, 8, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 524, 537, 1093, 1093, 1093, 0, 0, 990, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1090, 1090, 1090, 1090, 1093, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 339, 339, 1263, 1264, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1111, 1265, 1090, 1090, 1090, 1090, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 990, 990, 990, 990, 990, 990, 990, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 524, 537, 524, 524, 524, 524, 524, 524, 524, 812, 812, 812, 812, 812, 812, 812, 812, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1277, 1278, 1279, 507, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 507, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 507, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1337, 213, 213, 213, 213, 1338, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1339, 1340, 1341, 1342, 1307, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 524, 524, 537, 524, 524, 524, 524, 524, 524, 524, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 537, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 0, 0, 0, 0, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 0, 0, 0, 0, 0, 0, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 0, 0, 1643, 1644, 1645, 1646, 1647, 1648, 0, 0, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 0, 0, 1687, 1688, 1689, 1690, 1691, 1692, 0, 0, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 0, 1701, 0, 1702, 0, 1703, 0, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 0, 0, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 0, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 0, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 0, 0, 1817, 1818, 1819, 1820, 1821, 1822, 0, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 0, 0, 1842, 1843, 1844, 0, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 0, 1854, 1855, 1856, 1856, 1856, 1856, 1856, 1857, 1856, 1856, 1856, 80, 1858, 1858, 1250, 1859, 1030, 1860, 1030, 1030, 1030, 1030, 8, 1861, 79, 91, 11, 79, 79, 91, 11, 79, 8, 8, 8, 8, 1862, 1863, 1864, 8, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 75, 9, 9, 9, 1872, 1873, 8, 1874, 1875, 8, 79, 91, 8, 1876, 8, 1877, 47, 47, 8, 8, 8, 1878, 11, 12, 1879, 1880, 1881, 8, 8, 8, 8, 8, 8, 8, 8, 74, 8, 47, 8, 8, 1882, 8, 8, 8, 8, 8, 8, 8, 1856, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 1883, 1884, 0, 0, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 0, 1912, 1913, 1914, 1915, 1916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 1917, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 524, 550, 550, 524, 524, 524, 524, 550, 550, 550, 524, 524, 813, 813, 813, 813, 524, 813, 813, 813, 550, 550, 524, 537, 524, 550, 550, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1918, 1919, 1920, 1921, 76, 1922, 1923, 1924, 76, 1925, 1926, 1927, 1927, 1927, 1928, 1929, 1930, 1930, 1931, 1932, 76, 1933, 1934, 76, 76, 1935, 1936, 1937, 1937, 1937, 76, 76, 1938, 1939, 1940, 76, 1941, 76, 1942, 76, 1941, 76, 1943, 1944, 1945, 1920, 82, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 76, 1957, 1958, 1959, 1960, 1961, 1962, 74, 74, 74, 74, 1963, 1964, 1946, 1956, 1965, 76, 74, 76, 76, 1966, 0, 0, 0, 0, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 1249, 1249, 1249, 2012, 2013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2014, 74, 2015, 74, 2016, 76, 76, 76, 76, 76, 2017, 2018, 76, 76, 76, 76, 74, 76, 76, 74, 76, 76, 74, 76, 76, 76, 76, 76, 76, 76, 2019, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 2020, 2021, 2022, 2023, 76, 2024, 76, 2025, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 2027, 2028, 74, 74, 74, 2029, 2030, 2026, 2031, 2032, 2026, 74, 74, 74, 2026, 13, 83, 74, 2026, 2026, 74, 74, 74, 2026, 2026, 2026, 2026, 74, 2026, 2026, 2026, 2026, 2033, 2034, 2035, 2036, 74, 74, 74, 74, 2026, 2037, 2038, 2026, 2039, 2040, 2026, 2026, 2026, 74, 74, 74, 74, 74, 2026, 74, 2026, 2041, 2026, 2026, 2026, 2026, 2042, 2026, 2043, 2044, 2045, 2026, 2046, 2047, 2048, 2026, 2026, 2026, 2049, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2050, 2051, 2052, 74, 2053, 2054, 2026, 2026, 2026, 2026, 2026, 2026, 74, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2026, 2026, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2026, 2026, 2026, 74, 74, 2026, 2026, 2082, 2083, 74, 74, 74, 74, 74, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2084, 2026, 74, 74, 2026, 2026, 2085, 2086, 2026, 2087, 2088, 2089, 2090, 2091, 2026, 2026, 2092, 2093, 2094, 2095, 2026, 2026, 2026, 74, 74, 74, 74, 74, 2026, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 74, 74, 2026, 2026, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2096, 2097, 2098, 2099, 2026, 2026, 2026, 2026, 2026, 2026, 2100, 2101, 2102, 2103, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 76, 76, 76, 76, 76, 76, 76, 76, 2026, 2026, 2026, 2026, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 2026, 2026, 76, 76, 76, 76, 76, 76, 76, 2104, 2105, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 76, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 812, 76, 76, 76, 76, 76, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 74, 74, 74, 74, 74, 74, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 74, 74, 74, 74, 74, 74, 74, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 812, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 0, 76, 76, 76, 76, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 76, 0, 76, 76, 76, 76, 0, 0, 0, 76, 0, 76, 76, 76, 76, 76, 76, 76, 0, 0, 76, 76, 76, 76, 76, 76, 76, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 76, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 2026, 74, 74, 2026, 2026, 11, 12, 74, 74, 74, 74, 0, 0, 0, 0, 0, 74, 74, 74, 2026, 2026, 2026, 2026, 74, 74, 74, 74, 74, 2026, 2026, 2026, 74, 74, 74, 2026, 2026, 2026, 2026, 11, 12, 11, 12, 11, 12, 0, 0, 0, 0, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 74, 74, 74, 2026, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 74, 2026, 2026, 74, 74, 11, 12, 11, 12, 2026, 74, 74, 74, 74, 2026, 74, 2026, 2026, 2026, 74, 74, 2026, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 74, 74, 11, 12, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 2245, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, 2026, 2026, 2026, 2026, 74, 74, 2026, 74, 2026, 74, 74, 2026, 74, 2026, 2026, 2026, 2026, 74, 74, 74, 74, 74, 2026, 2026, 74, 74, 74, 74, 74, 74, 2026, 2026, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2026, 2026, 74, 74, 74, 74, 2026, 2026, 2026, 2026, 74, 2026, 2026, 74, 74, 2026, 2246, 2247, 2248, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, 74, 74, 74, 74, 2249, 2250, 2026, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 74, 74, 74, 74, 74, 2026, 2026, 2026, 74, 74, 74, 74, 2026, 74, 74, 74, 2026, 2026, 2026, 2026, 2026, 74, 2026, 74, 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 0, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 0, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 0, 0, 0, 0, 0, 0, 0, 213, 2358, 2359, 213, 0, 0, 0, 0, 0, 0, 0, 0, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 213, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 1251, 8, 8, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 79, 91, 79, 91, 8, 8, 8, 79, 91, 8, 79, 91, 8, 8, 8, 8, 8, 8, 8, 8, 8, 1030, 0, 0, 0, 0, 79, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 76, 76, 76, 76, 2499, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 2500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 2715, 8, 8, 8, 76, 507, 339, 1249, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 76, 76, 11, 12, 11, 12, 11, 12, 11, 12, 1030, 11, 12, 12, 76, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 2716, 1032, 536, 1031, 2717, 2717, 1030, 507, 507, 507, 507, 507, 2718, 76, 2719, 2720, 2721, 507, 339, 8, 76, 76, 0, 339, 339, 339, 339, 339, 2722, 339, 339, 339, 339, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 339, 2747, 2748, 2749, 2750, 2751, 2752, 339, 339, 339, 339, 339, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 2768, 339, 339, 0, 0, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 1030, 339, 339, 339, 339, 339, 2776, 339, 339, 339, 339, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 339, 2801, 2802, 2803, 2804, 2805, 2806, 339, 339, 339, 339, 339, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 2822, 2823, 2824, 2825, 339, 2826, 339, 339, 2827, 2828, 2829, 2830, 8, 507, 2831, 2832, 2833, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 0, 812, 812, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 0, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 812, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 0, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 507, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 506, 506, 506, 506, 0, 0, 0, 0, 0, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 1252, 339, 339, 339, 1101, 339, 339, 339, 339, 1090, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1093, 1093, 1090, 1090, 1093, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3460, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3550, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3534, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3460, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3536, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 339, 339, 3705, 339, 3706, 339, 339, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 339, 3717, 339, 3718, 339, 339, 3719, 3720, 339, 339, 339, 3721, 3722, 3723, 3724, 0, 0, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3589, 3764, 3765, 3766, 3767, 3768, 3769, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3719, 3778, 3779, 3780, 0, 0, 0, 0, 0, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3731, 3789, 3790, 3791, 3705, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3740, 3804, 3741, 3805, 3806, 3807, 3808, 3809, 3706, 3481, 3810, 3811, 3812, 3551, 3638, 3813, 3814, 3748, 3815, 3749, 3816, 3817, 3818, 3708, 3819, 3820, 3821, 3822, 3823, 3709, 3824, 3825, 3826, 3827, 3828, 3829, 3763, 3830, 3831, 3589, 3832, 3767, 3833, 3834, 3835, 3836, 3837, 3772, 3838, 3718, 3839, 3773, 3532, 3840, 3774, 3841, 3776, 3842, 3843, 3844, 3845, 3846, 3778, 3714, 3847, 3779, 3848, 3780, 3849, 3448, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3868, 3869, 3870, 3871, 3872, 0, 0, 0, 0, 0, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 0, 3899, 3900, 3901, 3902, 3903, 0, 3904, 0, 3905, 3906, 0, 3907, 3908, 0, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4055, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 4164, 4056, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 0, 0, 4444, 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 76, 0, 0, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 0, 0, 0, 0, 0, 0, 524, 524, 524, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4521, 4522, 4523, 4524, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 8, 8, 4541, 4542, 4543, 4543, 4543, 4543, 4544, 4544, 4544, 4545, 4546, 4547, 0, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 0, 4567, 4568, 4569, 4570, 0, 0, 0, 0, 4571, 4572, 4573, 1054, 4574, 0, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 0, 0, 80, 0, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899, 0, 0, 0, 4900, 4901, 4902, 4903, 4904, 4905, 0, 0, 4906, 4907, 4908, 4909, 4910, 4911, 0, 0, 4912, 4913, 4914, 4915, 4916, 4917, 0, 0, 4918, 4919, 4920, 0, 0, 0, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 0, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4935, 4935, 4935, 76, 76, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 339, 339, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 990, 8, 812, 0, 0, 0, 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 0, 0, 0, 812, 812, 812, 812, 812, 812, 812, 812, 812, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 1251, 1251, 1251, 1251, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 1120, 1120, 1120, 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 1249, 339, 339, 339, 339, 339, 339, 339, 339, 1249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 990, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 990, 1249, 1249, 1249, 1249, 1249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1050, 1050, 1050, 1050, 1050, 1050, 0, 0, 1050, 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 0, 1050, 1050, 0, 0, 0, 1050, 0, 0, 1050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 5017, 5017, 5017, 5017, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1050, 1090, 1090, 1090, 0, 1090, 1090, 0, 0, 0, 0, 0, 1090, 537, 1090, 524, 1050, 1050, 1050, 1050, 0, 1050, 1050, 1050, 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 0, 0, 0, 0, 524, 550, 537, 0, 0, 0, 0, 1101, 5017, 5017, 5017, 5017, 5017, 5017, 5017, 5017, 0, 0, 0, 0, 0, 0, 0, 0, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 990, 990, 990, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 0, 0, 0, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 5018, 5019, 812, 812, 812, 812, 812, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 550, 550, 550, 812, 812, 812, 5029, 5030, 5031, 5032, 5033, 5034, 80, 80, 80, 80, 80, 80, 80, 80, 537, 537, 537, 537, 537, 537, 537, 537, 812, 812, 524, 524, 524, 524, 524, 537, 537, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 524, 524, 524, 524, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 524, 524, 524, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 0, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 0, 1920, 1963, 0, 0, 5044, 0, 0, 5045, 5046, 0, 0, 1933, 5047, 1935, 1936, 0, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 0, 5058, 0, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 0, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 0, 1963, 1947, 1948, 5044, 0, 0, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 0, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 0, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 0, 1963, 1947, 1948, 5044, 0, 1930, 5045, 5046, 1931, 1950, 0, 5047, 0, 0, 0, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 0, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 0, 0, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, 5130, 0, 0, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5141, 5142, 5143, 5144, 5145, 3725, 5146, 5147, 5148, 5149, 3726, 5150, 5151, 5152, 3727, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, 3782, 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, 5173, 3787, 3728, 3729, 3788, 5174, 5175, 3538, 5176, 3730, 5177, 5178, 5179, 5180, 5180, 5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5198, 3790, 5199, 5200, 5201, 5202, 3732, 5203, 5204, 5205, 3691, 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5231, 5232, 5233, 5234, 3534, 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 3737, 5243, 5244, 5245, 5246, 5247, 5248, 5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, 5263, 3480, 5264, 5265, 5266, 5266, 5267, 5268, 5268, 5269, 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, 3738, 5282, 5283, 5284, 5285, 3802, 5285, 5286, 3740, 5287, 5288, 5289, 5290, 3741, 3453, 5291, 5292, 5293, 5294, 5295, 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 3742, 5313, 5314, 5315, 5316, 5317, 5318, 3744, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 3481, 3810, 5327, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 3745, 5335, 5336, 5337, 5338, 3853, 5339, 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5347, 5348, 5349, 5350, 5351, 3551, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 5361, 5362, 3746, 3638, 5363, 5364, 5365, 5366, 5367, 5368, 5369, 5370, 3814, 5371, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 3815, 5379, 5380, 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 5389, 5390, 3817, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, 5400, 5401, 5401, 5402, 5403, 3819, 5404, 5405, 5406, 5407, 5408, 5409, 5410, 3537, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 3825, 5418, 5419, 5420, 5421, 5422, 5423, 5423, 3826, 3855, 5424, 5425, 5426, 5427, 5428, 3499, 3828, 5429, 5430, 3757, 5431, 5432, 3713, 5433, 5434, 3761, 5435, 5436, 5437, 5438, 5438, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464, 5465, 3767, 5466, 5467, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479, 5480, 5481, 5267, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5493, 3555, 5494, 5495, 5496, 5497, 5498, 5499, 3770, 5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 5519, 3494, 5520, 5521, 5522, 5523, 5524, 5525, 3835, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, 3840, 3841, 5546, 5547, 5548, 5549, 5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 3842, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584, 5585, 5586, 5587, 5588, 3848, 3848, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 3849, 5599, 5600, 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 0, 0, }; const utf8proc_property_t utf8proc_properties[] = { {0, 0, 0, 0, NULL, false, -1, -1, -1, -1, -1, false}, {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17580, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17400, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17640, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 97, -1, 0, -1, false, false, false, false, utf8proc_sequences + 0}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 98, -1, 8640, -1, false, false, false, false, utf8proc_sequences + 2}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 99, -1, 60, -1, false, false, false, false, utf8proc_sequences + 4}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 100, -1, 960, -1, false, false, false, false, utf8proc_sequences + 6}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 101, -1, 120, -1, false, false, false, false, utf8proc_sequences + 8}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 102, -1, 9120, -1, false, false, false, false, utf8proc_sequences + 10}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 103, -1, 1080, -1, false, false, false, false, utf8proc_sequences + 12}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 104, -1, 1200, -1, false, false, false, false, utf8proc_sequences + 14}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 105, -1, 180, -1, false, false, false, false, utf8proc_sequences + 16}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 106, -1, 1320, -1, false, false, false, false, utf8proc_sequences + 18}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 107, -1, 1440, -1, false, false, false, false, utf8proc_sequences + 20}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 108, -1, 1560, -1, false, false, false, false, utf8proc_sequences + 22}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 109, -1, 9480, -1, false, false, false, false, utf8proc_sequences + 24}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 110, -1, 240, -1, false, false, false, false, utf8proc_sequences + 26}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 111, -1, 300, -1, false, false, false, false, utf8proc_sequences + 28}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 112, -1, 9720, -1, false, false, false, false, utf8proc_sequences + 30}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 32}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 114, -1, 1680, -1, false, false, false, false, utf8proc_sequences + 34}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 115, -1, 1800, -1, false, false, false, false, utf8proc_sequences + 36}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 116, -1, 1920, -1, false, false, false, false, utf8proc_sequences + 38}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 117, -1, 360, -1, false, false, false, false, utf8proc_sequences + 40}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 118, -1, 10560, -1, false, false, false, false, utf8proc_sequences + 42}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 119, -1, 2040, -1, false, false, false, false, utf8proc_sequences + 44}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 120, -1, 10680, -1, false, false, false, false, utf8proc_sequences + 46}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 121, -1, 420, -1, false, false, false, false, utf8proc_sequences + 48}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 122, -1, 2160, -1, false, false, false, false, utf8proc_sequences + 50}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 65, -1, 65, 480, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66, -1, 66, 8700, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 67, -1, 67, 540, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 68, -1, 68, 1020, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 69, -1, 69, 600, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 70, -1, 70, 9180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 71, -1, 71, 1140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 72, -1, 72, 1260, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, 660, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 74, -1, 74, 1380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 75, -1, 75, 1500, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 76, -1, 76, 1620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 77, -1, 77, 9540, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 78, -1, 78, 720, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 79, -1, 79, 780, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 80, -1, 80, 9780, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 81, -1, 81, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 82, -1, 82, 1740, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 83, -1, 83, 1860, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 84, -1, 84, 1980, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 85, -1, 85, 840, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 86, -1, 86, 10620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 87, -1, 87, 2100, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 88, -1, 88, 10740, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 89, -1, 89, 900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 90, -1, 90, 2220, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 54, false, -1, -1, -1, 3600, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 57, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 64, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 67, false, 924, -1, 924, -1, -1, false, false, false, false, utf8proc_sequences + 67}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 69, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 74, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 78, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 82, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 86, false, -1, 224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 89}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 91, false, -1, 225, -1, -1, -1, false, false, false, false, utf8proc_sequences + 94}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 96, false, -1, 226, -1, 10860, -1, false, false, false, false, utf8proc_sequences + 99}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 101, false, -1, 227, -1, -1, -1, false, false, false, false, utf8proc_sequences + 104}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 106, false, -1, 228, -1, 2400, -1, false, false, false, false, utf8proc_sequences + 109}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 111, false, -1, 229, -1, 3000, -1, false, false, false, false, utf8proc_sequences + 114}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 230, -1, 2640, -1, false, false, false, false, utf8proc_sequences + 116}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 118, false, -1, 231, -1, 8760, -1, false, false, false, false, utf8proc_sequences + 121}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 123, false, -1, 232, -1, -1, -1, false, false, false, false, utf8proc_sequences + 126}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 128, false, -1, 233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 131}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 133, false, -1, 234, -1, 11220, -1, false, false, false, false, utf8proc_sequences + 136}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 138, false, -1, 235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 141}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 143, false, -1, 236, -1, -1, -1, false, false, false, false, utf8proc_sequences + 146}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 148, false, -1, 237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 151}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 153, false, -1, 238, -1, -1, -1, false, false, false, false, utf8proc_sequences + 156}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 158, false, -1, 239, -1, 9240, -1, false, false, false, false, utf8proc_sequences + 161}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 240, -1, -1, -1, false, false, false, false, utf8proc_sequences + 163}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 165, false, -1, 241, -1, -1, -1, false, false, false, false, utf8proc_sequences + 168}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 170, false, -1, 242, -1, -1, -1, false, false, false, false, utf8proc_sequences + 173}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 175, false, -1, 243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 178}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 180, false, -1, 244, -1, 11460, -1, false, false, false, false, utf8proc_sequences + 183}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 185, false, -1, 245, -1, 3360, -1, false, false, false, false, utf8proc_sequences + 188}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 190, false, -1, 246, -1, 3240, -1, false, false, false, false, utf8proc_sequences + 193}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 248, -1, 3120, -1, false, false, false, false, utf8proc_sequences + 195}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 197, false, -1, 249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 200}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 202, false, -1, 250, -1, -1, -1, false, false, false, false, utf8proc_sequences + 205}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 207, false, -1, 251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 210}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 212, false, -1, 252, -1, 2280, -1, false, false, false, false, utf8proc_sequences + 215}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 217, false, -1, 253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 220}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 254, -1, -1, -1, false, false, false, false, utf8proc_sequences + 222}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 224}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 227, false, 192, -1, 192, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 230, false, 193, -1, 193, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 233, false, 194, -1, 194, 10920, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 236, false, 195, -1, 195, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 239, false, 196, -1, 196, 2460, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 242, false, 197, -1, 197, 3060, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 198, -1, 198, 2700, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 245, false, 199, -1, 199, 8820, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 248, false, 200, -1, 200, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 251, false, 201, -1, 201, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 254, false, 202, -1, 202, 11280, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 257, false, 203, -1, 203, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 260, false, 204, -1, 204, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 263, false, 205, -1, 205, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 266, false, 206, -1, 206, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 269, false, 207, -1, 207, 9300, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 208, -1, 208, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 272, false, 209, -1, 209, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 275, false, 210, -1, 210, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 278, false, 211, -1, 211, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 281, false, 212, -1, 212, 11520, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 284, false, 213, -1, 213, 3420, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 287, false, 214, -1, 214, 3300, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 216, -1, 216, 3180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 290, false, 217, -1, 217, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 293, false, 218, -1, 218, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 296, false, 219, -1, 219, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 299, false, 220, -1, 220, 2340, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 302, false, 221, -1, 221, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 222, -1, 222, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 305, false, 376, -1, 376, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 308, false, -1, 257, -1, -1, -1, false, false, false, false, utf8proc_sequences + 311}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 313, false, 256, -1, 256, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 316, false, -1, 259, -1, 11100, -1, false, false, false, false, utf8proc_sequences + 319}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 321, false, 258, -1, 258, 11160, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 324, false, -1, 261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 327}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 329, false, 260, -1, 260, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 332, false, -1, 263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 335}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 337, false, 262, -1, 262, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 340, false, -1, 265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 343}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 345, false, 264, -1, 264, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 348, false, -1, 267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 351}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 353, false, 266, -1, 266, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 356, false, -1, 269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 359}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 361, false, 268, -1, 268, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 364, false, -1, 271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 367}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 369, false, 270, -1, 270, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 372}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 272, -1, 272, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 374, false, -1, 275, -1, 8880, -1, false, false, false, false, utf8proc_sequences + 377}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 379, false, 274, -1, 274, 8940, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 382, false, -1, 277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 385}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 387, false, 276, -1, 276, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 390, false, -1, 279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 393}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 395, false, 278, -1, 278, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 398, false, -1, 281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 401}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 403, false, 280, -1, 280, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 406, false, -1, 283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 409}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 411, false, 282, -1, 282, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 414, false, -1, 285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 417}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 419, false, 284, -1, 284, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 422, false, -1, 287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 425}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 427, false, 286, -1, 286, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 430, false, -1, 289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 433}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 435, false, 288, -1, 288, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 438, false, -1, 291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 441}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 443, false, 290, -1, 290, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 446, false, -1, 293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 449}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 451, false, 292, -1, 292, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 454}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 294, -1, 294, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 456, false, -1, 297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 459}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 461, false, 296, -1, 296, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 464, false, -1, 299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 467}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 469, false, 298, -1, 298, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 472, false, -1, 301, -1, -1, -1, false, false, false, false, utf8proc_sequences + 475}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 477, false, 300, -1, 300, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 480, false, -1, 303, -1, -1, -1, false, false, false, false, utf8proc_sequences + 483}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 485, false, 302, -1, 302, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 488, false, -1, 105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 491}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 494, false, -1, 307, -1, -1, -1, false, false, false, false, utf8proc_sequences + 497}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 499, false, 306, -1, 306, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 502, false, -1, 309, -1, -1, -1, false, false, false, false, utf8proc_sequences + 505}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 507, false, 308, -1, 308, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 510, false, -1, 311, -1, -1, -1, false, false, false, false, utf8proc_sequences + 513}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 515, false, 310, -1, 310, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 518, false, -1, 314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 521}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 523, false, 313, -1, 313, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 526, false, -1, 316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 529}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 531, false, 315, -1, 315, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 534, false, -1, 318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 537}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 539, false, 317, -1, 317, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 542, false, -1, 320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 545}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 547, false, 319, -1, 319, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 550}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 321, -1, 321, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 552, false, -1, 324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 555}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 557, false, 323, -1, 323, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 560, false, -1, 326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 563}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 565, false, 325, -1, 325, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 568, false, -1, 328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 571}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 573, false, 327, -1, 327, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 576, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 576}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 579}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 330, -1, 330, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 581, false, -1, 333, -1, 9600, -1, false, false, false, false, utf8proc_sequences + 584}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 586, false, 332, -1, 332, 9660, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 589, false, -1, 335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 592}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 594, false, 334, -1, 334, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 597, false, -1, 337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 600}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 602, false, 336, -1, 336, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 605}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 338, -1, 338, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 607, false, -1, 341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 610}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 612, false, 340, -1, 340, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 615, false, -1, 343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 618}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 620, false, 342, -1, 342, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 623, false, -1, 345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 626}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 628, false, 344, -1, 344, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 631, false, -1, 347, -1, 9960, -1, false, false, false, false, utf8proc_sequences + 634}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 636, false, 346, -1, 346, 10020, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 639, false, -1, 349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 642}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 644, false, 348, -1, 348, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 647, false, -1, 351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 650}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 652, false, 350, -1, 350, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 655, false, -1, 353, -1, 10080, -1, false, false, false, false, utf8proc_sequences + 658}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 660, false, 352, -1, 352, 10140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 663, false, -1, 355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 666}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 668, false, 354, -1, 354, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 671, false, -1, 357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 674}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 676, false, 356, -1, 356, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 679}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 358, -1, 358, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 681, false, -1, 361, -1, 10320, -1, false, false, false, false, utf8proc_sequences + 684}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 686, false, 360, -1, 360, 10380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 689, false, -1, 363, -1, 10440, -1, false, false, false, false, utf8proc_sequences + 692}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 694, false, 362, -1, 362, 10500, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 697, false, -1, 365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 700}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 702, false, 364, -1, 364, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 705, false, -1, 367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 708}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 710, false, 366, -1, 366, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 713, false, -1, 369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 716}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 718, false, 368, -1, 368, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 721, false, -1, 371, -1, -1, -1, false, false, false, false, utf8proc_sequences + 724}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 726, false, 370, -1, 370, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 729, false, -1, 373, -1, -1, -1, false, false, false, false, utf8proc_sequences + 732}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 734, false, 372, -1, 372, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 737, false, -1, 375, -1, -1, -1, false, false, false, false, utf8proc_sequences + 740}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 742, false, 374, -1, 374, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 745, false, -1, 255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 748}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 750, false, -1, 378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 753}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 755, false, 377, -1, 377, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 758, false, -1, 380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 761}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 763, false, 379, -1, 379, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 766, false, -1, 382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 769}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 771, false, 381, -1, 381, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 36, false, 83, -1, 83, 10800, -1, false, false, false, false, utf8proc_sequences + 36}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 579, -1, 579, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 595, -1, -1, -1, false, false, false, false, utf8proc_sequences + 774}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 776}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 386, -1, 386, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 778}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 388, -1, 388, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 596, -1, -1, -1, false, false, false, false, utf8proc_sequences + 780}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 782}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 391, -1, 391, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 598, -1, -1, -1, false, false, false, false, utf8proc_sequences + 784}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 599, -1, -1, -1, false, false, false, false, utf8proc_sequences + 786}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 788}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 395, -1, 395, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 790}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 792}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 794}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 796}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 401, -1, 401, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 798}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 800}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 502, -1, 502, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 802}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 804}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 806}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 408, -1, 408, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 573, -1, 573, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 808}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 810}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 544, -1, 544, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 812}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 814, false, -1, 417, -1, 11700, -1, false, false, false, false, utf8proc_sequences + 817}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 819, false, 416, -1, 416, 11760, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 822}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 418, -1, 418, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 824}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 420, -1, 420, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 640, -1, -1, -1, false, false, false, false, utf8proc_sequences + 826}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 828}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 423, -1, 423, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 643, -1, -1, -1, false, false, false, false, utf8proc_sequences + 830}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 832}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 428, -1, 428, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 648, -1, -1, -1, false, false, false, false, utf8proc_sequences + 834}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 836, false, -1, 432, -1, 11820, -1, false, false, false, false, utf8proc_sequences + 839}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 841, false, 431, -1, 431, 11880, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 650, -1, -1, -1, false, false, false, false, utf8proc_sequences + 844}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 651, -1, -1, -1, false, false, false, false, utf8proc_sequences + 846}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 848}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 435, -1, 435, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 850}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 437, -1, 437, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 658, -1, 2880, -1, false, false, false, false, utf8proc_sequences + 852}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 854}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 440, -1, 440, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 856}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 444, -1, 444, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 503, -1, 503, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 858, false, -1, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 863, false, 452, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 866, false, 452, -1, 453, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 869, false, -1, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 874, false, 455, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 877, false, 455, -1, 456, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 880, false, -1, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 885, false, 458, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 888, false, 458, -1, 459, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 891, false, -1, 462, -1, -1, -1, false, false, false, false, utf8proc_sequences + 894}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 896, false, 461, -1, 461, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 899, false, -1, 464, -1, -1, -1, false, false, false, false, utf8proc_sequences + 902}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 904, false, 463, -1, 463, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 907, false, -1, 466, -1, -1, -1, false, false, false, false, utf8proc_sequences + 910}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 912, false, 465, -1, 465, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 915, false, -1, 468, -1, -1, -1, false, false, false, false, utf8proc_sequences + 918}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 920, false, 467, -1, 467, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 923, false, -1, 470, -1, -1, -1, false, false, false, false, utf8proc_sequences + 926}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 928, false, 469, -1, 469, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 931, false, -1, 472, -1, -1, -1, false, false, false, false, utf8proc_sequences + 934}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 936, false, 471, -1, 471, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 939, false, -1, 474, -1, -1, -1, false, false, false, false, utf8proc_sequences + 942}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 944, false, 473, -1, 473, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 947, false, -1, 476, -1, -1, -1, false, false, false, false, utf8proc_sequences + 950}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 952, false, 475, -1, 475, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 398, -1, 398, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 955, false, -1, 479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 958}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 960, false, 478, -1, 478, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 963, false, -1, 481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 966}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 968, false, 480, -1, 480, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 971, false, -1, 483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 974}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 976, false, 482, -1, 482, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 979}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 484, -1, 484, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 981, false, -1, 487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 984}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 986, false, 486, -1, 486, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 989, false, -1, 489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 992}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 994, false, 488, -1, 488, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 997, false, -1, 491, -1, 2760, -1, false, false, false, false, utf8proc_sequences + 1000}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1002, false, 490, -1, 490, 2820, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1005, false, -1, 493, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1008}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1010, false, 492, -1, 492, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1013, false, -1, 495, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1016}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1018, false, 494, -1, 494, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1021, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1021}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1024, false, -1, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1029, false, 497, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1032, false, 497, -1, 498, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1035, false, -1, 501, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1038}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1040, false, 500, -1, 500, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1043}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1045}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1047, false, -1, 505, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1050}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1052, false, 504, -1, 504, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1055, false, -1, 507, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1058}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1060, false, 506, -1, 506, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1063, false, -1, 509, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1066}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1068, false, 508, -1, 508, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1071, false, -1, 511, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1074}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1076, false, 510, -1, 510, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1079, false, -1, 513, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1082}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1084, false, 512, -1, 512, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1087, false, -1, 515, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1090}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1092, false, 514, -1, 514, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1095, false, -1, 517, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1098}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1100, false, 516, -1, 516, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1103, false, -1, 519, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1106}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1108, false, 518, -1, 518, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1111, false, -1, 521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1114}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1116, false, 520, -1, 520, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1119, false, -1, 523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1122}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1124, false, 522, -1, 522, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1127, false, -1, 525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1130}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1132, false, 524, -1, 524, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1135, false, -1, 527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1138}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1140, false, 526, -1, 526, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1143, false, -1, 529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1146}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1148, false, 528, -1, 528, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1151, false, -1, 531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1154}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1156, false, 530, -1, 530, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1159, false, -1, 533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1162}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1164, false, 532, -1, 532, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1167, false, -1, 535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1170}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1172, false, 534, -1, 534, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1175, false, -1, 537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1178}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1180, false, 536, -1, 536, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1183, false, -1, 539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1186}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1188, false, 538, -1, 538, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1191}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 540, -1, 540, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1193, false, -1, 543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1196}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1198, false, 542, -1, 542, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1201}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1203}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 546, -1, 546, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1205}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 548, -1, 548, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1207, false, -1, 551, -1, 2520, -1, false, false, false, false, utf8proc_sequences + 1210}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1212, false, 550, -1, 550, 2580, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1215, false, -1, 553, -1, 9000, -1, false, false, false, false, utf8proc_sequences + 1218}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1220, false, 552, -1, 552, 9060, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1223, false, -1, 555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1226}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1228, false, 554, -1, 554, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1231, false, -1, 557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1234}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1236, false, 556, -1, 556, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1239, false, -1, 559, -1, 3480, -1, false, false, false, false, utf8proc_sequences + 1242}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1244, false, 558, -1, 558, 3540, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1247, false, -1, 561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1250}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1252, false, 560, -1, 560, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1255, false, -1, 563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1258}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1260, false, 562, -1, 562, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1263}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1265}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 571, -1, 571, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1267}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1269}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 578, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1271}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 577, -1, 577, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1273}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 649, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1275}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 652, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1277}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 583, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1279}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 582, -1, 582, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 585, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1281}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 584, -1, 584, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 587, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1283}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 586, -1, 586, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 589, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1285}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 588, -1, 588, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 591, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1287}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 590, -1, 590, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 385, -1, 385, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 390, -1, 390, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 393, -1, 393, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 394, -1, 394, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 399, -1, 399, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 400, -1, 400, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 403, -1, 403, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 404, -1, 404, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 407, -1, 407, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 406, -1, 406, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11362, -1, 11362, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 412, -1, 412, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 413, -1, 413, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 415, -1, 415, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11364, -1, 11364, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 422, -1, 422, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 425, -1, 425, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 430, -1, 430, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 580, -1, 580, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 433, -1, 433, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 434, -1, 434, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 581, -1, 581, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 439, -1, 439, 2940, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 0, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 2, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 3, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 7, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 8, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 10, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 4, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 46, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 5, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 12, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 11, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 14, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 15, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 47, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 48, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 13, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 40, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 45, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 39, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 16, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 6, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 9, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 42, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 44, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 43, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 41, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 51, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1317, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1319, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 49, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1321, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1323, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 240, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, 921, -1, 921, -1, 50, false, false, false, true, utf8proc_sequences + 1326}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 233, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1021, -1, 1021, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1022, -1, 1022, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1023, -1, 1023, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1338, false, -1, 940, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1341}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1345, false, -1, 941, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1348}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1350, false, -1, 942, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1353}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1355, false, -1, 943, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1358}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1360, false, -1, 972, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1363}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1365, false, -1, 973, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1368}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1370, false, -1, 974, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1373}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1375, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 945, -1, 3660, -1, false, false, false, false, utf8proc_sequences + 1382}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 946, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1384}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 947, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1386}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 948, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1388}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 949, -1, 3720, -1, false, false, false, false, utf8proc_sequences + 1390}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 950, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1392}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 951, -1, 3780, -1, false, false, false, false, utf8proc_sequences + 1394}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 953, -1, 3840, -1, false, false, false, false, utf8proc_sequences + 1326}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1398}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1400}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 67}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1402}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 958, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1404}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 959, -1, 3900, -1, false, false, false, false, utf8proc_sequences + 1406}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 960, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1408}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 961, -1, 16260, -1, false, false, false, false, utf8proc_sequences + 1410}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 963, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1412}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 964, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1414}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 965, -1, 3960, -1, false, false, false, false, utf8proc_sequences + 1416}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 966, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1418}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 967, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1420}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 968, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1422}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 969, -1, 4020, -1, false, false, false, false, utf8proc_sequences + 1424}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1426, false, -1, 970, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1429}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1431, false, -1, 971, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1434}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1436, false, 902, -1, 902, 15780, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1439, false, 904, -1, 904, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1442, false, 905, -1, 905, 15960, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1445, false, 906, -1, 906, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1448, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 913, -1, 913, 4140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 914, -1, 914, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 915, -1, 915, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 916, -1, 916, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 917, -1, 917, 4200, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 918, -1, 918, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 919, -1, 919, 4260, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 920, -1, 920, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 921, -1, 921, 4320, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 922, -1, 922, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 923, -1, 923, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 924, -1, 924, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 925, -1, 925, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 926, -1, 926, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 927, -1, 927, 4500, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 928, -1, 928, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 929, -1, 929, 16200, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, utf8proc_sequences + 1412}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 932, -1, 932, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 933, -1, 933, 4440, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 934, -1, 934, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 935, -1, 935, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 936, -1, 936, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 937, -1, 937, 4560, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1455, false, 938, -1, 938, 4080, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1458, false, 939, -1, 939, 4380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1461, false, 908, -1, 908, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1464, false, 910, -1, 910, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1467, false, 911, -1, 911, 16380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1384, false, 914, -1, 914, -1, -1, false, false, false, false, utf8proc_sequences + 1384}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1396, false, 920, -1, 920, -1, -1, false, false, false, false, utf8proc_sequences + 1396}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1470, false, -1, -1, -1, 4620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1418, false, 934, -1, 934, -1, -1, false, false, false, false, utf8proc_sequences + 1418}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1408, false, 928, -1, 928, -1, -1, false, false, false, false, utf8proc_sequences + 1408}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 985, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1478}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 984, -1, 984, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1480}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 986, -1, 986, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1482}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 988, -1, 988, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1484}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 990, -1, 990, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 993, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1486}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 992, -1, 992, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 995, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1488}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 994, -1, 994, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 997, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1490}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 996, -1, 996, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 999, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1492}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 998, -1, 998, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1001, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1494}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1000, -1, 1000, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1496}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1002, -1, 1002, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1498}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1004, -1, 1004, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1007, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1500}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1006, -1, 1006, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1398, false, 922, -1, 922, -1, -1, false, false, false, false, utf8proc_sequences + 1398}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1410, false, 929, -1, 929, -1, -1, false, false, false, false, utf8proc_sequences + 1410}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1502, false, 1017, -1, 1017, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1504, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1390, false, 917, -1, 917, -1, -1, false, false, false, false, utf8proc_sequences + 1390}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1016, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1506}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1015, -1, 1015, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1508, false, -1, 1010, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1510}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1512}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1018, -1, 1018, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1514}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 892, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1516}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1518}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1520, false, -1, 1104, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1523}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1525, false, -1, 1105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1528}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1106, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1530}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1532, false, -1, 1107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1535}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1108, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1537}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1109, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1539}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1110, -1, 4800, -1, false, false, false, false, utf8proc_sequences + 1541}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1543, false, -1, 1111, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1546}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1548}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1550}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1114, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1552}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1554}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1556, false, -1, 1116, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1559}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1561, false, -1, 1117, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1564}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1566, false, -1, 1118, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1569}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1119, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1571}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1072, -1, 5640, -1, false, false, false, false, utf8proc_sequences + 1573}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1073, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1575}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1074, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1577}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1075, -1, 4740, -1, false, false, false, false, utf8proc_sequences + 1579}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1076, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1581}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1077, -1, 4680, -1, false, false, false, false, utf8proc_sequences + 1583}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1078, -1, 5520, -1, false, false, false, false, utf8proc_sequences + 1585}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1079, -1, 5880, -1, false, false, false, false, utf8proc_sequences + 1587}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1080, -1, 4920, -1, false, false, false, false, utf8proc_sequences + 1589}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1591, false, -1, 1081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1594}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1082, -1, 4860, -1, false, false, false, false, utf8proc_sequences + 1596}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1598}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1600}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1602}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1086, -1, 6000, -1, false, false, false, false, utf8proc_sequences + 1604}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1606}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1088, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1608}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1089, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1610}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1090, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1612}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1091, -1, 4980, -1, false, false, false, false, utf8proc_sequences + 1614}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1092, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1616}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1093, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1618}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1094, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1620}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1095, -1, 6360, -1, false, false, false, false, utf8proc_sequences + 1622}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1624}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1626}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1628}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1099, -1, 6480, -1, false, false, false, false, utf8proc_sequences + 1630}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1632}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1101, -1, 6240, -1, false, false, false, false, utf8proc_sequences + 1634}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1636}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1638}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1040, -1, 1040, 5700, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1041, -1, 1041, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1042, -1, 1042, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1043, -1, 1043, 5160, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1044, -1, 1044, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1045, -1, 1045, 5100, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1046, -1, 1046, 5580, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1047, -1, 1047, 5940, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1048, -1, 1048, 5040, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1640, false, 1049, -1, 1049, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1050, -1, 1050, 5280, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1051, -1, 1051, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1052, -1, 1052, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1053, -1, 1053, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1054, -1, 1054, 6060, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1055, -1, 1055, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1056, -1, 1056, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1057, -1, 1057, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1058, -1, 1058, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1059, -1, 1059, 5340, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1060, -1, 1060, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1061, -1, 1061, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1062, -1, 1062, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1063, -1, 1063, 6420, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1064, -1, 1064, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1065, -1, 1065, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1066, -1, 1066, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1067, -1, 1067, 6540, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1068, -1, 1068, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1069, -1, 1069, 6300, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1070, -1, 1070, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1071, -1, 1071, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1643, false, 1024, -1, 1024, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1646, false, 1025, -1, 1025, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1026, -1, 1026, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1649, false, 1027, -1, 1027, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1028, -1, 1028, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1029, -1, 1029, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1030, -1, 1030, 5220, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1652, false, 1031, -1, 1031, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1032, -1, 1032, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1033, -1, 1033, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1034, -1, 1034, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1035, -1, 1035, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1655, false, 1036, -1, 1036, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1658, false, 1037, -1, 1037, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1661, false, 1038, -1, 1038, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1039, -1, 1039, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1121, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1664}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1120, -1, 1120, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1123, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1666}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1122, -1, 1122, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1125, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1668}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1124, -1, 1124, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1127, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1670}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1126, -1, 1126, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1129, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1672}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1128, -1, 1128, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1674}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1130, -1, 1130, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1133, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1676}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1132, -1, 1132, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1135, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1678}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1134, -1, 1134, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1137, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1680}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1136, -1, 1136, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1139, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1682}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1138, -1, 1138, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1141, -1, 5400, -1, false, false, false, false, utf8proc_sequences + 1684}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1140, -1, 1140, 5460, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1686, false, -1, 1143, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1689}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1691, false, 1142, -1, 1142, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1694}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1144, -1, 1144, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1147, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1696}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1146, -1, 1146, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1149, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1698}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1148, -1, 1148, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1151, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1700}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1150, -1, 1150, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1153, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1702}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1152, -1, 1152, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ME, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1163, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1704}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1162, -1, 1162, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1706}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1164, -1, 1164, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1167, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1708}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1166, -1, 1166, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1169, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1710}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1168, -1, 1168, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1171, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1712}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1170, -1, 1170, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1173, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1714}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1172, -1, 1172, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1175, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1716}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1174, -1, 1174, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1177, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1718}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1176, -1, 1176, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1720}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1178, -1, 1178, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1181, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1722}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1180, -1, 1180, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1183, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1724}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1182, -1, 1182, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1185, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1726}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1184, -1, 1184, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1187, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1728}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1186, -1, 1186, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1189, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1730}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1188, -1, 1188, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1191, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1732}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1190, -1, 1190, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1193, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1734}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1192, -1, 1192, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1195, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1736}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1194, -1, 1194, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1197, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1738}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1196, -1, 1196, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1199, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1740}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1198, -1, 1198, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1201, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1742}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1200, -1, 1200, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1203, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1744}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1202, -1, 1202, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1205, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1746}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1204, -1, 1204, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1207, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1748}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1206, -1, 1206, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1209, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1750}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1208, -1, 1208, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1211, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1752}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1210, -1, 1210, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1213, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1754}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1212, -1, 1212, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1215, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1756}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1214, -1, 1214, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1231, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1758}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1760, false, -1, 1218, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1763}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1765, false, 1217, -1, 1217, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1220, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1768}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1219, -1, 1219, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1222, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1770}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1221, -1, 1221, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1772}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1223, -1, 1223, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1226, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1774}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1225, -1, 1225, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1228, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1776}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1227, -1, 1227, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1230, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1778}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1229, -1, 1229, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1216, -1, 1216, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1780, false, -1, 1233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1783}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1785, false, 1232, -1, 1232, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1788, false, -1, 1235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1791}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1793, false, 1234, -1, 1234, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1796}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1236, -1, 1236, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1798, false, -1, 1239, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1801}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1803, false, 1238, -1, 1238, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1241, -1, 5760, -1, false, false, false, false, utf8proc_sequences + 1806}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1240, -1, 1240, 5820, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1808, false, -1, 1243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1811}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1813, false, 1242, -1, 1242, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1816, false, -1, 1245, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1819}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1821, false, 1244, -1, 1244, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1824, false, -1, 1247, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1827}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1829, false, 1246, -1, 1246, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1832}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1248, -1, 1248, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1834, false, -1, 1251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1837}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1839, false, 1250, -1, 1250, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1842, false, -1, 1253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1845}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1847, false, 1252, -1, 1252, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1850, false, -1, 1255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1853}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1855, false, 1254, -1, 1254, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1257, -1, 6120, -1, false, false, false, false, utf8proc_sequences + 1858}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1256, -1, 1256, 6180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1860, false, -1, 1259, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1863}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1865, false, 1258, -1, 1258, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1868, false, -1, 1261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1871}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1873, false, 1260, -1, 1260, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1876, false, -1, 1263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1879}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1881, false, 1262, -1, 1262, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1884, false, -1, 1265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1887}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1889, false, 1264, -1, 1264, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1892, false, -1, 1267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1895}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1897, false, 1266, -1, 1266, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1900, false, -1, 1269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1903}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1905, false, 1268, -1, 1268, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1908}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1270, -1, 1270, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1910, false, -1, 1273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1913}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1915, false, 1272, -1, 1272, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1275, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1918}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1274, -1, 1274, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1920}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1276, -1, 1276, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1922}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1278, -1, 1278, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1924}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1280, -1, 1280, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1926}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1282, -1, 1282, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1928}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1284, -1, 1284, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1930}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1286, -1, 1286, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1932}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1288, -1, 1288, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1934}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1290, -1, 1290, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1936}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1292, -1, 1292, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1938}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1294, -1, 1294, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1940}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1296, -1, 1296, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1942}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1298, -1, 1298, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1377, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1944}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1946}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1379, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1948}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1950}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1381, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1952}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1954}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1383, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1956}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1958}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1385, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1960}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1386, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1962}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1964}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1388, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1966}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1968}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1390, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1970}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1391, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1972}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1974}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1976}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1394, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1978}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1980}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1982}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1984}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1398, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1986}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1988}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1400, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1990}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1992}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1994}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1996}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1404, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1998}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2000}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1406, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2002}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2004}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1408, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2006}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2008}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2010}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2012}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1412, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2014}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2016}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2018}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1329, -1, 1329, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1330, -1, 1330, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1331, -1, 1331, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1332, -1, 1332, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1333, -1, 1333, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1334, -1, 1334, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1335, -1, 1335, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1336, -1, 1336, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1337, -1, 1337, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1338, -1, 1338, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1339, -1, 1339, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1340, -1, 1340, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1341, -1, 1341, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1342, -1, 1342, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1343, -1, 1343, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1344, -1, 1344, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1345, -1, 1345, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1346, -1, 1346, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1347, -1, 1347, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1348, -1, 1348, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1349, -1, 1349, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1350, -1, 1350, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1351, -1, 1351, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1352, -1, 1352, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1353, -1, 1353, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1354, -1, 1354, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1355, -1, 1355, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1356, -1, 1356, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1357, -1, 1357, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1358, -1, 1358, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1359, -1, 1359, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1360, -1, 1360, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1361, -1, 1361, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1362, -1, 1362, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1363, -1, 1363, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1364, -1, 1364, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1365, -1, 1365, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1366, -1, 1366, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2020, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2020}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 222, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 228, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 10, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 11, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 12, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 13, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 14, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 15, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 16, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 17, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 18, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 19, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 20, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 21, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 22, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 23, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 24, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 25, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6600, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6660, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6720, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 27, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 28, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 29, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 30, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 31, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 32, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 33, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 34, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 17, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 18, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 19, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 35, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6840, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6780, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 36, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 6960, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7020, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7080, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 20, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2068, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2071, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2074, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2077, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2080, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2083, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2086, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2089, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 21, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 22, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2098, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2101, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2104, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2107, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2110, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2113, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2116, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2119, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2122, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 24, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7200, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 23, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 25, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2134, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2137, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7260, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 27, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7320, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 26, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 7440, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2152, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 84, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 91, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 28, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7500, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 31, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7560, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2164, false, -1, -1, -1, 7620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 29, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 30, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 32, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7680, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7740, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 33, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 34, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 35, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7800, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2182, false, -1, -1, -1, 7860, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 36, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 103, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 107, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 118, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 122, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 2203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2205, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2208, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2211, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2214, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2217, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2220, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 129, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 130, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2223, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 132, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2226, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2229, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2232, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2235, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2238, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2241, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2244, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2247, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2250, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2253, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2256, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2259, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7920, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 37, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11520, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2265}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2267}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11522, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2269}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2271}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11524, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2273}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2275}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2277}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2279}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11528, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2281}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2283}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11530, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2285}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2287}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11532, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2289}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2291}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11534, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2293}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2295}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11536, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2297}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2299}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11538, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2301}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2303}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11540, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2305}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2307}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11542, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2309}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2311}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11544, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2313}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11545, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2315}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11546, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2317}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2319}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11548, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2321}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2323}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11550, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2325}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11551, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2327}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11552, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2329}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11553, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2331}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11554, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2333}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2335}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11556, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2337}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2339}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7980, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8040, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8100, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8160, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8220, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8280, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 38, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8340, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8400, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8460, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8520, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8580, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11363, -1, 11363, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2476, false, -1, 7681, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2479}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2481, false, 7680, -1, 7680, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2484, false, -1, 7683, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2487}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2489, false, 7682, -1, 7682, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2492, false, -1, 7685, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2495}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2497, false, 7684, -1, 7684, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2500, false, -1, 7687, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2503}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2505, false, 7686, -1, 7686, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2508, false, -1, 7689, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2511}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2513, false, 7688, -1, 7688, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2516, false, -1, 7691, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2519}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2521, false, 7690, -1, 7690, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2524, false, -1, 7693, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2527}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2529, false, 7692, -1, 7692, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2532, false, -1, 7695, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2535}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2537, false, 7694, -1, 7694, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2540, false, -1, 7697, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2543}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2545, false, 7696, -1, 7696, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2548, false, -1, 7699, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2551}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2553, false, 7698, -1, 7698, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2556, false, -1, 7701, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2559}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2561, false, 7700, -1, 7700, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2564, false, -1, 7703, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2567}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2569, false, 7702, -1, 7702, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2572, false, -1, 7705, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2575}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2577, false, 7704, -1, 7704, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2580, false, -1, 7707, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2583}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2585, false, 7706, -1, 7706, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2588, false, -1, 7709, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2591}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2593, false, 7708, -1, 7708, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2596, false, -1, 7711, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2599}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2601, false, 7710, -1, 7710, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2604, false, -1, 7713, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2607}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2609, false, 7712, -1, 7712, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2612, false, -1, 7715, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2615}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2617, false, 7714, -1, 7714, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2620, false, -1, 7717, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2623}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2625, false, 7716, -1, 7716, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2628, false, -1, 7719, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2631}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2633, false, 7718, -1, 7718, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2636, false, -1, 7721, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2639}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2641, false, 7720, -1, 7720, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2644, false, -1, 7723, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2647}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2649, false, 7722, -1, 7722, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2652, false, -1, 7725, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2655}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2657, false, 7724, -1, 7724, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2660, false, -1, 7727, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2663}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2665, false, 7726, -1, 7726, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2668, false, -1, 7729, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2671}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2673, false, 7728, -1, 7728, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2676, false, -1, 7731, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2679}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2681, false, 7730, -1, 7730, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2684, false, -1, 7733, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2687}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2689, false, 7732, -1, 7732, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2692, false, -1, 7735, -1, 9360, -1, false, false, false, false, utf8proc_sequences + 2695}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2697, false, 7734, -1, 7734, 9420, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2700, false, -1, 7737, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2703}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2705, false, 7736, -1, 7736, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2708, false, -1, 7739, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2711}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2713, false, 7738, -1, 7738, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2716, false, -1, 7741, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2719}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2721, false, 7740, -1, 7740, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2724, false, -1, 7743, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2727}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2729, false, 7742, -1, 7742, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2732, false, -1, 7745, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2735}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2737, false, 7744, -1, 7744, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2740, false, -1, 7747, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2743}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2745, false, 7746, -1, 7746, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2748, false, -1, 7749, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2751}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2753, false, 7748, -1, 7748, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2756, false, -1, 7751, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2759}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2761, false, 7750, -1, 7750, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2764, false, -1, 7753, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2767}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2769, false, 7752, -1, 7752, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2772, false, -1, 7755, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2775}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2777, false, 7754, -1, 7754, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2780, false, -1, 7757, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2783}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2785, false, 7756, -1, 7756, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2788, false, -1, 7759, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2791}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2793, false, 7758, -1, 7758, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2796, false, -1, 7761, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2799}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2801, false, 7760, -1, 7760, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2804, false, -1, 7763, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2807}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2809, false, 7762, -1, 7762, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2812, false, -1, 7765, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2815}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2817, false, 7764, -1, 7764, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2820, false, -1, 7767, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2823}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2825, false, 7766, -1, 7766, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2828, false, -1, 7769, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2831}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2833, false, 7768, -1, 7768, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2836, false, -1, 7771, -1, 9840, -1, false, false, false, false, utf8proc_sequences + 2839}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2841, false, 7770, -1, 7770, 9900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2844, false, -1, 7773, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2847}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2849, false, 7772, -1, 7772, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2852, false, -1, 7775, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2855}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2857, false, 7774, -1, 7774, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2860, false, -1, 7777, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2863}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2865, false, 7776, -1, 7776, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2868, false, -1, 7779, -1, 10200, -1, false, false, false, false, utf8proc_sequences + 2871}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2873, false, 7778, -1, 7778, 10260, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2876, false, -1, 7781, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2879}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2881, false, 7780, -1, 7780, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2884, false, -1, 7783, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2887}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2889, false, 7782, -1, 7782, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2892, false, -1, 7785, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2895}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2897, false, 7784, -1, 7784, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2900, false, -1, 7787, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2903}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2905, false, 7786, -1, 7786, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2908, false, -1, 7789, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2911}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2913, false, 7788, -1, 7788, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2916, false, -1, 7791, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2919}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2921, false, 7790, -1, 7790, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2924, false, -1, 7793, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2927}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2929, false, 7792, -1, 7792, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2932, false, -1, 7795, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2935}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2937, false, 7794, -1, 7794, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2940, false, -1, 7797, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2943}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2945, false, 7796, -1, 7796, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2948, false, -1, 7799, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2951}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2953, false, 7798, -1, 7798, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2956, false, -1, 7801, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2959}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2961, false, 7800, -1, 7800, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2964, false, -1, 7803, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2967}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2969, false, 7802, -1, 7802, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2972, false, -1, 7805, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2975}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2977, false, 7804, -1, 7804, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2980, false, -1, 7807, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2983}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2985, false, 7806, -1, 7806, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2988, false, -1, 7809, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2991}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2993, false, 7808, -1, 7808, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2996, false, -1, 7811, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2999}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3001, false, 7810, -1, 7810, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3004, false, -1, 7813, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3007}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3009, false, 7812, -1, 7812, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3012, false, -1, 7815, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3015}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3017, false, 7814, -1, 7814, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3020, false, -1, 7817, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3023}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3025, false, 7816, -1, 7816, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3028, false, -1, 7819, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3031}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3033, false, 7818, -1, 7818, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3036, false, -1, 7821, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3039}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3041, false, 7820, -1, 7820, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3044, false, -1, 7823, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3047}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3049, false, 7822, -1, 7822, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3052, false, -1, 7825, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3055}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3057, false, 7824, -1, 7824, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3060, false, -1, 7827, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3063}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3065, false, 7826, -1, 7826, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3068, false, -1, 7829, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3071}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3073, false, 7828, -1, 7828, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3076, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3076}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3079, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3079}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3082, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3082}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3085, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3085}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 3088, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3088}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3091, false, 7776, -1, 7776, -1, -1, false, false, false, false, utf8proc_sequences + 2863}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3094, false, -1, 7841, -1, 10980, -1, false, false, false, false, utf8proc_sequences + 3097}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3099, false, 7840, -1, 7840, 11040, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3102, false, -1, 7843, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3105}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3107, false, 7842, -1, 7842, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3110, false, -1, 7845, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3113}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3115, false, 7844, -1, 7844, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3118, false, -1, 7847, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3121}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3123, false, 7846, -1, 7846, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3126, false, -1, 7849, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3129}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3131, false, 7848, -1, 7848, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3134, false, -1, 7851, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3137}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3139, false, 7850, -1, 7850, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3142, false, -1, 7853, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3145}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3147, false, 7852, -1, 7852, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3150, false, -1, 7855, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3153}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3155, false, 7854, -1, 7854, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3158, false, -1, 7857, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3161}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3163, false, 7856, -1, 7856, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3166, false, -1, 7859, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3169}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3171, false, 7858, -1, 7858, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3174, false, -1, 7861, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3177}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3179, false, 7860, -1, 7860, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3182, false, -1, 7863, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3185}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3187, false, 7862, -1, 7862, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3190, false, -1, 7865, -1, 11340, -1, false, false, false, false, utf8proc_sequences + 3193}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3195, false, 7864, -1, 7864, 11400, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3198, false, -1, 7867, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3201}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3203, false, 7866, -1, 7866, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3206, false, -1, 7869, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3209}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3211, false, 7868, -1, 7868, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3214, false, -1, 7871, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3217}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3219, false, 7870, -1, 7870, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3222, false, -1, 7873, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3225}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3227, false, 7872, -1, 7872, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3230, false, -1, 7875, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3233}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3235, false, 7874, -1, 7874, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3238, false, -1, 7877, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3241}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3243, false, 7876, -1, 7876, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3246, false, -1, 7879, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3249}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3251, false, 7878, -1, 7878, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3254, false, -1, 7881, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3257}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3259, false, 7880, -1, 7880, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3262, false, -1, 7883, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3265}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3267, false, 7882, -1, 7882, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3270, false, -1, 7885, -1, 11580, -1, false, false, false, false, utf8proc_sequences + 3273}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3275, false, 7884, -1, 7884, 11640, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3278, false, -1, 7887, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3281}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3283, false, 7886, -1, 7886, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3286, false, -1, 7889, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3289}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3291, false, 7888, -1, 7888, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3294, false, -1, 7891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3297}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3299, false, 7890, -1, 7890, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3302, false, -1, 7893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3305}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3307, false, 7892, -1, 7892, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3310, false, -1, 7895, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3313}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3315, false, 7894, -1, 7894, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3318, false, -1, 7897, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3321}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3323, false, 7896, -1, 7896, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3326, false, -1, 7899, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3329}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3331, false, 7898, -1, 7898, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3334, false, -1, 7901, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3337}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3339, false, 7900, -1, 7900, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3342, false, -1, 7903, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3345}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3347, false, 7902, -1, 7902, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3350, false, -1, 7905, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3353}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3355, false, 7904, -1, 7904, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3358, false, -1, 7907, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3361}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3363, false, 7906, -1, 7906, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3366, false, -1, 7909, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3369}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3371, false, 7908, -1, 7908, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3374, false, -1, 7911, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3377}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3379, false, 7910, -1, 7910, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3382, false, -1, 7913, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3385}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3387, false, 7912, -1, 7912, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3390, false, -1, 7915, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3393}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3395, false, 7914, -1, 7914, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3398, false, -1, 7917, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3401}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3403, false, 7916, -1, 7916, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3406, false, -1, 7919, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3409}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3411, false, 7918, -1, 7918, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3414, false, -1, 7921, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3417}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3419, false, 7920, -1, 7920, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3422, false, -1, 7923, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3425}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3427, false, 7922, -1, 7922, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3430, false, -1, 7925, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3433}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3435, false, 7924, -1, 7924, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3438, false, -1, 7927, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3441}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3443, false, 7926, -1, 7926, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3446, false, -1, 7929, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3449}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3451, false, 7928, -1, 7928, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3454, false, 7944, -1, 7944, 11940, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3457, false, 7945, -1, 7945, 12000, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3460, false, 7946, -1, 7946, 13560, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3463, false, 7947, -1, 7947, 13620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3466, false, 7948, -1, 7948, 13680, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3469, false, 7949, -1, 7949, 13740, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3472, false, 7950, -1, 7950, 13800, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3475, false, 7951, -1, 7951, 13860, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3478, false, -1, 7936, -1, 12060, -1, false, false, false, false, utf8proc_sequences + 3481}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3483, false, -1, 7937, -1, 12120, -1, false, false, false, false, utf8proc_sequences + 3486}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3488, false, -1, 7938, -1, 13920, -1, false, false, false, false, utf8proc_sequences + 3491}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3493, false, -1, 7939, -1, 13980, -1, false, false, false, false, utf8proc_sequences + 3496}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3498, false, -1, 7940, -1, 14040, -1, false, false, false, false, utf8proc_sequences + 3501}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3503, false, -1, 7941, -1, 14100, -1, false, false, false, false, utf8proc_sequences + 3506}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3508, false, -1, 7942, -1, 14160, -1, false, false, false, false, utf8proc_sequences + 3511}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3513, false, -1, 7943, -1, 14220, -1, false, false, false, false, utf8proc_sequences + 3516}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3518, false, 7960, -1, 7960, 12180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3521, false, 7961, -1, 7961, 12240, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3524, false, 7962, -1, 7962, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3527, false, 7963, -1, 7963, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3530, false, 7964, -1, 7964, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3533, false, 7965, -1, 7965, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3536, false, -1, 7952, -1, 12300, -1, false, false, false, false, utf8proc_sequences + 3539}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3541, false, -1, 7953, -1, 12360, -1, false, false, false, false, utf8proc_sequences + 3544}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3546, false, -1, 7954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3549}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3551, false, -1, 7955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3554}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3556, false, -1, 7956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3559}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3561, false, -1, 7957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3564}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3566, false, 7976, -1, 7976, 12420, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3569, false, 7977, -1, 7977, 12480, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3572, false, 7978, -1, 7978, 14280, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3575, false, 7979, -1, 7979, 14340, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3578, false, 7980, -1, 7980, 14400, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3581, false, 7981, -1, 7981, 14460, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3584, false, 7982, -1, 7982, 14520, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3587, false, 7983, -1, 7983, 14580, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3590, false, -1, 7968, -1, 12540, -1, false, false, false, false, utf8proc_sequences + 3593}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3595, false, -1, 7969, -1, 12600, -1, false, false, false, false, utf8proc_sequences + 3598}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3600, false, -1, 7970, -1, 14640, -1, false, false, false, false, utf8proc_sequences + 3603}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3605, false, -1, 7971, -1, 14700, -1, false, false, false, false, utf8proc_sequences + 3608}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3610, false, -1, 7972, -1, 14760, -1, false, false, false, false, utf8proc_sequences + 3613}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3615, false, -1, 7973, -1, 14820, -1, false, false, false, false, utf8proc_sequences + 3618}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3620, false, -1, 7974, -1, 14880, -1, false, false, false, false, utf8proc_sequences + 3623}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3625, false, -1, 7975, -1, 14940, -1, false, false, false, false, utf8proc_sequences + 3628}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3630, false, 7992, -1, 7992, 12660, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3633, false, 7993, -1, 7993, 12720, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3636, false, 7994, -1, 7994, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3639, false, 7995, -1, 7995, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3642, false, 7996, -1, 7996, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3645, false, 7997, -1, 7997, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3648, false, 7998, -1, 7998, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3651, false, 7999, -1, 7999, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3654, false, -1, 7984, -1, 12780, -1, false, false, false, false, utf8proc_sequences + 3657}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3659, false, -1, 7985, -1, 12840, -1, false, false, false, false, utf8proc_sequences + 3662}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3664, false, -1, 7986, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3667}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3669, false, -1, 7987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3672}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3674, false, -1, 7988, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3677}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3679, false, -1, 7989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3682}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3684, false, -1, 7990, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3687}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3689, false, -1, 7991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3692}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3694, false, 8008, -1, 8008, 12900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3697, false, 8009, -1, 8009, 12960, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3700, false, 8010, -1, 8010, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3703, false, 8011, -1, 8011, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3706, false, 8012, -1, 8012, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3709, false, 8013, -1, 8013, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3712, false, -1, 8000, -1, 13020, -1, false, false, false, false, utf8proc_sequences + 3715}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3717, false, -1, 8001, -1, 13080, -1, false, false, false, false, utf8proc_sequences + 3720}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3722, false, -1, 8002, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3725}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3727, false, -1, 8003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3730}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3732, false, -1, 8004, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3735}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3737, false, -1, 8005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3740}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3742, false, -1, -1, -1, 13140, -1, false, false, false, false, utf8proc_sequences + 3742}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3745, false, 8025, -1, 8025, 13200, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3751}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3755, false, 8027, -1, 8027, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3761}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3765, false, 8029, -1, 8029, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3771}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3775, false, 8031, -1, 8031, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3778, false, -1, 8017, -1, 13260, -1, false, false, false, false, utf8proc_sequences + 3781}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3783, false, -1, 8019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3786}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3788, false, -1, 8021, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3791}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3793, false, -1, 8023, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3796}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3798, false, 8040, -1, 8040, 13320, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3801, false, 8041, -1, 8041, 13380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3804, false, 8042, -1, 8042, 15000, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3807, false, 8043, -1, 8043, 15060, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3810, false, 8044, -1, 8044, 15120, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3813, false, 8045, -1, 8045, 15180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3816, false, 8046, -1, 8046, 15240, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3819, false, 8047, -1, 8047, 15300, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3822, false, -1, 8032, -1, 13440, -1, false, false, false, false, utf8proc_sequences + 3825}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3827, false, -1, 8033, -1, 13500, -1, false, false, false, false, utf8proc_sequences + 3830}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3832, false, -1, 8034, -1, 15360, -1, false, false, false, false, utf8proc_sequences + 3835}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3837, false, -1, 8035, -1, 15420, -1, false, false, false, false, utf8proc_sequences + 3840}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3842, false, -1, 8036, -1, 15480, -1, false, false, false, false, utf8proc_sequences + 3845}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3847, false, -1, 8037, -1, 15540, -1, false, false, false, false, utf8proc_sequences + 3850}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3852, false, -1, 8038, -1, 15600, -1, false, false, false, false, utf8proc_sequences + 3855}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3857, false, -1, 8039, -1, 15660, -1, false, false, false, false, utf8proc_sequences + 3860}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3862, false, 8122, -1, 8122, 15720, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1341, false, 8123, -1, 8123, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3865, false, 8136, -1, 8136, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1348, false, 8137, -1, 8137, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3868, false, 8138, -1, 8138, 15900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1353, false, 8139, -1, 8139, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3871, false, 8154, -1, 8154, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1358, false, 8155, -1, 8155, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3874, false, 8184, -1, 8184, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1363, false, 8185, -1, 8185, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3877, false, 8170, -1, 8170, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1368, false, 8171, -1, 8171, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3880, false, 8186, -1, 8186, 16320, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1373, false, 8187, -1, 8187, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3883, false, 8072, -1, 8072, -1, -1, false, false, false, false, utf8proc_sequences + 3886}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3889, false, 8073, -1, 8073, -1, -1, false, false, false, false, utf8proc_sequences + 3892}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3895, false, 8074, -1, 8074, -1, -1, false, false, false, false, utf8proc_sequences + 3898}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3901, false, 8075, -1, 8075, -1, -1, false, false, false, false, utf8proc_sequences + 3904}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3907, false, 8076, -1, 8076, -1, -1, false, false, false, false, utf8proc_sequences + 3910}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3913, false, 8077, -1, 8077, -1, -1, false, false, false, false, utf8proc_sequences + 3916}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3919, false, 8078, -1, 8078, -1, -1, false, false, false, false, utf8proc_sequences + 3922}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3925, false, 8079, -1, 8079, -1, -1, false, false, false, false, utf8proc_sequences + 3928}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3931, false, -1, 8064, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3934}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3936, false, -1, 8065, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3939}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3941, false, -1, 8066, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3944}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3946, false, -1, 8067, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3949}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3951, false, -1, 8068, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3954}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3956, false, -1, 8069, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3959}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3961, false, -1, 8070, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3964}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3966, false, -1, 8071, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3969}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3971, false, 8088, -1, 8088, -1, -1, false, false, false, false, utf8proc_sequences + 3974}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3977, false, 8089, -1, 8089, -1, -1, false, false, false, false, utf8proc_sequences + 3980}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3983, false, 8090, -1, 8090, -1, -1, false, false, false, false, utf8proc_sequences + 3986}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3989, false, 8091, -1, 8091, -1, -1, false, false, false, false, utf8proc_sequences + 3992}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3995, false, 8092, -1, 8092, -1, -1, false, false, false, false, utf8proc_sequences + 3998}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4001, false, 8093, -1, 8093, -1, -1, false, false, false, false, utf8proc_sequences + 4004}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4007, false, 8094, -1, 8094, -1, -1, false, false, false, false, utf8proc_sequences + 4010}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4013, false, 8095, -1, 8095, -1, -1, false, false, false, false, utf8proc_sequences + 4016}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4019, false, -1, 8080, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4022}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4024, false, -1, 8081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4027}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4029, false, -1, 8082, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4032}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4034, false, -1, 8083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4037}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4039, false, -1, 8084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4042}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4044, false, -1, 8085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4047}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4049, false, -1, 8086, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4052}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4054, false, -1, 8087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4057}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4059, false, 8104, -1, 8104, -1, -1, false, false, false, false, utf8proc_sequences + 4062}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4065, false, 8105, -1, 8105, -1, -1, false, false, false, false, utf8proc_sequences + 4068}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4071, false, 8106, -1, 8106, -1, -1, false, false, false, false, utf8proc_sequences + 4074}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4077, false, 8107, -1, 8107, -1, -1, false, false, false, false, utf8proc_sequences + 4080}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4083, false, 8108, -1, 8108, -1, -1, false, false, false, false, utf8proc_sequences + 4086}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4089, false, 8109, -1, 8109, -1, -1, false, false, false, false, utf8proc_sequences + 4092}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4095, false, 8110, -1, 8110, -1, -1, false, false, false, false, utf8proc_sequences + 4098}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4101, false, 8111, -1, 8111, -1, -1, false, false, false, false, utf8proc_sequences + 4104}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4107, false, -1, 8096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4110}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4112, false, -1, 8097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4115}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4117, false, -1, 8098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4120}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4122, false, -1, 8099, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4125}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4127, false, -1, 8100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4130}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4132, false, -1, 8101, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4135}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4137, false, -1, 8102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4140}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4142, false, -1, 8103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4145}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4147, false, 8120, -1, 8120, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4150, false, 8121, -1, 8121, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4153, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4156}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4159, false, 8124, -1, 8124, -1, -1, false, false, false, false, utf8proc_sequences + 4162}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4165, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4168}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4171, false, -1, -1, -1, 15840, -1, false, false, false, false, utf8proc_sequences + 4171}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4174, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4177}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4181, false, -1, 8112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4184}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4186, false, -1, 8113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4189}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4191, false, -1, 8048, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4194}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4196, false, -1, 8049, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4198}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4200, false, -1, 8115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4203}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1326, false, 921, -1, 921, -1, -1, false, false, false, false, utf8proc_sequences + 1326}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, 16080, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4214, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4217}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4220, false, 8140, -1, 8140, -1, -1, false, false, false, false, utf8proc_sequences + 4223}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4226, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4229}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4232, false, -1, -1, -1, 16020, -1, false, false, false, false, utf8proc_sequences + 4232}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4235, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4238}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4242, false, -1, 8050, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4245}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4247, false, -1, 8051, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4249}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4251, false, -1, 8052, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4254}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4256, false, -1, 8053, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4258}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4260, false, -1, 8131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4263}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4274, false, 8152, -1, 8152, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4277, false, 8153, -1, 8153, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4280, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4283}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4287, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4289, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4289}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4292, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4295}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4299, false, -1, 8144, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4302}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4304, false, -1, 8145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4307}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4309, false, -1, 8054, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4312}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4314, false, -1, 8055, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4316}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4327, false, 8168, -1, 8168, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4330, false, 8169, -1, 8169, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4333, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4336}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4340, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4342, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4342}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4345, false, 8172, -1, 8172, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4348, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4348}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4351, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4354}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4358, false, -1, 8160, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4361}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4363, false, -1, 8161, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4366}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4368, false, -1, 8058, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4371}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4373, false, -1, 8059, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4375}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4377, false, -1, 8165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4380}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4389, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4392}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4395, false, 8188, -1, 8188, -1, -1, false, false, false, false, utf8proc_sequences + 4398}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4401, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4404}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4407, false, -1, -1, -1, 16440, -1, false, false, false, false, utf8proc_sequences + 4407}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4410, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4413}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4417, false, -1, 8056, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4420}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4422, false, -1, 8057, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4424}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4426, false, -1, 8060, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4429}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4431, false, -1, 8061, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4433}, {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4435, false, -1, 8179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4438}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4442, false, -1, -1, -1, 16140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, true, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 4449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZL, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, {UTF8PROC_CATEGORY_ZP, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDF, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4567, false, -1, 969, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1424}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2396, false, -1, 107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 20}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4569, false, -1, 229, -1, -1, -1, false, false, false, false, utf8proc_sequences + 114}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4573}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4591, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8498, -1, 8498, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2392, false, -1, 8560, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4644}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4646, false, -1, 8561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4649}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4651, false, -1, 8562, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4655}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4657, false, -1, 8563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4660}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4662, false, -1, 8564, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4664}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4666, false, -1, 8565, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4669}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4671, false, -1, 8566, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4675}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4677, false, -1, 8567, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4682}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4684, false, -1, 8568, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4687}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4689, false, -1, 8569, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4691}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4693, false, -1, 8570, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4696}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4698, false, -1, 8571, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4702}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2398, false, -1, 8572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4704}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4532, false, -1, 8573, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4706}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2382, false, -1, 8574, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4708}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2400, false, -1, 8575, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4710}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 16, false, 8544, -1, 8544, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4712, false, 8545, -1, 8545, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4715, false, 8546, -1, 8546, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4719, false, 8547, -1, 8547, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 42, false, 8548, -1, 8548, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4722, false, 8549, -1, 8549, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4725, false, 8550, -1, 8550, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4729, false, 8551, -1, 8551, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4734, false, 8552, -1, 8552, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 46, false, 8553, -1, 8553, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4737, false, 8554, -1, 8554, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4740, false, 8555, -1, 8555, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 22, false, 8556, -1, 8556, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4, false, 8557, -1, 8557, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6, false, 8558, -1, 8558, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 24, false, 8559, -1, 8559, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8580, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4744}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8579, -1, 8579, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16500, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16560, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16680, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16800, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16740, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16860, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4764, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16920, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4767, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16980, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4770, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17040, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4773, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17100, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4776, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4779, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4782, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4786, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4789, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17160, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4793, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17220, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4796, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17280, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4799, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17340, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4802, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17520, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4805, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17460, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4808, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17700, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17760, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4814, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4817, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4820, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4823, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17820, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17880, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4826, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4829, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17940, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18000, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4832, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4835, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18060, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18120, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18660, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18720, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4838, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4841, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18240, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4844, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4847, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18300, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18360, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4850, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4853, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18780, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18840, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18420, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18480, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18540, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18600, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4856, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4859, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4862, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4865, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18960, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19020, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19080, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4868, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4871, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4874, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4877, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4880, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4883, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4886, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4889, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4892, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4894, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2376, false, -1, 9424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5195}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2380, false, -1, 9425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5197}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4532, false, -1, 9426, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5199}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2382, false, -1, 9427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5201}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2384, false, -1, 9428, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5203}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4571, false, -1, 9429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5205}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2388, false, -1, 9430, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5207}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2390, false, -1, 9431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5209}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2392, false, -1, 9432, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5211}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2394, false, -1, 9433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5213}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2396, false, -1, 9434, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5215}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2398, false, -1, 9435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5217}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2400, false, -1, 9436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5219}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2402, false, -1, 9437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5221}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2404, false, -1, 9438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5223}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2408, false, -1, 9439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5225}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4553, false, -1, 9440, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5227}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2410, false, -1, 9441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5229}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5231, false, -1, 9442, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5233}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2412, false, -1, 9443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5235}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2414, false, -1, 9444, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5237}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4662, false, -1, 9445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5239}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2416, false, -1, 9446, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5241}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4689, false, -1, 9447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5243}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5245, false, -1, 9448, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5247}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4565, false, -1, 9449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5249}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 0, false, 9398, -1, 9398, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2, false, 9399, -1, 9399, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4, false, 9400, -1, 9400, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6, false, 9401, -1, 9401, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 8, false, 9402, -1, 9402, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 10, false, 9403, -1, 9403, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 12, false, 9404, -1, 9404, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 14, false, 9405, -1, 9405, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 16, false, 9406, -1, 9406, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 18, false, 9407, -1, 9407, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 20, false, 9408, -1, 9408, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 22, false, 9409, -1, 9409, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 24, false, 9410, -1, 9410, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 26, false, 9411, -1, 9411, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 28, false, 9412, -1, 9412, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 30, false, 9413, -1, 9413, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 32, false, 9414, -1, 9414, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 34, false, 9415, -1, 9415, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 36, false, 9416, -1, 9416, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 38, false, 9417, -1, 9417, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 40, false, 9418, -1, 9418, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 42, false, 9419, -1, 9419, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 44, false, 9420, -1, 9420, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 46, false, 9421, -1, 9421, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 48, false, 9422, -1, 9422, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 50, false, 9423, -1, 9423, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5251, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5256, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 5267, true, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 19140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11312, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5270}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11313, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5272}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5274}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11315, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5276}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5278}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11317, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5280}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5282}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11319, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5284}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5286}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11321, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5288}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5290}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11323, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5292}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5294}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11325, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5296}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5298}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11327, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5300}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5302}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11329, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5304}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11330, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5306}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5308}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11332, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5310}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11333, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5312}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11334, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5314}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5316}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11336, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5318}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5320}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11338, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5322}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5324}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11340, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5326}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5328}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11342, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5330}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5332}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11344, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5334}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5336}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5338}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5340}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5342}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5344}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5346}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5348}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5350}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5352}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5354}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5356}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5358}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5360}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5362}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11264, -1, 11264, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11265, -1, 11265, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11266, -1, 11266, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11267, -1, 11267, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11268, -1, 11268, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11269, -1, 11269, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11270, -1, 11270, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11271, -1, 11271, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11272, -1, 11272, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11273, -1, 11273, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11274, -1, 11274, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11275, -1, 11275, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11276, -1, 11276, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11277, -1, 11277, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11278, -1, 11278, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11279, -1, 11279, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11280, -1, 11280, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11281, -1, 11281, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11282, -1, 11282, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11283, -1, 11283, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11284, -1, 11284, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11285, -1, 11285, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11286, -1, 11286, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11287, -1, 11287, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11288, -1, 11288, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11289, -1, 11289, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11290, -1, 11290, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11291, -1, 11291, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11292, -1, 11292, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11293, -1, 11293, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11294, -1, 11294, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11295, -1, 11295, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11296, -1, 11296, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11297, -1, 11297, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11298, -1, 11298, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11299, -1, 11299, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11300, -1, 11300, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11301, -1, 11301, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11302, -1, 11302, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11303, -1, 11303, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11304, -1, 11304, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11305, -1, 11305, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11306, -1, 11306, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11307, -1, 11307, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11308, -1, 11308, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11309, -1, 11309, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11310, -1, 11310, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5364}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11360, -1, 11360, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5366}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 7549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5368}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5370}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 570, -1, 570, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 574, -1, 574, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5372}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11367, -1, 11367, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5374}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11369, -1, 11369, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11372, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5376}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11371, -1, 11371, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5378}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11381, -1, 11381, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5380}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11392, -1, 11392, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5382}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11394, -1, 11394, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5384}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11396, -1, 11396, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5386}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11398, -1, 11398, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5388}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11400, -1, 11400, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5390}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11402, -1, 11402, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5392}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11404, -1, 11404, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5394}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11406, -1, 11406, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5396}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11408, -1, 11408, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5398}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11410, -1, 11410, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5400}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11412, -1, 11412, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11415, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5402}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11414, -1, 11414, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11417, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5404}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11416, -1, 11416, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5406}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11418, -1, 11418, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5408}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11420, -1, 11420, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11423, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5410}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11422, -1, 11422, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5412}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11424, -1, 11424, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5414}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11426, -1, 11426, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5416}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11428, -1, 11428, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5418}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11430, -1, 11430, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5420}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11432, -1, 11432, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5422}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11434, -1, 11434, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5424}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11436, -1, 11436, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5426}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11438, -1, 11438, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5428}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11440, -1, 11440, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5430}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11442, -1, 11442, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5432}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11444, -1, 11444, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5434}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11446, -1, 11446, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5436}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11448, -1, 11448, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11451, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5438}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11450, -1, 11450, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11453, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5440}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11452, -1, 11452, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11455, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5442}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11454, -1, 11454, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11457, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5444}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11456, -1, 11456, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11459, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5446}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11458, -1, 11458, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11461, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5448}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11460, -1, 11460, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11463, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5450}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11462, -1, 11462, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11465, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5452}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11464, -1, 11464, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11467, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5454}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11466, -1, 11466, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11469, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5456}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11468, -1, 11468, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11471, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5458}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11470, -1, 11470, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11473, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5460}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11472, -1, 11472, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11475, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5462}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11474, -1, 11474, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5464}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11476, -1, 11476, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5466}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11478, -1, 11478, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5468}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11480, -1, 11480, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5470}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11482, -1, 11482, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5472}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11484, -1, 11484, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5474}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11486, -1, 11486, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5476}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11488, -1, 11488, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11491, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5478}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11490, -1, 11490, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4256, -1, 4256, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4257, -1, 4257, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4258, -1, 4258, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4259, -1, 4259, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4260, -1, 4260, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4261, -1, 4261, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4262, -1, 4262, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4263, -1, 4263, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4264, -1, 4264, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4265, -1, 4265, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4266, -1, 4266, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4267, -1, 4267, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4268, -1, 4268, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4269, -1, 4269, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4270, -1, 4270, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4271, -1, 4271, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4272, -1, 4272, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4273, -1, 4273, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4274, -1, 4274, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4275, -1, 4275, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4276, -1, 4276, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4277, -1, 4277, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4278, -1, 4278, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4279, -1, 4279, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4280, -1, 4280, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4281, -1, 4281, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4282, -1, 4282, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4283, -1, 4283, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4284, -1, 4284, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4285, -1, 4285, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4286, -1, 4286, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4287, -1, 4287, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4288, -1, 4288, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4289, -1, 4289, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4290, -1, 4290, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4291, -1, 4291, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4292, -1, 4292, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4293, -1, 4293, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 218, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 224, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20400, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19200, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19260, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19320, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19380, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19440, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19500, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19560, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19620, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19680, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19740, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19800, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19860, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19920, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19980, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20040, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20100, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20160, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20220, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20280, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20340, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 52, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 53, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20460, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21720, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20520, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20580, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20640, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20700, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20760, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20820, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20880, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20940, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21000, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21060, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21120, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21180, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21240, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21300, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21360, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21420, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21480, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21540, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21600, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21660, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21780, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21840, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21900, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21960, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22020, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6208, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6745, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6757, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6769, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6773, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6785, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6809, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6821, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6849, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6853, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6857, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7781, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7813, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8039, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8057, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8069, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8157, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8165, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8169, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8177, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8181, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8193, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8199, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8201, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8207, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8213, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8225, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8391, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8399, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8403, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8423, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8427, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8439, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8457, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8469, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8471, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8481, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8487, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8493, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8495, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8525, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8533, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8549, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8557, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8561, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8573, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8585, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8645, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8649, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8657, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8661, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8669, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8681, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8693, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8705, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8745, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8745}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8748}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8751, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8751}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8754, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8754}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8758}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8762, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8765, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8768}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8771, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8771}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8774, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8774}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8777, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8777}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8780, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8780}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8783, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8786, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8789, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8793, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8801, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8803, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8806, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8809, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8812, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8815, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8818, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8821, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8824, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8827, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8830, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8833, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8836, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8839, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8842, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8845, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8848, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8851, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8854, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8857, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8860, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8863, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8866, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8869, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8872, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8875, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8878, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8881, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8884, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8887, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8890, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8893, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8896, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9775, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9783, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9787, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9819, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9823, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9831, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 10013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9989, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9991, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2376, false, -1, 65345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10165}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2380, false, -1, 65346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10167}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4532, false, -1, 65347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10169}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2382, false, -1, 65348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10171}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2384, false, -1, 65349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10173}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4571, false, -1, 65350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10175}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2388, false, -1, 65351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10177}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2390, false, -1, 65352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10179}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2392, false, -1, 65353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10181}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2394, false, -1, 65354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10183}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2396, false, -1, 65355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10185}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2398, false, -1, 65356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10187}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2400, false, -1, 65357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10189}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2402, false, -1, 65358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10191}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2404, false, -1, 65359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10193}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2408, false, -1, 65360, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10195}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4553, false, -1, 65361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10197}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2410, false, -1, 65362, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10199}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5231, false, -1, 65363, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10201}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2412, false, -1, 65364, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10203}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2414, false, -1, 65365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10205}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4662, false, -1, 65366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10207}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2416, false, -1, 65367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10209}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4689, false, -1, 65368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10211}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5245, false, -1, 65369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10213}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4565, false, -1, 65370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10215}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10009, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10011, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 0, false, 65313, -1, 65313, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2, false, 65314, -1, 65314, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4, false, 65315, -1, 65315, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 6, false, 65316, -1, 65316, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 8, false, 65317, -1, 65317, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10, false, 65318, -1, 65318, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 12, false, 65319, -1, 65319, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 14, false, 65320, -1, 65320, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 16, false, 65321, -1, 65321, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 18, false, 65322, -1, 65322, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 20, false, 65323, -1, 65323, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 22, false, 65324, -1, 65324, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 24, false, 65325, -1, 65325, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 26, false, 65326, -1, 65326, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 28, false, 65327, -1, 65327, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 30, false, 65328, -1, 65328, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 32, false, 65329, -1, 65329, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 34, false, 65330, -1, 65330, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 36, false, 65331, -1, 65331, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 38, false, 65332, -1, 65332, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 40, false, 65333, -1, 65333, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 42, false, 65334, -1, 65334, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 44, false, 65335, -1, 65335, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 46, false, 65336, -1, 65336, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 48, false, 65337, -1, 65337, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 50, false, 65338, -1, 65338, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10223, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10225, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10001, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10003, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10255, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66600, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10387}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10389}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66602, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10391}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10393}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66604, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10395}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66605, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10397}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66606, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10399}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66607, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10401}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10403}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66609, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10405}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66610, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10407}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10409}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66612, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10411}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66613, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10413}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66614, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10415}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66615, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10417}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10419}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10421}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66618, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10423}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10425}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66620, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10427}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66621, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10429}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66622, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10431}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10433}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66624, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10435}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66625, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10437}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10439}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66627, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10441}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66628, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10443}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10445}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66630, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10447}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66631, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10449}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66632, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10451}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66633, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10453}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66634, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10455}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66635, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10457}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66636, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10459}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10461}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66638, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10463}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66639, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10465}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66560, -1, 66560, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66561, -1, 66561, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66562, -1, 66562, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66563, -1, 66563, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66564, -1, 66564, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66565, -1, 66565, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66566, -1, 66566, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66567, -1, 66567, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66568, -1, 66568, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66569, -1, 66569, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66570, -1, 66570, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66571, -1, 66571, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66572, -1, 66572, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66573, -1, 66573, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66574, -1, 66574, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66575, -1, 66575, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66576, -1, 66576, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66577, -1, 66577, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66578, -1, 66578, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66579, -1, 66579, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66580, -1, 66580, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66581, -1, 66581, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66582, -1, 66582, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66583, -1, 66583, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66584, -1, 66584, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66585, -1, 66585, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66586, -1, 66586, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66587, -1, 66587, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66588, -1, 66588, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66589, -1, 66589, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66590, -1, 66590, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66591, -1, 66591, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66592, -1, 66592, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66593, -1, 66593, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66594, -1, 66594, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66595, -1, 66595, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66596, -1, 66596, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66597, -1, 66597, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66598, -1, 66598, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66599, -1, 66599, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22080, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22140, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10467, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10470, false, -1, -1, -1, 22200, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10473, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10476, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10479, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10482, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10485, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 54, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 55, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 56, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 57, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 58, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 59, false, false, false, true, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22260, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22320, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10488, false, -1, -1, -1, 22380, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10491, false, -1, -1, -1, 22440, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10494, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10497, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10500, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10503, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 32, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 67, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10550, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10996, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11002, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11018, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11024, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11036, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11042, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11048, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11054, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11060, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11066, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11072, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11078, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11084, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11090, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11096, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11316, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11336, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11340, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11348, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11360, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11372, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11478, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, }; const int32_t utf8proc_combinations[] = { 192, 193, 194, 195, 196, 197, -1, 256, 258, 260, 550, 461, -1, -1, 512, 514, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7680, 7840, -1, -1, -1, -1, -1, 7842, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 262, 264, -1, -1, -1, 199, -1, -1, -1, 266, 268, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 200, 201, 202, 7868, 203, -1, 552, 274, 276, 280, 278, 282, -1, -1, 516, 518, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7864, -1, 7704, 7706, -1, -1, 7866, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 204, 205, 206, 296, 207, -1, -1, 298, 300, 302, 304, 463, -1, -1, 520, 522, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7882, -1, -1, 7724, -1, -1, 7880, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 504, 323, -1, 209, -1, -1, 325, -1, -1, -1, 7748, 327, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7750, 7752, 7754, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 210, 211, 212, 213, 214, -1, -1, 332, 334, 490, 558, 465, 336, 416, 524, 526, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7884, -1, -1, -1, -1, -1, 7886, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 217, 218, 219, 360, 220, 366, -1, 362, 364, 370, -1, 467, 368, 431, 532, 534, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7908, -1, 7798, 7796, -1, 7794, 7910, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7922, 221, 374, 7928, 376, -1, -1, 562, -1, -1, 7822, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7924, -1, -1, -1, -1, -1, 7926, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 224, 225, 226, 227, 228, 229, -1, 257, 259, 261, 551, 462, -1, -1, 513, 515, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7681, 7841, -1, -1, -1, -1, -1, 7843, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 263, 265, -1, -1, -1, 231, -1, -1, -1, 267, 269, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, 233, 234, 7869, 235, -1, 553, 275, 277, 281, 279, 283, -1, -1, 517, 519, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7865, -1, 7705, 7707, -1, -1, 7867, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, 237, 238, 297, 239, -1, -1, 299, 301, 303, -1, 464, -1, -1, 521, 523, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7883, -1, -1, 7725, -1, -1, 7881, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 505, 324, -1, 241, -1, -1, 326, -1, -1, -1, 7749, 328, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7751, 7753, 7755, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 242, 243, 244, 245, 246, -1, -1, 333, 335, 491, 559, 466, 337, 417, 525, 527, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7885, -1, -1, -1, -1, -1, 7887, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 249, 250, 251, 361, 252, 367, -1, 363, 365, 371, -1, 468, 369, 432, 533, 535, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7909, -1, 7799, 7797, -1, 7795, 7911, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7923, 253, 375, 7929, 255, 7833, -1, 563, -1, -1, 7823, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7925, -1, -1, -1, -1, -1, 7927, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7696, -1, -1, -1, 7690, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7692, 7694, 7698, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7697, -1, -1, -1, 7691, 271, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7693, 7695, 7699, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 500, 284, -1, -1, -1, 290, 7712, 286, -1, 288, 486, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 501, 285, -1, -1, -1, 291, 7713, 287, -1, 289, 487, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 292, -1, 7718, -1, 7720, -1, -1, -1, 7714, 542, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7716, -1, -1, -1, 7722, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 293, -1, 7719, -1, 7721, -1, -1, -1, 7715, 543, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7717, 7830, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 308, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 309, -1, -1, -1, -1, -1, -1, -1, -1, 496, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7728, -1, -1, -1, -1, 310, -1, -1, -1, -1, 488, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7730, 7732, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7729, -1, -1, -1, -1, 311, -1, -1, -1, -1, 489, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7731, 7733, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, 315, -1, -1, -1, -1, 317, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7734, 7738, 7740, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, -1, -1, -1, -1, 316, -1, -1, -1, -1, 318, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7735, 7739, 7741, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 340, -1, -1, -1, -1, 342, -1, -1, -1, 7768, 344, -1, -1, 528, 530, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7770, 7774, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 341, -1, -1, -1, -1, 343, -1, -1, -1, 7769, 345, -1, -1, 529, 531, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7771, 7775, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 346, 348, -1, -1, -1, 350, -1, -1, -1, 7776, 352, -1, -1, -1, -1, 536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7778, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 347, 349, -1, -1, -1, 351, -1, -1, -1, 7777, 353, -1, -1, -1, -1, 537, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7779, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, -1, -1, -1, 7786, 356, -1, -1, -1, -1, 538, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7788, 7790, 7792, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7831, -1, 355, -1, -1, -1, 7787, 357, -1, -1, -1, -1, 539, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7789, 7791, 7793, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7808, 7810, 372, -1, 7812, -1, -1, -1, -1, -1, 7814, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7816, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7809, 7811, 373, -1, 7813, 7832, -1, -1, -1, -1, 7815, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7817, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 377, 7824, -1, -1, -1, -1, -1, -1, -1, 379, 381, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7826, 7828, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 378, 7825, -1, -1, -1, -1, -1, -1, -1, 380, 382, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7827, 7829, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 475, 471, -1, -1, -1, -1, -1, 469, -1, -1, -1, 473, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 476, 472, -1, -1, -1, -1, -1, 470, -1, -1, -1, 474, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 478, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 479, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 480, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 481, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 508, -1, -1, -1, -1, -1, 482, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 509, -1, -1, -1, -1, -1, 483, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 492, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 493, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 494, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 506, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 510, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 511, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 554, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 555, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7756, -1, -1, 7758, -1, -1, 556, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7757, -1, -1, 7759, -1, -1, 557, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 560, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 561, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8173, 901, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8129, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8122, 902, -1, -1, -1, -1, -1, 8121, 8120, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7944, 7945, -1, 8124, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8136, 904, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7960, 7961, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8138, 905, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7976, 7977, -1, 8140, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8154, 906, -1, -1, 938, -1, -1, 8153, 8152, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7992, 7993, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8184, 908, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8008, 8009, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8170, 910, -1, -1, 939, -1, -1, 8169, 8168, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8025, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8186, 911, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8040, 8041, -1, 8188, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8146, 912, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8151, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8048, 940, -1, -1, -1, -1, -1, 8113, 8112, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7936, 7937, 8118, 8115, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8050, 941, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7952, 7953, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8052, 942, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7968, 7969, 8134, 8131, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8054, 943, -1, -1, 970, -1, -1, 8145, 8144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7984, 7985, 8150, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8162, 944, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8167, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8058, 973, -1, -1, 971, -1, -1, 8161, 8160, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8016, 8017, 8166, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8056, 972, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8000, 8001, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8060, 974, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8032, 8033, 8182, 8179, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 979, -1, -1, 980, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1024, -1, -1, -1, 1025, -1, -1, -1, 1238, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1027, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1031, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1036, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1037, -1, -1, -1, 1252, -1, -1, 1250, 1049, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1264, -1, -1, 1262, 1038, -1, -1, -1, 1266, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1117, -1, -1, -1, 1253, -1, -1, 1251, 1081, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1104, -1, -1, -1, 1105, -1, -1, -1, 1239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1111, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1116, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1265, -1, -1, 1263, 1118, -1, -1, -1, 1267, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1142, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1244, -1, -1, -1, 1217, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1245, -1, -1, -1, 1218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1234, -1, -1, -1, 1232, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1235, -1, -1, -1, 1233, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1242, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1243, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1246, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1247, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1254, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1255, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1258, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1259, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1260, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1261, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1268, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1269, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1272, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1273, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1570, 1571, 1573, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1572, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1574, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1728, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1730, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1747, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2353, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2356, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2507, 2508, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2888, 2891, 2892, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2964, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3020, 3018, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3019, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3271, 3272, 3274, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3275, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3402, 3404, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3403, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3546, 3548, 3550, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3549, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4134, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6918, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6920, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6922, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6924, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6926, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6930, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6973, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6976, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6977, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6979, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7682, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7684, 7686, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7683, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7685, 7687, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7688, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7689, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7700, 7702, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7701, 7703, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7708, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7709, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7710, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7711, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7726, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7727, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7736, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7737, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7742, -1, -1, -1, -1, -1, -1, -1, -1, 7744, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7746, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7743, -1, -1, -1, -1, -1, -1, -1, -1, 7745, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7747, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7760, 7762, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7761, 7763, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7764, -1, -1, -1, -1, -1, -1, -1, -1, 7766, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7765, -1, -1, -1, -1, -1, -1, -1, -1, 7767, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7772, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7773, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7780, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7781, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7782, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7783, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7784, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7785, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7800, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7801, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7802, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7803, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7804, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7806, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7805, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7807, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7820, -1, -1, -1, -1, -1, 7818, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7821, -1, -1, -1, -1, -1, 7819, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7835, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7846, 7844, -1, 7850, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7848, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7847, 7845, -1, 7851, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7849, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7852, -1, -1, -1, -1, -1, 7862, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7853, -1, -1, -1, -1, -1, 7863, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7856, 7854, -1, 7860, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7858, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7857, 7855, -1, 7861, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7859, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7872, 7870, -1, 7876, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7874, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7873, 7871, -1, 7877, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7875, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7878, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7879, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7890, 7888, -1, 7894, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7892, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7891, 7889, -1, 7895, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7893, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7896, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7897, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7900, 7898, -1, 7904, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7906, -1, -1, -1, -1, -1, 7902, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7901, 7899, -1, 7905, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7907, -1, -1, -1, -1, -1, 7903, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7914, 7912, -1, 7918, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7920, -1, -1, -1, -1, -1, 7916, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7915, 7913, -1, 7919, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7921, -1, -1, -1, -1, -1, 7917, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7938, 7940, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7942, 8064, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7939, 7941, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7943, 8065, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7946, 7948, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7950, 8072, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7947, 7949, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7951, 8073, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7954, 7956, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7955, 7957, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7962, 7964, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7963, 7965, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7970, 7972, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7974, 8080, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7971, 7973, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7975, 8081, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7978, 7980, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7982, 8088, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7979, 7981, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7983, 8089, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7986, 7988, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7990, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7987, 7989, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7991, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7994, 7996, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7998, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7995, 7997, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7999, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8002, 8004, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8003, 8005, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8010, 8012, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8011, 8013, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8018, 8020, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8022, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8019, 8021, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8023, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8027, 8029, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8031, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8034, 8036, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8038, 8096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8035, 8037, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8039, 8097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8042, 8044, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8046, 8104, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8043, 8045, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8047, 8105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8066, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8067, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8068, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8069, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8070, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8071, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8074, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8075, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8076, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8077, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8078, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8079, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8082, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8083, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8084, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8085, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8086, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8087, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8090, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8091, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8092, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8093, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8094, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8095, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8098, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8099, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8102, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8103, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8106, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8108, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8111, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8114, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8116, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8130, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8132, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8135, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8141, 8142, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8157, 8158, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8159, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8164, 8165, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8180, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8183, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8602, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8603, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8622, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8653, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8654, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8655, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8708, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8713, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8716, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8740, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8742, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8769, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8772, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8775, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8777, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8800, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8802, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8813, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8814, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8815, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8816, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8817, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8820, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8821, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8824, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8832, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8833, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8836, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8837, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8841, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8876, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8877, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8878, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8879, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8928, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8929, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8930, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8931, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8938, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8939, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8940, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8941, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10972, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12364, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12366, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12368, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12374, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12376, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12378, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12380, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12382, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12384, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12386, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12389, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12391, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12400, 12401, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12403, 12404, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12406, 12407, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12409, 12410, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12412, 12413, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12436, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12446, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12460, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12462, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12464, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12466, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12468, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12474, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12476, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12478, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12480, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12482, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12485, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12487, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12489, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12496, 12497, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12499, 12500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12502, 12503, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12505, 12506, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12508, 12509, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12532, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12535, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12537, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12538, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12542, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119134, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119135, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119136, 119137, 119138, 119139, 119140, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119227, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119228, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119229, 119231, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119230, 119232, -1, -1, -1, }; mriconvert/utf8proc-v1.1.6/data_generator.rb0000644000175000000620000024732212361300460020166 0ustar stevestaff#!/usr/pkg/bin/ruby # This file was used to generate the 'unicode_data.c' file by parsing the # Unicode data file 'UnicodeData.txt' of the Unicode Character Database. # It is included for informational purposes only and not intended for # production use. # Copyright (c) 2009 Public Software Group e. V., Berlin, Germany # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # This file contains derived data from a modified version of the # Unicode data files. The following license applies to that data: # # COPYRIGHT AND PERMISSION NOTICE # # Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed # under the Terms of Use in http://www.unicode.org/copyright.html. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of the Unicode data files and any associated documentation (the "Data # Files") or Unicode software and any associated documentation (the # "Software") to deal in the Data Files or Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, and/or sell copies of the Data Files or Software, and # to permit persons to whom the Data Files or Software are furnished to do # so, provided that (a) the above copyright notice(s) and this permission # notice appear with all copies of the Data Files or Software, (b) both the # above copyright notice(s) and this permission notice appear in associated # documentation, and (c) there is clear notice in each modified Data File or # in the Software as well as in the documentation associated with the Data # File(s) or Software that the data or software has been modified. # # THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF # THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS # INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR # CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF # USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THE DATA FILES OR SOFTWARE. # # Except as contained in this notice, the name of a copyright holder shall # not be used in advertising or otherwise to promote the sale, use or other # dealings in these Data Files or Software without prior written # authorization of the copyright holder. $ignorable_list = <.. 000E..001F ; Default_Ignorable_Code_Point # Cc [18] .. 007F..0084 ; Default_Ignorable_Code_Point # Cc [6] .. 0086..009F ; Default_Ignorable_Code_Point # Cc [26] .. 00AD ; Default_Ignorable_Code_Point # Cf SOFT HYPHEN 034F ; Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER 0600..0603 ; Default_Ignorable_Code_Point # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA 06DD ; Default_Ignorable_Code_Point # Cf ARABIC END OF AYAH 070F ; Default_Ignorable_Code_Point # Cf SYRIAC ABBREVIATION MARK 115F..1160 ; Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER 17B4..17B5 ; Default_Ignorable_Code_Point # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA 180B..180D ; Default_Ignorable_Code_Point # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 200B..200F ; Default_Ignorable_Code_Point # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK 202A..202E ; Default_Ignorable_Code_Point # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE 2060..2063 ; Default_Ignorable_Code_Point # Cf [4] WORD JOINER..INVISIBLE SEPARATOR 2064..2069 ; Default_Ignorable_Code_Point # Cn [6] .. 206A..206F ; Default_Ignorable_Code_Point # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES 3164 ; Default_Ignorable_Code_Point # Lo HANGUL FILLER D800..DFFF ; Default_Ignorable_Code_Point # Cs [2048] .. FE00..FE0F ; Default_Ignorable_Code_Point # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 FEFF ; Default_Ignorable_Code_Point # Cf ZERO WIDTH NO-BREAK SPACE FFA0 ; Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER FFF0..FFF8 ; Default_Ignorable_Code_Point # Cn [9] .. 1D173..1D17A ; Default_Ignorable_Code_Point # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE E0001 ; Default_Ignorable_Code_Point # Cf LANGUAGE TAG E0002..E001F ; Default_Ignorable_Code_Point # Cn [30] .. E0020..E007F ; Default_Ignorable_Code_Point # Cf [96] TAG SPACE..CANCEL TAG E0080..E00FF ; Default_Ignorable_Code_Point # Cn [128] .. E0100..E01EF ; Default_Ignorable_Code_Point # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 E01F0..E0FFF ; Default_Ignorable_Code_Point # Cn [3600] .. END_OF_LIST $ignorable = [] $ignorable_list.each do |entry| if entry =~ /^([0-9A-F]+)\.\.([0-9A-F]+)/ $1.hex.upto($2.hex) { |e2| $ignorable << e2 } elsif entry =~ /^[0-9A-F]+/ $ignorable << $&.hex end end $grapheme_extend_list = <)? # decomposition type ((\ ?[0-9A-F]+)*); # decompomposition mapping ([0-9]*); # decimal digit ([0-9]*); # digit ([^;]*); # numeric ([YN]*); # bidi mirrored ([^;]*); # unicode 1.0 name ([^;]*); # iso comment ([0-9A-F]*); # simple uppercase mapping ([0-9A-F]*); # simple lowercase mapping ([0-9A-F]*)$/ix # simple titlecase mapping @code = $1.hex @name = $2 @category = $3 @combining_class = Integer($4) @bidi_class = $5 @decomp_type = $7 @decomp_mapping = ($8=='') ? nil : $8.split.collect { |element| element.hex } @bidi_mirrored = ($13=='Y') ? true : false @uppercase_mapping = ($16=='') ? nil : $16.hex @lowercase_mapping = ($17=='') ? nil : $17.hex @titlecase_mapping = ($18=='') ? nil : $18.hex end def case_folding $case_folding[code] end def c_entry(comb1_indicies, comb2_indicies) " " << "{#{str2c category, 'CATEGORY'}, #{combining_class}, " << "#{str2c bidi_class, 'BIDI_CLASS'}, " << "#{str2c decomp_type, 'DECOMP_TYPE'}, " << "#{ary2c decomp_mapping}, " << "#{bidi_mirrored}, " << "#{uppercase_mapping or -1}, " << "#{lowercase_mapping or -1}, " << "#{titlecase_mapping or -1}, " << "#{comb1_indicies[code] ? (comb1_indicies[code]*comb2_indicies.keys.length) : -1 }, #{comb2_indicies[code] or -1}, " << "#{$exclusions.include?(code) or $excl_version.include?(code)}, " << "#{$ignorable.include?(code)}, " << "#{%W[Zl Zp Cc Cf].include?(category) and not [0x200C, 0x200D].include?(category)}, " << "#{$grapheme_extend.include?(code)}, " << "#{ary2c case_folding}},\n" end end chars = [] char_hash = {} while gets if $_ =~ /^([0-9A-F]+);<[^;>,]+, First>;/i first = $1.hex gets char = UnicodeChar.new($_) raise "No last character of sequence found." unless $_ =~ /^([0-9A-F]+);<([^;>,]+), Last>;/i last = $1.hex name = "<#{$2}>" for i in first..last char_clone = char.clone char_clone.code = i char_clone.name = name char_hash[char_clone.code] = char_clone chars << char_clone end else char = UnicodeChar.new($_) char_hash[char.code] = char chars << char end end comb1st_indicies = {} comb2nd_indicies = {} comb_array = [] chars.each do |char| if char.decomp_type.nil? and char.decomp_mapping and char.decomp_mapping.length == 2 and char_hash[char.decomp_mapping[0]].combining_class == 0 and not $exclusions.include?(char.code) unless comb1st_indicies[char.decomp_mapping[0]] comb1st_indicies[char.decomp_mapping[0]] = comb1st_indicies.keys.length end unless comb2nd_indicies[char.decomp_mapping[1]] comb2nd_indicies[char.decomp_mapping[1]] = comb2nd_indicies.keys.length end comb_array[comb1st_indicies[char.decomp_mapping[0]]] ||= [] raise "Duplicate canonical mapping" if comb_array[comb1st_indicies[char.decomp_mapping[0]]][ comb2nd_indicies[char.decomp_mapping[1]]] comb_array[comb1st_indicies[char.decomp_mapping[0]]][ comb2nd_indicies[char.decomp_mapping[1]]] = char.code end end properties_indicies = {} properties = [] chars.each do |char| c_entry = char.c_entry(comb1st_indicies, comb2nd_indicies) unless properties_indicies[c_entry] properties_indicies[c_entry] = properties.length properties << c_entry end end stage1 = [] stage2 = [] for code in 0...0x110000 next unless code % 0x100 == 0 stage2_entry = [] for code2 in code...(code+0x100) if char_hash[code2] stage2_entry << (properties_indicies[char_hash[code2].c_entry( comb1st_indicies, comb2nd_indicies)] + 1) else stage2_entry << 0 end end old_index = stage2.index(stage2_entry) if old_index stage1 << (old_index * 0x100) else stage1 << (stage2.length * 0x100) stage2 << stage2_entry end end $stdout << "const int32_t utf8proc_sequences[] = {\n " i = 0 $int_array.each do |entry| i += 1 if i == 8 i = 0 $stdout << "\n " end $stdout << entry << ", " end $stdout << "};\n\n" $stdout << "const uint16_t utf8proc_stage1table[] = {\n " i = 0 stage1.each do |entry| i += 1 if i == 8 i = 0 $stdout << "\n " end $stdout << entry << ", " end $stdout << "};\n\n" $stdout << "const uint16_t utf8proc_stage2table[] = {\n " i = 0 stage2.flatten.each do |entry| i += 1 if i == 8 i = 0 $stdout << "\n " end $stdout << entry << ", " end $stdout << "};\n\n" $stdout << "const utf8proc_property_t utf8proc_properties[] = {\n" $stdout << " {0, 0, 0, 0, NULL, false, -1, -1, -1, -1, -1, false},\n" properties.each { |line| $stdout << line } $stdout << "};\n\n" $stdout << "const int32_t utf8proc_combinations[] = {\n " i = 0 comb1st_indicies.keys.each_index do |a| comb2nd_indicies.keys.each_index do |b| i += 1 if i == 8 i = 0 $stdout << "\n " end $stdout << ( comb_array[a][b] or -1 ) << ", " end end $stdout << "};\n\n" mriconvert/utf8proc-v1.1.6/README0000644000175000000620000000761312361300460015537 0ustar stevestaff Please read the LICENSE file, which is shipping with this software. *** QUICK START *** For compilation of the C library call "make c-library", for compilation of the ruby library call "make ruby-library" and for compilation of the PostgreSQL extension call "make pgsql-library". For ruby you can also create a gem-file by calling "make ruby-gem". "make all" can be used to build everything, but both ruby and PostgreSQL installations are required in this case. *** GENERAL INFORMATION *** The C library is found in this directory after successful compilation and is named "libutf8proc.a" and "libutf8proc.so". The ruby library consists of the files "utf8proc.rb" and "utf8proc_native.so", which are found in the subdirectory "ruby/". If you chose to create a gem-file it is placed in the "ruby/gem" directory. The PostgreSQL extension is named "utf8proc_pgsql.so" and resides in the "pgsql/" directory. Both the ruby library and the PostgreSQL extension are built as stand-alone libraries and are therefore not dependent the dynamic version of the C library files, but this behaviour might change in future releases. The Unicode version being supported is 5.0.0. Note: Version 4.1.0 of Unicode Standard Annex #29 was used, as version 5.0.0 had not been available at the time of implementation. For Unicode normalizations, the following options have to be used: Normalization Form C: STABLE, COMPOSE Normalization Form D: STABLE, DECOMPOSE Normalization Form KC: STABLE, COMPOSE, COMPAT Normalization Form KD: STABLE, DECOMPOSE, COMPAT *** C LIBRARY *** The documentation for the C library is found in the utf8proc.h header file. "utf8proc_map" is most likely function you will be using for mapping UTF-8 strings, unless you want to allocate memory yourself. *** RUBY API *** The ruby library adds the methods "utf8map" and "utf8map!" to the String class, and the method "utf8" to the Integer class. The String#utf8map method does the same as the "utf8proc_map" C function. Options for the mapping procedure are passed as symbols, i.e: "Hello".utf8map(:casefold) => "hello" The descriptions of all options are found in the C header file "utf8proc.h". Please notice that the according symbols in ruby are all lowercase. String#utf8map! is the destructive function in the meaning that the string is replaced by the result. There are shortcuts for the 4 normalization forms specified by Unicode: String#utf8nfd, String#utf8nfd!, String#utf8nfc, String#utf8nfc!, String#utf8nfkd, String#utf8nfkd!, String#utf8nfkc, String#utf8nfkc! The method Integer#utf8 returns a UTF-8 string, which is containing the unicode char given by the code point. 0x000A.utf8 => "\n" 0x2028.utf8 => "\342\200\250" *** POSTGRESQL API *** For PostgreSQL there are two SQL functions supplied named "unifold" and "unistrip". These functions function can be used to prepare index fields in order to be folded in a way where string-comparisons make more sense, e.g. where "bathtub" == "bathtub" or "Hello World" == "hello world". CREATE TABLE people ( id serial8 primary key, name text, CHECK (unifold(name) NOTNULL) ); CREATE INDEX name_idx ON people (unifold(name)); SELECT * FROM people WHERE unifold(name) = unifold('John Doe'); The function "unistrip" removes character marks like accents or diaeresis, while "unifold" keeps then. NOTICE: The outputs of the function can change between releases, as utf8proc does not follow a versioning stability policy. You have to rebuild your database indicies, if you upgrade to a newer version of utf8proc. *** TODO *** - detect stable code points and process segments independently in order to save memory - do a quick check before normalizing strings to optimize speed - support stream processing *** CONTACT *** If you find any bugs or experience difficulties in compiling this software, please contact us: Project page: http://www.public-software-group.org/utf8proc mriconvert/utf8proc-v1.1.6/utf8proc.h0000644000175000000620000003544412361300460016605 0ustar stevestaff/* * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * File name: utf8proc.h * * Description: * Header files for libutf8proc, which is a mapping tool for UTF-8 strings * with following features: * - decomposing and composing of strings * - replacing compatibility characters with their equivalents * - stripping of "default ignorable characters" * like SOFT-HYPHEN or ZERO-WIDTH-SPACE * - folding of certain characters for string comparison * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-") * (see "LUMP" option) * - optional rejection of strings containing non-assigned code points * - stripping of control characters * - stripping of character marks (accents, etc.) * - transformation of LF, CRLF, CR and NEL to line-feed (LF) * or to the unicode chararacters for paragraph separation (PS) * or line separation (LS). * - unicode case folding (for case insensitive string comparisons) * - rejection of illegal UTF-8 data * (i.e. UTF-8 encoded UTF-16 surrogates) * - support for korean hangul characters * Unicode Version 5.0.0 is supported. */ #ifndef UTF8PROC_H #define UTF8PROC_H #include #include #ifdef _MSC_VER typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef int int32_t; #ifdef _WIN64 #define ssize_t __int64 #else #define ssize_t int #endif typedef unsigned char bool; enum {false, true}; #else #include #include #endif #include #ifdef __cplusplus extern "C" { #endif #ifndef SSIZE_MAX #define SSIZE_MAX ((size_t)SIZE_MAX/2) #endif #define UTF8PROC_NULLTERM (1<<0) #define UTF8PROC_STABLE (1<<1) #define UTF8PROC_COMPAT (1<<2) #define UTF8PROC_COMPOSE (1<<3) #define UTF8PROC_DECOMPOSE (1<<4) #define UTF8PROC_IGNORE (1<<5) #define UTF8PROC_REJECTNA (1<<6) #define UTF8PROC_NLF2LS (1<<7) #define UTF8PROC_NLF2PS (1<<8) #define UTF8PROC_NLF2LF (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS) #define UTF8PROC_STRIPCC (1<<9) #define UTF8PROC_CASEFOLD (1<<10) #define UTF8PROC_CHARBOUND (1<<11) #define UTF8PROC_LUMP (1<<12) #define UTF8PROC_STRIPMARK (1<<13) /* * Flags being regarded by several functions in the library: * NULLTERM: The given UTF-8 input is NULL terminated. * STABLE: Unicode Versioning Stability has to be respected. * COMPAT: Compatiblity decomposition * (i.e. formatting information is lost) * COMPOSE: Return a result with composed characters. * DECOMPOSE: Return a result with decomposed characters. * IGNORE: Strip "default ignorable characters" * REJECTNA: Return an error, if the input contains unassigned * code points. * NLF2LS: Indicating that NLF-sequences (LF, CRLF, CR, NEL) are * representing a line break, and should be converted to the * unicode character for line separation (LS). * NLF2PS: Indicating that NLF-sequences are representing a paragraph * break, and should be converted to the unicode character for * paragraph separation (PS). * NLF2LF: Indicating that the meaning of NLF-sequences is unknown. * STRIPCC: Strips and/or convers control characters. * NLF-sequences are transformed into space, except if one of * the NLF2LS/PS/LF options is given. * HorizontalTab (HT) and FormFeed (FF) are treated as a * NLF-sequence in this case. * All other control characters are simply removed. * CASEFOLD: Performs unicode case folding, to be able to do a * case-insensitive string comparison. * CHARBOUND: Inserts 0xFF bytes at the beginning of each sequence which * is representing a single grapheme cluster (see UAX#29). * LUMP: Lumps certain characters together * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-"). * (See lump.txt for details.) * If NLF2LF is set, this includes a transformation of * paragraph and line separators to ASCII line-feed (LF). * STRIPMARK: Strips all character markings * (non-spacing, spacing and enclosing) (i.e. accents) * NOTE: this option works only with COMPOSE or DECOMPOSE */ #define UTF8PROC_ERROR_NOMEM -1 #define UTF8PROC_ERROR_OVERFLOW -2 #define UTF8PROC_ERROR_INVALIDUTF8 -3 #define UTF8PROC_ERROR_NOTASSIGNED -4 #define UTF8PROC_ERROR_INVALIDOPTS -5 /* * Error codes being returned by almost all functions: * ERROR_NOMEM: Memory could not be allocated. * ERROR_OVERFLOW: The given string is too long to be processed. * ERROR_INVALIDUTF8: The given string is not a legal UTF-8 string. * ERROR_NOTASSIGNED: The REJECTNA flag was set, * and an unassigned code point was found. * ERROR_INVALIDOPTS: Invalid options have been used. */ typedef int16_t utf8proc_propval_t; typedef struct utf8proc_property_struct { utf8proc_propval_t category; utf8proc_propval_t combining_class; utf8proc_propval_t bidi_class; utf8proc_propval_t decomp_type; const int32_t *decomp_mapping; unsigned bidi_mirrored:1; int32_t uppercase_mapping; int32_t lowercase_mapping; int32_t titlecase_mapping; int32_t comb1st_index; int32_t comb2nd_index; unsigned comp_exclusion:1; unsigned ignorable:1; unsigned control_boundary:1; unsigned extend:1; const int32_t *casefold_mapping; } utf8proc_property_t; #define UTF8PROC_CATEGORY_LU 1 #define UTF8PROC_CATEGORY_LL 2 #define UTF8PROC_CATEGORY_LT 3 #define UTF8PROC_CATEGORY_LM 4 #define UTF8PROC_CATEGORY_LO 5 #define UTF8PROC_CATEGORY_MN 6 #define UTF8PROC_CATEGORY_MC 7 #define UTF8PROC_CATEGORY_ME 8 #define UTF8PROC_CATEGORY_ND 9 #define UTF8PROC_CATEGORY_NL 10 #define UTF8PROC_CATEGORY_NO 11 #define UTF8PROC_CATEGORY_PC 12 #define UTF8PROC_CATEGORY_PD 13 #define UTF8PROC_CATEGORY_PS 14 #define UTF8PROC_CATEGORY_PE 15 #define UTF8PROC_CATEGORY_PI 16 #define UTF8PROC_CATEGORY_PF 17 #define UTF8PROC_CATEGORY_PO 18 #define UTF8PROC_CATEGORY_SM 19 #define UTF8PROC_CATEGORY_SC 20 #define UTF8PROC_CATEGORY_SK 21 #define UTF8PROC_CATEGORY_SO 22 #define UTF8PROC_CATEGORY_ZS 23 #define UTF8PROC_CATEGORY_ZL 24 #define UTF8PROC_CATEGORY_ZP 25 #define UTF8PROC_CATEGORY_CC 26 #define UTF8PROC_CATEGORY_CF 27 #define UTF8PROC_CATEGORY_CS 28 #define UTF8PROC_CATEGORY_CO 29 #define UTF8PROC_CATEGORY_CN 30 #define UTF8PROC_BIDI_CLASS_L 1 #define UTF8PROC_BIDI_CLASS_LRE 2 #define UTF8PROC_BIDI_CLASS_LRO 3 #define UTF8PROC_BIDI_CLASS_R 4 #define UTF8PROC_BIDI_CLASS_AL 5 #define UTF8PROC_BIDI_CLASS_RLE 6 #define UTF8PROC_BIDI_CLASS_RLO 7 #define UTF8PROC_BIDI_CLASS_PDF 8 #define UTF8PROC_BIDI_CLASS_EN 9 #define UTF8PROC_BIDI_CLASS_ES 10 #define UTF8PROC_BIDI_CLASS_ET 11 #define UTF8PROC_BIDI_CLASS_AN 12 #define UTF8PROC_BIDI_CLASS_CS 13 #define UTF8PROC_BIDI_CLASS_NSM 14 #define UTF8PROC_BIDI_CLASS_BN 15 #define UTF8PROC_BIDI_CLASS_B 16 #define UTF8PROC_BIDI_CLASS_S 17 #define UTF8PROC_BIDI_CLASS_WS 18 #define UTF8PROC_BIDI_CLASS_ON 19 #define UTF8PROC_DECOMP_TYPE_FONT 1 #define UTF8PROC_DECOMP_TYPE_NOBREAK 2 #define UTF8PROC_DECOMP_TYPE_INITIAL 3 #define UTF8PROC_DECOMP_TYPE_MEDIAL 4 #define UTF8PROC_DECOMP_TYPE_FINAL 5 #define UTF8PROC_DECOMP_TYPE_ISOLATED 6 #define UTF8PROC_DECOMP_TYPE_CIRCLE 7 #define UTF8PROC_DECOMP_TYPE_SUPER 8 #define UTF8PROC_DECOMP_TYPE_SUB 9 #define UTF8PROC_DECOMP_TYPE_VERTICAL 10 #define UTF8PROC_DECOMP_TYPE_WIDE 11 #define UTF8PROC_DECOMP_TYPE_NARROW 12 #define UTF8PROC_DECOMP_TYPE_SMALL 13 #define UTF8PROC_DECOMP_TYPE_SQUARE 14 #define UTF8PROC_DECOMP_TYPE_FRACTION 15 #define UTF8PROC_DECOMP_TYPE_COMPAT 16 extern const int8_t utf8proc_utf8class[256]; const char *utf8proc_version(void); const char *utf8proc_errmsg(ssize_t errcode); /* * Returns a static error string for the given error code. */ ssize_t utf8proc_iterate(const uint8_t *str, ssize_t strlen, int32_t *dst); /* * Reads a single char from the UTF-8 sequence being pointed to by 'str'. * The maximum number of bytes read is 'strlen', unless 'strlen' is * negative. * If a valid unicode char could be read, it is stored in the variable * being pointed to by 'dst', otherwise that variable will be set to -1. * In case of success the number of bytes read is returned, otherwise a * negative error code is returned. */ bool utf8proc_codepoint_valid(int32_t uc); /* * Returns 1, if the given unicode code-point is valid, otherwise 0. */ ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst); /* * Encodes the unicode char with the code point 'uc' as an UTF-8 string in * the byte array being pointed to by 'dst'. This array has to be at least * 4 bytes long. * In case of success the number of bytes written is returned, * otherwise 0. * This function does not check if 'uc' is a valid unicode code point. */ const utf8proc_property_t *utf8proc_get_property(int32_t uc); /* * Returns a pointer to a (constant) struct containing information about * the unicode char with the given code point 'uc'. * If the character is not existent a pointer to a special struct is * returned, where 'category' is a NULL pointer. * WARNING: The parameter 'uc' has to be in the range of 0x0000 to * 0x10FFFF, otherwise the program might crash! */ ssize_t utf8proc_decompose_char( int32_t uc, int32_t *dst, ssize_t bufsize, int options, int *last_boundclass ); /* * Writes a decomposition of the unicode char 'uc' into the array being * pointed to by 'dst'. * Following flags in the 'options' field are regarded: * REJECTNA: an unassigned unicode code point leads to an error * IGNORE: "default ignorable" chars are stripped * CASEFOLD: unicode casefolding is applied * COMPAT: replace certain characters with their * compatibility decomposition * CHARBOUND: Inserts 0xFF bytes before each grapheme cluster * LUMP: lumps certain different characters together * STRIPMARK: removes all character marks * The pointer 'last_boundclass' has to point to an integer variable which * is storing the last character boundary class, if the CHARBOUND option * is used. * In case of success the number of chars written is returned, * in case of an error, a negative error code is returned. * If the number of written chars would be bigger than 'bufsize', * the buffer (up to 'bufsize') has inpredictable data, and the needed * buffer size is returned. * WARNING: The parameter 'uc' has to be in the range of 0x0000 to * 0x10FFFF, otherwise the program might crash! */ ssize_t utf8proc_decompose( const uint8_t *str, ssize_t strlen, int32_t *buffer, ssize_t bufsize, int options ); /* * Does the same as 'utf8proc_decompose_char', but acts on a whole UTF-8 * string, and orders the decomposed sequences correctly. * If the NULLTERM flag in 'options' is set, processing will be stopped, * when a NULL byte is encounted, otherwise 'strlen' bytes are processed. * The result in form of unicode code points is written into the buffer * being pointed to by 'buffer', having the length of 'bufsize' entries. * In case of success the number of chars written is returned, * in case of an error, a negative error code is returned. * If the number of written chars would be bigger than 'bufsize', * the buffer (up to 'bufsize') has inpredictable data, and the needed * buffer size is returned. */ ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options); /* * Reencodes the sequence of unicode characters given by the pointer * 'buffer' and 'length' as UTF-8. * The result is stored in the same memory area where the data is read. * Following flags in the 'options' field are regarded: * NLF2LS: converts LF, CRLF, CR and NEL into LS * NLF2PS: converts LF, CRLF, CR and NEL into PS * NLF2LF: converts LF, CRLF, CR and NEL into LF * STRIPCC: strips or converts all non-affected control characters * COMPOSE: tries to combine decomposed characters into composite * characters * STABLE: prohibits combining characters which would violate * the unicode versioning stability * In case of success the length of the resulting UTF-8 string is * returned, otherwise a negative error code is returned. * WARNING: The amount of free space being pointed to by 'buffer', has to * exceed the amount of the input data by one byte, and the * entries of the array pointed to by 'str' have to be in the * range of 0x0000 to 0x10FFFF, otherwise the program might * crash! */ ssize_t utf8proc_map( const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options ); /* * Maps the given UTF-8 string being pointed to by 'str' to a new UTF-8 * string, which is allocated dynamically, and afterwards pointed to by * the pointer being pointed to by 'dstptr'. * If the NULLTERM flag in the 'options' field is set, the length is * determined by a NULL terminator, otherwise the parameter 'strlen' is * evaluated to determine the string length, but in any case the result * will be NULL terminated (though it might contain NULL characters * before). Other flags in the 'options' field are passed to the functions * defined above, and regarded as described. * In case of success the length of the new string is returned, * otherwise a negative error code is returned. * NOTICE: The memory of the new UTF-8 string will have been allocated with * 'malloc', and has theirfore to be freed with 'free'. */ uint8_t *utf8proc_NFD(const uint8_t *str); uint8_t *utf8proc_NFC(const uint8_t *str); uint8_t *utf8proc_NFKD(const uint8_t *str); uint8_t *utf8proc_NFKC(const uint8_t *str); /* * Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC * normalized version of the null-terminated string 'str'. */ #ifdef __cplusplus } #endif #endif mriconvert/ConfigValues.h0000640000175000000620000000112012542632336015006 0ustar stevestaff/// ConfigValues.h /** Macros for config file entries. */ #ifndef CONFIG_VALUES_H #define CONFIG_VALUES_H #define CFG_raw "raw" #define CFG_skip "skip" #define CFG_split_subj "split_subj" #define CFG_split_dir "split_dir" #define CFG_dim "fourd" #define CFG_ho "ho" #define CFG_nii "nii" #define CFG_v16 "v16" #define CFG_rescale "rescale" #define CFG_lastdir _T("lastdir") #define CFG_dir _T("dir") #define CFG_framewidth _T("framewidth") #define CFG_frameheight _T("frameheight") #define CFG_frameposx _T("frameposx") #define CFG_frameposy _T("frameposy") #endif mriconvert/DicomTree.cpp0000640000175000000620000001660012542632322014633 0ustar stevestaff/// DicomTree.cpp /** */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include "SeriesHandler.h" #include "StringConvert.h" #include "DicomTree.h" using namespace jcs; /// /** */ DicomTreeCtrl::DicomTreeCtrl(wxWindow* parent, wxWindowID id, long more_styles) : jcsTreeCtrl(parent, id, wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT | wxSUNKEN_BORDER | more_styles, "Dicom series") { } /// /** */ DicomTreeCtrl::DicomTreeCtrl(wxWindow* parent, wxWindowID id) : jcsTreeCtrl(parent, id, wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT | wxSUNKEN_BORDER, "Dicom series") { } /// /** Adds a series. Heirarchy is Subject->Study->Series->File. In many cases, DICOM is encoded with Unicode. File systems typically use UTF-8. The wxStuff also uses UTF-8, so conversion from Unicode to UTF-8 is needed where the input data is Unicode-encoded. This is the reason for the various invocations of From8BitData below. \param series A pointer to the SeriesHandler for the data to be added. */ void DicomTreeCtrl::AddSeries(SeriesHandler* series) { // Processing for subject level of the heirarchy. std::string subject; if (!series->Find("PatientName", subject)) { subject = "no name"; } //std::cout << subject << std::endl; wxTreeItemId subjectTreeId; if (!mTreeMap.count(subject)) { //std::string itemText("Subject name: "); wxString itemText(_("Subject name: ")); itemText += wxString::From8BitData(subject.c_str()).wc_str(); //itemText += wxString(wxString::From8BitData(subject.c_str()).wc_str(), wxConvLocal); //std::cout << itemText << std::endl; //itemText.append(subject); subjectTreeId = AppendItem( GetRootItem(), itemText, folder_icon, -1, new jcsTreeItemData(subject, dtSUBJECT) ); SetItemImage( subjectTreeId, open_folder_icon, wxTreeItemIcon_Expanded ); mTreeMap[subject] = subjectTreeId; } else { subjectTreeId = mTreeMap[subject]; } // Processing for the study level of the heirarchy. std::string study_uid; //if (!series->Find("StudyInstanceUid", study_uid)) { if (!series->Find("StudyInstanceUID", study_uid)) { study_uid = "no study id"; } wxTreeItemId studyTreeId; if (!mTreeMap.count(study_uid)) { std::string number; //series->Find("StudyId", number); series->Find("StudyID", number); std::string desc; series->Find("StudyDescription", desc); std::string date; series->Find("StudyDate", date); wxString itemText(_("Study ")); // Use this form to compile with wxWidgets < 3.0.0 itemText += wxString(number.c_str(), *wxConvCurrent); // Use this form to compile with wxWidgets < 3.0.0 itemText += wxString(_(" ")); itemText += wxString(date.c_str(), *wxConvCurrent); itemText += wxString(_(" ")); itemText += wxString(desc.c_str(), *wxConvCurrent); /** wxString itemText("Study "); itemText += wxString(number); itemText += wxString(" "); itemText += wxString(date); itemText += wxString(" "); itemText += wxString(desc); **/ /** std::string itemText("Study "); itemText.append(number); itemText.append(" "); itemText.append(date); itemText.append(" "); itemText.append(desc); **/ studyTreeId = AppendItem( subjectTreeId, itemText, folder_icon, -1, new jcsTreeItemData(study_uid, dtSTUDY) ); SetItemImage( studyTreeId, open_folder_icon, wxTreeItemIcon_Expanded ); mTreeMap[study_uid] = studyTreeId; } else { studyTreeId = mTreeMap[study_uid]; } // Processing for the series level of the heirarchy. std::string series_uid = series->GetSeriesUid(); wxTreeItemId seriesTreeId; if (!mTreeMap.count(series_uid)) { std::string number; if (!series->Find("SeriesNumber", number)) { number = "0"; } number = itos(stoi(number)); std::string protocol; series->Find("ProtocolName", protocol); std::string desc; series->Find("SeriesDescription", desc); std::string date; series->Find("SeriesDate", date); std::string itemText("Series "); itemText.append(number); itemText.append(" "); itemText.append(date); itemText.append(" "); itemText.append(protocol); if (protocol != desc) { itemText.append(" "); itemText.append(desc); } seriesTreeId = AppendItem( studyTreeId, wxString(wxString::From8BitData(itemText.c_str()).wc_str(), wxConvLocal), folder_icon, -1, new jcsTreeItemData(series_uid, dtSERIES) ); SetItemImage( seriesTreeId, open_folder_icon, wxTreeItemIcon_Expanded ); mTreeMap[series_uid] = seriesTreeId; } else { seriesTreeId = mTreeMap[series_uid]; } CollapseAndReset(seriesTreeId); // Processing for each file in a series. // File names and paths are typically encoded with UTF-8, so // no From8BitData processing is needed here. std::vector names = series->GetFilenames(); std::vector::iterator it = names.begin(); while (it != names.end()) { AppendItem( seriesTreeId, wxString(it->c_str(), wxConvLocal), file_icon, -1, new jcsTreeItemData(*it, dtFILE) ); ++it; } } /// /** */ std::vector DicomTreeCtrl::GetChildSeries(wxTreeItemId branch) { std::vector v; jcsTreeItemData* item = (jcsTreeItemData*) GetItemData(branch); switch (item->GetItemType()) { case dtSERIES : v.push_back(item->GetUid()); break; case dtSTUDY : case dtSUBJECT : if (ItemHasChildren(branch)) { int n_children = GetChildrenCount(branch, false); wxTreeItemIdValue cookie; wxTreeItemId child = GetFirstChild(branch, cookie); std::vector v2 = GetChildSeries(child); v.insert(v.end(), v2.begin(), v2.end()); for (int i = 1; i < n_children; ++i) { child = GetNextChild(branch, cookie); v2 = GetChildSeries(child); v.insert(v.end(), v2.begin(), v2.end()); } } break; default : break; } return v; } /// /** */ std::vector DicomTreeCtrl::GetFilenames() { std::vector filenames; jcsTreeMap::iterator it = mTreeMap.begin(); jcsTreeMap::iterator end = mTreeMap.end(); while (it != end) { wxTreeItemId item = (*it).second; if (GetItemType(item) == dtFILE) { filenames.push_back(static_cast(GetItemText(item).mb_str(wxConvLocal))); } ++it; } return filenames; } /// /** */ std::vector DicomTreeCtrl::GetFilesInSeries(const wxTreeItemId item) { std::vector files; wxTreeItemId local_item = item; if (GetItemType(local_item) == dtFILE) { wxTreeItemId parent = GetItemParent(local_item); wxTreeItemIdValue cookie; local_item = GetFirstChild(parent, cookie); while (local_item.IsOk()) { files.push_back(GetItemText(local_item)); local_item = GetNextChild(parent, cookie); } } return files; } mriconvert/ValueRepresentations.h0000640000175000000620000002557312542632322016620 0ustar stevestaff/// ValueRepresentations.h /** The start of definitions for "intelligent" DICOM data values. Each VR in the DICOM standard has a corresponding class that can process an input stream to extract the value(s). */ #ifndef VALUEREPRESENTATIONS_H_ #define VALUEREPRESENTATIONS_H_ #include #include #include #include #include "DicomTag.h" //#include "DicomElementInstance.h" namespace jcs { //class DicomElementInstance; class DicomValue { public: DicomValue(wxUint32 vLength, wxUint8 transferSyntaxCode) : value_length(vLength), transferSyntaxCode(transferSyntaxCode) {} virtual ~DicomValue() {} wxUint8 transferSyntaxCode; wxUint32 value_length; std::vector values; wxString value; wxString first(); virtual void GetStrings(std::istream &in); wxInt16 EndianSwapInt16(wxInt16 value); wxInt32 EndianSwapInt32(wxInt32 value); wxUint16 EndianSwapUint16(wxUint16 value); wxUint32 EndianSwapUint32(wxUint32 value); wxUint64 EndianSwapUint64(wxUint64 value); bool operator== (DicomValue &dv); friend std::ostream &operator<<(std::ostream &out, DicomValue &ve); }; // Application Entity class VR_AE : public DicomValue { public: VR_AE(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_AE &ae); }; // Age String class VR_AS : public DicomValue { public: VR_AS(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_AS &as); }; // Attribute Tag class VR_AT : public DicomValue { public: VR_AT(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} DicomTag val; std::vector values; friend std::istream &operator>>(std::istream &in, VR_AT &at); }; // Code String class VR_CS : public DicomValue { public: VR_CS(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_CS &cs); }; // Date class VR_DA : public DicomValue { public: VR_DA(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_DA &da); }; // Decimal String class VR_DS : public DicomValue { public: VR_DS(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_DS &ds); }; // Date Time class VR_DT : public DicomValue { public: VR_DT(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_DT &dt); }; // Floating Point Single class VR_FL : public DicomValue { public: VR_FL(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_FL &fl); friend std::ostream &operator<<(std::istream &out, VR_FL &fl); }; // Floating Point Double class VR_FD : public DicomValue { public: VR_FD(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_FD &fd); friend std::ostream &operator<<(std::istream &out, VR_FD &fd); }; // Integer String class VR_IS : public DicomValue { public: VR_IS(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_IS &is); }; // Long String class VR_LO : public DicomValue { public: VR_LO(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_LO &lo); }; // Long Text class VR_LT : public DicomValue { public: VR_LT(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_LT <); }; // Other Byte String class VR_OB : public DicomValue { public: VR_OB(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_OB &ob); }; // Other Float String class VR_OF : public DicomValue { public: VR_OF(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_OF &of); friend std::ostream &operator<<(std::istream &out, VR_OF &of); }; // Other Word String class VR_OW : public DicomValue { public: VR_OW(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_OW &ow); friend std::ostream &operator<<(std::istream &out, VR_OW &ow); }; // Person Name class VR_PN : public DicomValue { public: VR_PN(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_PN &pn); }; // Short String class VR_SH : public DicomValue { public: VR_SH(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_SH &sh); }; // Signed Long class VR_SL : public DicomValue { public: VR_SL(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_SL &sl); friend std::ostream &operator<<(std::istream &out, VR_SL &sl); }; // Sequence of Items class VR_SQ : public DicomValue { public: VR_SQ(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_SQ &sq); }; // Signed Short class VR_SS : public DicomValue { public: VR_SS(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_SS &ss); friend std::ostream &operator<<(std::istream &out, VR_SS &ss); }; // Short Text class VR_ST : public DicomValue { public: VR_ST(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_ST &st); }; // Time class VR_TM : public DicomValue { public: VR_TM(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_TM &tm); }; // Unique Identifier (UID) class VR_UI : public DicomValue { public: VR_UI(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_UI &ui); }; // Unsigned Long class VR_UL : public DicomValue { public: VR_UL(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_UL &ul); friend std::ostream &operator<<(std::istream &out, VR_UL &ul); }; // Unknown class VR_UN : public DicomValue { public: VR_UN(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_UN &un); }; // Unsigned Short class VR_US : public DicomValue { public: VR_US(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} std::vector values; friend std::istream &operator>>(std::istream &in, VR_US &us); friend std::ostream &operator<<(std::istream &out, VR_US &us); }; // Unlimited Text class VR_UT : public DicomValue { public: VR_UT(wxUint32 vLength, wxUint8 vtransferSyntaxCode) : DicomValue(vLength, transferSyntaxCode) {} friend std::istream &operator>>(std::istream &in, VR_UT &ut); }; std::istream & operator>> (std::istream &in, VR_AE &at); std::istream & operator>> (std::istream &in, VR_AS &as); std::istream & operator>> (std::istream &in, VR_AT &at); std::istream & operator>> (std::istream &in, VR_CS &at); std::istream & operator>> (std::istream &in, VR_DA &at); std::istream & operator>> (std::istream &in, VR_DS &at); std::istream & operator>> (std::istream &in, VR_DT &at); std::istream & operator>> (std::istream &in, VR_FL &fl); std::ostream & operator<< (std::ostream &out, VR_FL &fl); std::istream & operator>> (std::istream &in, VR_FD &fd); std::ostream & operator<< (std::ostream &out, VR_FD &fd); std::istream & operator>> (std::istream &in, VR_IS &at); std::istream & operator>> (std::istream &in, VR_LO &at); std::istream & operator>> (std::istream &in, VR_LT &at); std::istream & operator>> (std::istream &in, VR_OB &at); std::istream & operator>> (std::istream &in, VR_OF &of); std::ostream & operator<< (std::ostream &out, VR_OF &of); std::istream & operator>> (std::istream &in, VR_OW &ow); std::ostream & operator<< (std::ostream &out, VR_OW &ow); std::istream & operator>> (std::istream &in, VR_PN &at); std::istream & operator>> (std::istream &in, VR_SH &at); std::istream & operator>> (std::istream &in, VR_SQ &at); std::istream & operator>> (std::istream &in, VR_SL &sl); std::ostream & operator<< (std::ostream &out, VR_SL &sl); std::istream & operator>> (std::istream &in, VR_SS &ss); std::ostream & operator<< (std::ostream &out, VR_SS &ss); std::istream & operator>> (std::istream &in, VR_ST &at); std::istream & operator>> (std::istream &in, VR_TM &at); std::istream & operator>> (std::istream &in, VR_UI &at); std::istream & operator>> (std::istream &in, VR_UL &ul); std::ostream & operator<< (std::ostream &out, VR_UL &ul); std::istream & operator>> (std::istream &in, VR_UN &at); std::istream & operator>> (std::istream &in, VR_US &us); std::ostream & operator<< (std::ostream &out, VR_US &us); std::istream & operator>> (std::istream &in, VR_UT &at); } #endif mriconvert/NewMetaOutputter.h0000640000175000000620000000637112542632311015723 0ustar stevestaff/// NewMetaOutputter.h /** */ #ifndef NEW_META_OUTPUTTER_H_ #define NEW_META_OUTPUTTER_H_ #include #include #include "Basic3DOutputter.h" #include "BasicVolumeFormat.h" namespace jcs { struct NewMetaHeader; class NewMetaOutputter : public Basic3DOutputter { public : NewMetaOutputter(); virtual int ConvertSeries(SeriesHandler* handler); bool SaveHeaderOnly() const { return saveHeaderOnly; } void SetSaveHeader(bool value); std::vector fields; void SetOption(const std::string& name, bool value); virtual void UpdateOutputForSeries(SeriesHandler* handler); protected: virtual BasicVolumeFormat* GetOutputVolume(const char* file); private: static Options CreateOptions(); bool saveHeaderOnly; }; template class MetaConversion: public Basic3DConversion { public: MetaConversion(Basic3DOutputter* outputter, SeriesHandler* handler); ~MetaConversion(); NewMetaHeader* GetHeader() { return mHeader; } void Convert(); protected: virtual void GetHeaderForSeries(); virtual void CompleteHeaderForVolume(std::pair > volPair); private: NewMetaHeader* mHeader; }; /** template void MetaConversion::WriteGradientFiles() { GradientInfo info = this->mHandler->GetGradientInfo(); Normalize(info); if (info.values.size() == 0) { return; } std::string key = this->mHandler->GetSeriesUid() + this->mOutputter->bvals_postfix; wxFileName fileName = this->mOutputter->mOutputList.GetFullFileName(key); if (fileName.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } wxFileName::Mkdir(fileName.GetPath(wxPATH_GET_VOLUME), 0777, wxPATH_MKDIR_FULL); std::ofstream output; output.open(fileName.GetFullPath()); //.mb_str(wxConvLocal)); for (std::vector::iterator it = info.values.begin(); it != info.values.end(); ++it) { output << *it << " "; } output << std::endl; output.close(); key = this->mHandler->GetSeriesUid() + this->mOutputter->bvecs_postfix; fileName = this->mOutputter->mOutputList.GetFullFileName(key); if (fileName.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } output.open(fileName.GetFullPath()); //.mb_str(wxConvLocal)); { std::vector::iterator it = info.xGrads.begin(); std::vector::iterator it_end != info.xGrads.end(); for (; it != it_end; ++it) { output << *it << " "; } output << std::endl; } { std::vector::iterator it = info.yGrads.begin(); std::vector::iterator it_end != info.yGrads.end(); for (; it != it_end; ++it) { if (*it == 0) { output << (*it) << " "; } else { output << *it << " "; } } output << std::endl; } for (std::vector::iterator it = info.zGrads.begin(); it != info.zGrads.end(); ++it) { output << *it << " "; } output << std::endl; output.close(); } **/ } #endif mriconvert/DicomTag.cpp0000640000175000000620000000413312542632311014443 0ustar stevestaff/// DicomTag.cpp /** */ #include "DicomTag.h" using namespace jcs; /// /** DicomTags are equal iff both group numbers and element numbers are equal. */ bool DicomTag::operator== (const DicomTag& rhs) const { return((group == rhs.group) && (element == rhs.element)); } /// /** DicomTags are not equal if the object references are not equal. This is not the same as for the equality operator, a future implementation in a better world may change this behavior. */ bool DicomTag::operator!= (const DicomTag& rhs) const { return !(*this == rhs); } /// /** A DicomTag is less than another DicomTag if its group number is less than the other's group number. If group numbers are equal, then less than is determined by the element numbers. */ bool DicomTag::operator< (const DicomTag& rhs) const { return((group < rhs.group) || ((group == rhs.group) && (element < rhs.element))); } /// /** Same as with < operator, but with opposite sense. */ bool DicomTag::operator> (const DicomTag& rhs) const { return((group > rhs.group) || ((group == rhs.group) && (element > rhs.element))); } /// /** Read DicomTag from an input stream. Uses istream::in because stream input operator does not stop after reading sizeof(dt.group) (sizeof(wxUint16)) on its own. */ std::istream & jcs::operator>> (std::istream &in, DicomTag &dt) { in.read((char *)&(dt.group), sizeof(dt.group)); in.read((char *)&(dt.element), sizeof(dt.element)); if (dt.transferSyntaxCode == BEE_CODE) { wxUINT16_SWAP_ON_LE(dt.group); wxUINT16_SWAP_ON_LE(dt.element); } else { wxUINT16_SWAP_ON_BE(dt.group); wxUINT16_SWAP_ON_BE(dt.element); } return in; } /// /** This is how we stream out a DicomTag. Form should be like '(xxxx,xxxx)', where xxxx is a hexadecimal number. */ std::ostream & jcs::operator<< (std::ostream& out, const DicomTag& rhs) { out << std::hex << '('; out.fill('0'); out.width(4); out << rhs.group << ','; out.width(4); out << rhs.element << ')'; out << std::dec; return out; } mriconvert/NiftiVolume.cpp0000640000175000000620000001400512542632317015222 0ustar stevestaff/// NiftiVolume.cpp /** */ #include "NiftiVolume.h" using namespace jcs; /// /** */ void NiftiHeader::InitHeader() { memset(&hdr, 0, sizeof(hdr)); memset(&extender, 0, sizeof(extender)); } /// /** */ void NiftiHeader::SetDimInfo(char freq_dim, char phase_dim, char slice_dim) { hdr.dim_info = (freq_dim & 0x03) | ((phase_dim & 0x03) << 2) | ((slice_dim & 0x03) << 4); } /// /** */ NiftiVolume::NiftiVolume(const char* filename, const char* header_extension, const char* raw_extension) : BasicVolumeFormat(filename, header_extension, raw_extension), mByteOrder(aLITTLE_ENDIAN) { mInitHeader(); } /// /** */ NiftiVolume::~NiftiVolume() { } /// /** */ void NiftiVolume::WriteHeader(Basic3DHeader* header) { NiftiHeader* nifti_header = dynamic_cast(header); mHeader = *nifti_header; if (mWriteHeaderFile() == 1) { if (verbose && !quiet) { std::cout << "Wrote " << mFileName.GetFullPath() << std::endl; } } } /// /** */ int NiftiVolume::mWriteHeaderFile() { if (!mOpenHeaderFile(std::ios::out|std::ios::binary)) { wxLogError(_T("Cannot create header file %s"), mFileName.GetFullName().c_str()); return 0; } mHeaderFile.write(reinterpret_cast (&mHeader.hdr.sizeof_hdr), sizeof(mHeader.hdr.sizeof_hdr)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.data_type), sizeof(mHeader.hdr.data_type)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.db_name), sizeof(mHeader.hdr.db_name)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.extents), sizeof(mHeader.hdr.extents)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.session_error), sizeof(mHeader.hdr.session_error)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.regular), sizeof(mHeader.hdr.regular)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.dim_info), sizeof(mHeader.hdr.dim_info)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.dim), sizeof(mHeader.hdr.dim)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.intent_p1), sizeof(mHeader.hdr.intent_p1)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.intent_p2), sizeof(mHeader.hdr.intent_p2)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.intent_p3), sizeof(mHeader.hdr.intent_p3)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.intent_code), sizeof(mHeader.hdr.intent_code)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.datatype), sizeof(mHeader.hdr.datatype)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.bitpix), sizeof(mHeader.hdr.bitpix)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.slice_start), sizeof(mHeader.hdr.slice_start)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.pixdim), sizeof(mHeader.hdr.pixdim)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.vox_offset), sizeof(mHeader.hdr.vox_offset)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.scl_slope), sizeof(mHeader.hdr.scl_slope)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.scl_inter), sizeof(mHeader.hdr.scl_inter)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.slice_end), sizeof(mHeader.hdr.slice_end)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.slice_code), sizeof(mHeader.hdr.slice_code)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.xyzt_units), sizeof(mHeader.hdr.xyzt_units)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.cal_max), sizeof(mHeader.hdr.cal_max)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.cal_min), sizeof(mHeader.hdr.cal_min)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.slice_duration), sizeof(mHeader.hdr.slice_duration)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.toffset), sizeof(mHeader.hdr.toffset)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.glmax), sizeof(mHeader.hdr.glmax)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.glmin), sizeof(mHeader.hdr.glmin)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.descrip), sizeof(mHeader.hdr.descrip)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.aux_file), sizeof(mHeader.hdr.aux_file)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.qform_code), sizeof(mHeader.hdr.qform_code)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.sform_code), sizeof(mHeader.hdr.sform_code)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.quatern_b), sizeof(mHeader.hdr.quatern_b)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.quatern_c), sizeof(mHeader.hdr.quatern_c)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.quatern_d), sizeof(mHeader.hdr.quatern_d)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.qoffset_x), sizeof(mHeader.hdr.qoffset_x)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.qoffset_y), sizeof(mHeader.hdr.qoffset_y)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.qoffset_z), sizeof(mHeader.hdr.qoffset_z)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.srow_x), sizeof(mHeader.hdr.srow_x)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.srow_y), sizeof(mHeader.hdr.srow_y)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.srow_z), sizeof(mHeader.hdr.srow_z)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.intent_name), sizeof(mHeader.hdr.intent_name)); mHeaderFile.write(reinterpret_cast (&mHeader.hdr.magic), sizeof(mHeader.hdr.magic)); // write extension if necessary if (strcmp(mHeader.hdr.magic,"n+1") == 0) { mHeaderFile.write(mHeader.extender.extension, sizeof(mHeader.extender.extension)); } mCloseHeaderFile(); return 1; } mriconvert/MRIConvert.rc0000640000175000000620000000703212542632332014572 0ustar stevestaff// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "windows.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Dialog // WXRESIZEABLEDIALOG DIALOG 34, 22, 144, 75 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME BEGIN END WXNOCAPTIONDIALOG DIALOG 34, 22, 144, 75 STYLE WS_POPUP BEGIN END WXCAPTIONDIALOG DIALOG 34, 22, 144, 75 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dummy dialog" BEGIN END ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. MRICONVERT ICON "MRIConvert.ico" ///////////////////////////////////////////////////////////////////////////// // // Menu // WXWINDOWMENU MENU BEGIN POPUP "&Window" BEGIN MENUITEM "&Cascade", 4002 MENUITEM "Tile &Horizontally", 4001 MENUITEM "Tile &Vertically", 4005 MENUITEM "", 65535 MENUITEM "&Arrange Icons", 4003 MENUITEM "&Next", 4004 END END ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 2,0,0,27 PRODUCTVERSION 2,0,0,27 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Lewis Center for Neuroimaging, University of Oregon" VALUE "FileDescription", "MRIConvert Application" VALUE "FileVersion", "2, 0, 0, 27" VALUE "InternalName", "MRIConvert" VALUE "LegalCopyright", "Copyright (C) 2001" VALUE "OriginalFilename", "MRIConvert.exe" VALUE "ProductName", " MRIConvert Application" VALUE "ProductVersion", "2, 0, 0, 27" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED mriconvert/McVerter.cpp0000640000175000000620000002606412542632332014515 0ustar stevestaff/// McVerter.cpp /** The command-line version of MRIConvert. */ #include "McVerter.h" // Macro in place of _() since std::cerr does not like utf16 or utf32. #define _C(string) string //wxString(_(string)).utf8_str() using namespace jcs; // This permits cout to handle a vector. template std::ostream& operator<<(std::ostream& os, const std::vector& v) { copy(v.begin(), v.end(), std::ostream_iterator(std::cerr, " ")); return os; } int main(int argc, char** argv) { // First make sure we can use wx stuff. wxInitializer initializer(0, (wxChar**) NULL); if ( !initializer ) { std::cerr << "Failed to initialize the wxWidgets library, aborting."; return EXIT_NO_WX; } // Localization steps wxLocale m_locale; if ( !m_locale.Init() ) { wxLogError(_T("This language is not supported by the system.")); } // Development only, distribution should install in standard location. //wxLocale::AddCatalogLookupPathPrefix(_T("l10n")); // Initialize the catalogs we'll be using m_locale.AddCatalog(_T("mriconvert")); // Controlling variables. bool showVersion = false; bool splitSubject = false; bool splitDir = false; int outputDimension = 3; bool headerOnly = false; bool niiOutput = false; bool v16Output = false; bool rescaleData = false; bool usePatientId = false; long skipVolumes = 0; wxString matchSeries = ""; wxString fnFormat = ""; wxString outputDir = ""; wxString outputFormat = ""; std::vector inputFiles; /**** 20131201cdt Revisiting the wxCmdLineParser, it appears that it does not crash. Or, the sample code is correct for version 3.0.0. */ static const wxCmdLineEntryDesc cmdLineDesc[] = { { wxCMD_LINE_SWITCH, "h", "help", _C("Show this help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, { wxCMD_LINE_OPTION, "o", "output", _C("Output directory for converted files"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_OPTION_MANDATORY }, { wxCMD_LINE_OPTION, "f", "format", _C("Output format: fsl, spm, meta, nifti, analyze, or bv."), wxCMD_LINE_VAL_STRING, wxCMD_LINE_OPTION_MANDATORY }, { wxCMD_LINE_SWITCH, "v", "verbose", _C("Verbose mode") }, { wxCMD_LINE_SWITCH, "q", "quiet", _C("Quiet mode") }, { wxCMD_LINE_SWITCH, "V", "version", _C("Version information") }, { wxCMD_LINE_SWITCH, "j", "split_subj", _C("Save each subject to a separate directory") }, { wxCMD_LINE_SWITCH, "x", "split_dir", _C("Save each series to a separate directory") }, { wxCMD_LINE_SWITCH, "d", "fourd", _C("Save output volumes as 4D files") }, { wxCMD_LINE_SWITCH, "a", "ho", _C("Save header only (metaimage only)") }, { wxCMD_LINE_SWITCH, "n", "nii", _C("Save files as .nii (nifti/fsl only)") }, { wxCMD_LINE_SWITCH, "b", "v16", _C("Save .v16 files (BrainVoyager only)") }, { wxCMD_LINE_SWITCH, "r", "rescale", _C("Apply rescale slope and intercept to data") }, { wxCMD_LINE_SWITCH, "u", "patientid", _C("Use patient id instead of patient name for output file") }, { wxCMD_LINE_OPTION, "s", "skip", _C("Skip first 'arg' volumes") }, { wxCMD_LINE_OPTION, "m", "match", _C("Only convert files whose series descriptions include this string") }, { wxCMD_LINE_OPTION, "F", "fnformat", "Use this format for name of output file: \n\ format = {format element} ;\n\ some text = {filesystem-legal characters} ;\n\ format element = {some text} , {\"%\" \"PN\" | \"PI\" | \"SD\" | \"ST\" | \"SI\" | \"TD\" | \"SN\" | \"SQ\" | \"PR\" | \"RD\"} , {some text} ;\n\ or \n\ format = {\"+\" | \"-\" , \ \"PatientName\" | \ \"PatientId\" | \ \"SeriesDate\" | \ \"SeriesTime\" | \ \"StudyId\" | \ \"StudyDescription\" | \ \"SeriesNumber\" | \ \"SequenceName\" | \ \"ProtocolName\" | \ \"SeriesDescription\"" }, { wxCMD_LINE_PARAM, NULL, NULL, _C("Input directory or file(s)"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE }, { wxCMD_LINE_NONE } }; wxCmdLineParser parser(cmdLineDesc, argc, argv); int parseResult = parser.Parse(false); switch ( parseResult ) { case -1: // help was given, terminating parser.Usage(); break; case 0: // everything is ok; proceed break; default: break; } showVersion = parser.Found("V"); if (parser.Found("o", &outputDir)) {} if (parser.Found("f", &outputFormat)) {} verbose = parser.Found("v"); quiet = parser.Found("q"); splitSubject = parser.Found("j"); splitDir = parser.Found("x"); outputDimension = parser.Found("d") ? 4 : 3; headerOnly = parser.Found("a"); niiOutput = parser.Found("n"); v16Output = parser.Found("b"); rescaleData = parser.Found("r"); usePatientId = parser.Found("u"); if (!parser.Found("s", &skipVolumes)) { skipVolumes = 0; } if (!parser.Found("m", &matchSeries)) { matchSeries = ""; } if (parser.Found("F", &fnFormat)) {} for (unsigned int i = 0; i < parser.GetParamCount(); ++i) { inputFiles.push_back(parser.GetParam(i)); } // Known bail-out cases. // Version info requested. if (showVersion) { std::cout << "mcverter " << _C(VERSION_STRING) << std::endl; return EXIT_NO_PROCESSING; } // Help requested. if (parseResult == -1) { return EXIT_NO_PROCESSING; } // Some kind of argument error. if (parseResult > 0) { return EXIT_ARGUMENT_ERROR; } // No input files or directories were given. if (inputFiles.begin() == inputFiles.end()) { return EXIT_NO_INPUT_SPECIFIED; } // Selector for output format. int found = wxNOT_FOUND; int format_type = 0; for (; format_type < OutputFactory::GetNumberOfTypes(); ++format_type) { found = outputFormat.Find(wxString(OutputFactory::GetShortDescription(format_type), wxConvLocal)); if (found != wxNOT_FOUND) { break; } } if (found == wxNOT_FOUND) { // Get the list of permitted output formats. wxString allowed_formats_string; allowed_formats_string.append(_C("Available formats: ")); int type = 0; for (; type < (OutputFactory::GetNumberOfTypes() - 1); ++type) { allowed_formats_string.append(wxString(OutputFactory::GetShortDescription(type), wxConvLocal)); allowed_formats_string.append(_T(", ")); } allowed_formats_string.append(wxString(OutputFactory::GetShortDescription(type), wxConvLocal)); std::cerr << _C("Invalid format type: ") << outputFormat.utf8_str() << std::endl; std::cerr << allowed_formats_string.utf8_str() << std::endl; return EXIT_ARGUMENT_ERROR; } // Selector for output directory. if (!wxDir::Exists(outputDir)) { if (!wxFileName::Mkdir(outputDir, 0777, wxPATH_MKDIR_FULL)) { std::cerr << _C("Unable to create directory: ") << outputDir << std::endl; return EXIT_PERMISSION_ERROR; } if (verbose && !quiet) { std::cout << _C("Created directory ") << outputDir << std::endl; } } // We know enough to create our converter and outputter. Converter* converter = new Converter(format_type); OutputterBase* outputter = converter->GetOutputter(); outputter->SetOption("skip", static_cast (skipVolumes)); outputter->mOutputList.rootDir = outputDir; outputter->SetOption("split_subj", splitSubject); outputter->SetOption("split_dir", splitDir); outputter->SetOption("dim", outputDimension); outputter->SetOption("ho", headerOnly); outputter->SetOption("nii", niiOutput); outputter->SetOption("v16", v16Output); outputter->SetOption("rescale", rescaleData); // Handle request for using PatientId rather than PatientName. if (usePatientId) { outputter->defaultNameFields[OutputterBase::PatientName].value = false; outputter->defaultNameFields[OutputterBase::PatientId].value = true; } // Handle request for alternate output filename format. // Replace any spaces with underscore. Maybe filter for filesystem-illegal characters. if (fnFormat.length() > 0) { if (fnFormat.StartsWith("+") || fnFormat.StartsWith("-")) { // std::string stdfnformat(fnFormat.mb_str()); OutputterBase::FieldMap::iterator fm_it = outputter->defaultNameFields.begin(); OutputterBase::FieldMap::iterator fm_it_end = outputter->defaultNameFields.end(); for (; fm_it != fm_it_end; ++fm_it) { // If user is requesting alternate format, turn each element off until we // know better. fm_it->second.value = false; // if (stdfnformat.find("+" + fm_it->second.name) != -1) { if (fnFormat.find("+" + fm_it->second.name) != std::string::npos) { fm_it->second.value = true; } // if (stdfnformat.find("-" + fm_it->second.name) != -1) { if (fnFormat.find("-" + fm_it->second.name) != std::string::npos) { fm_it->second.value = false; } } } else { outputter->SetFlexFormat(true); wxStringTokenizer tokenizer(fnFormat, "%"); wxString token, rest; OutputterBase::FieldMap::iterator fm_it, fm_it_end; while (tokenizer.HasMoreTokens()) { bool lookupToken = false; token = tokenizer.GetNextToken(); fm_it = outputter->defaultNameFields.begin(); fm_it_end = outputter->defaultNameFields.end(); for (; fm_it != fm_it_end; ++fm_it) { if (token.StartsWith(fm_it->second.abbr, &rest)) { lookupToken = true; outputter->fnAppendComponent(fm_it->second.abbr); outputter->fnAppendComponent(rest); break; } } if (!lookupToken) { outputter->fnAppendComponent(token); } } } } // We've processed all options and switches, // now add the requested files. if (verbose && !quiet) { std::cout << _C("Adding files...") << std::endl; } std::vector::iterator it = inputFiles.begin(); std::vector::iterator it_end = inputFiles.end(); for (; it != it_end; ++it) { wxFileName filename(*it); if (filename.FileExists()) { converter->AddFile(filename.GetFullPath(), matchSeries); } else { if (filename.DirExists()) { wxArrayString files; wxDir::GetAllFiles(filename.GetFullPath(), &files); for (unsigned int i = 0; i < files.GetCount(); ++i) { converter->AddFile(files.Item(i), matchSeries); } } else { std::cerr << _C("File or directory ") << *it << _C(" not found.") << std::endl; return EXIT_NO_INPUT_SPECIFIED; } } } if (verbose && !quiet) { MessageList::iterator ml_it = converter->messages.begin(); MessageList::iterator ml_it_end = converter->messages.end(); for (; ml_it != ml_it_end; ++ml_it) { Message::iterator it = ml_it->begin(); Message::iterator it_end = ml_it->end(); for (; it != it_end; ++it) { std::cout << it->mb_str(wxConvLocal) << " "; } std::cout << std::endl; } } converter->messages.clear(); converter->UpdateAllOutput(); if (verbose && !quiet) { std::cout << _C("Converting...") << std::endl; } // Let the real work begin. converter->ConvertAll(); if (verbose && !quiet) { std::cout << _C("Finished") << std::endl; } delete converter; return EXIT_SUCCESS; } mriconvert/DicomFile.txx0000640000175000000620000001126512542632314014657 0ustar stevestaff/// DicomFile.txx /** Template methods of DicomFile class. */ #ifndef DICOMFILE_TXX_ #define DICOMFILE_TXX_ namespace jcs { /// Find dicom element, convert to value of type T. /** find \param d A DicomElement. \param rValue A reference to the target data storage area. \return 0 if 'd' is not found. The result of method mReadValue otherwise. */ template int DicomFile::Find(DicomElement d, T& rValue) { if (!mInputFile.good()) { mInputFile.clear(); } if (!FindElement(d, mInputFile)) { return 0; } mInputFile.seekg(- static_cast(d.value_length), std::ios::cur); return mReadValue(d, rValue, mInputFile); } /// /** \param s A string to seek, generally the accepted name of a DICOM element as defined in one of the Dictionary classes. \param rValue A reference to the target data storage area. \return The result of method Find. */ // Find dicom element using string from dicom dict. template int DicomFile::Find(const std::string& s, T& rValue) { return Find(mDicom->Lookup(s), rValue); } /// /** */ template int DicomFile::FindInStream(std::istream& input, DicomElement d, T& rValue) { if (!input.good()) { input.clear(); } if (!FindElement(d, input)) { return 0; } input.seekg(- static_cast(d.value_length), std::ios::cur); int retval = mReadValue(d, rValue, input); return retval; } /// /** Retrieve data_length bytes of pixel data. It's up to the caller to send correct type and data_length! For multi-frame data, retrieves just one frame. Frames are numbered from 0. Will rescaling according to slope and intercept. NOTE: This should support BitsAllocated, BitsStored and HighBit calculations. \param data A reference to the receiving vector. \param data_length The length of data to retrieve, in bytes. \param slope The rescale slope. \param intercept The rescale intercept. \param frame The index of the frame to retrieve. \return 1 */ template int DicomFile::PixelData(std::vector& data, std::streamsize data_length, double slope, double intercept, int frame) { if (!mInputFile.is_open()) { return 0; } mInputFile.clear(); // Go to start of pixel data and skip to requested frame. // Frames are indexed 0-based. mInputFile.seekg(GetPixelDataStart()); mInputFile.seekg(data_length * frame, std::ios::cur); data.resize(data_length/sizeof(T)); mInputFile.read(reinterpret_cast(&data.front()), data_length); // This test is not mathematically necessary, but saves a do-nothing // iteration through the data. // if ((slope != 1) || (intercept != 0)) { // for (typename std::vector::iterator it = data.begin(); it != data.end(); ++it) { // Casting avoids compiler warnings. // *it = static_cast(static_cast(*it) * slope + intercept); // } // } return 1; } /// /** alt version with buffer, used for rgb image */ template int DicomFile::PixelData(T* data, std::streamsize data_length) { if (!mInputFile.is_open()) { return 0; } mInputFile.clear(); mInputFile.seekg(mBeginning); DicomElement element; mReadNextElement(element, mInputFile); while ((mInputFile.good()) && (element.tag != Tag("PixelData"))) { mReadNextElement(element, mInputFile); } mInputFile.seekg(-data_length, std::ios::cur); mInputFile.read(reinterpret_cast(data), data_length); return 1; } /// /** Reads next value matching the vr of 'd' from 'input', sets 'rValue' to the first string found there. The main logic of all Find methods. \param d A DicomElement instance. \param rValue Reference to destination data element. \param input Input stream from which to read. \return 1 on success, 0 on failed input or zero-length value_length. */ template int DicomFile::mReadValue(DicomElement d, T& rValue, std::istream& input) { if (!input.good() || (d.value_length == 0)) { return 0; } std::vector v; if (ReadMap.count(d.vr)) { v = ReadMap[d.vr](input, d.value_length); } else { v = ReadMap["UN"](input, d.value_length); } // remove leading spaces v.front().erase(0, v.front().find_first_not_of(' ')); std::stringstream ss; ss << v.front(); ss >> rValue; return 1; } } #endif mriconvert/Dictionary.h0000640000175000000620000000565012542632333014537 0ustar stevestaff/// Dictionary.h /** Provides a way to look up DICOM Element parameters by Tag value. */ #ifndef DICTIONARY_H_ #define DICTIONARY_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DicomTag.h" #include "DicomElement.h" #define LEI_UID "1.2.840.10008.1.2" #define LEE_UID "1.2.840.10008.1.2.1" #define BEE_UID "1.2.840.10008.1.2.2" namespace jcs { enum { LEI_CODE, LEE_CODE, BEE_CODE }; const wxUint32 UNDEFINED = 0xFFFFFFFF; // Undefined value length const std::string fnDicom = "dicom"; const std::string fnExcite = "excite"; const std::string fnNumaris = "numaris"; const std::string fnPhilips = "philips_mr"; /// /** Top-level class for various DICOM dictionaries. */ class Dictionary { public: const DicomElement Lookup(const DicomTag& tag) const; const DicomElement Lookup(const std::string& desc) const; std::vector TagList() const; protected: Dictionary(const std::string& dname); Dictionary& operator= (const Dictionary&); private: typedef std::map TagMap; typedef std::map StringMap; std::string mDictionaryName; TagMap mTagMap; StringMap mStringMap; DicomElement NULL_ENTRY; void mAddEntry(const DicomElement& e); }; /// Minimum DICOM definitions. class Dicom_Dictionary : public Dictionary { public: /// Self-instantiator. static Dictionary* Instance() { static Dicom_Dictionary inst; return &inst; } protected: Dicom_Dictionary() : Dictionary(fnDicom) {} }; /// Adds to Dicom_Dictionary field definitions. class Numaris_Dictionary : public Dictionary { public: /// Self-instantiator. static Dictionary* Instance() { static Numaris_Dictionary inst; return &inst; } protected: Numaris_Dictionary() : Dictionary(fnNumaris) {} }; /// Adds to Dicom_Dictionary field definitions. class Excite_Dictionary : public Dictionary { public: /// Self-instantiator. static Dictionary* Instance() { static Excite_Dictionary inst; return &inst; } protected: Excite_Dictionary() : Dictionary(fnExcite) {} }; /// Adds to Dicom_Dictionary field definitions. class PhilipsMr_Dictionary : public Dictionary { public: /// Self-instantiator. static Dictionary* Instance() { static PhilipsMr_Dictionary inst; return &inst; } protected: PhilipsMr_Dictionary() : Dictionary(fnPhilips) {} }; DicomTag Tag(const std::string& s, const Dictionary* dict = Dicom_Dictionary::Instance()); } #endif mriconvert/NewSpmOutputter.cpp0000640000175000000620000001245112542632322016125 0ustar stevestaff/// NewSpmOutputter.cpp /** */ #include #include #include "SeriesHandler.h" #include "NewSpmVolume.h" #include "NewSpmOutputter.h" using namespace jcs; /// /** */ NewSpmOutputter::NewSpmOutputter() : Basic3DOutputter(CreateOptions()) { } /// /** */ Options NewSpmOutputter::CreateOptions() { Options options = Get3DOptions(); options.pathname = "SpmAnalyze"; return options; } /// /** */ BasicVolumeFormat* NewSpmOutputter::GetOutputVolume(const char* file) { return new NewSpmVolume(file, headerExtension.mb_str(wxConvLocal), rawExtension.mb_str(wxConvLocal)); } /// /** */ int NewSpmOutputter::ConvertSeries(SeriesHandler* handler) { int bits_allocated, pixel_rep = 0; handler->Find("BitsAllocated", bits_allocated); handler->Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 8 : { SpmConversion conversion(this, handler); conversion.Convert(); break; } case 9 : { SpmConversion conversion(this, handler); conversion.Convert(); break; } case 16 : { SpmConversion conversion(this, handler); conversion.Convert(); break; } case 17 : { SpmConversion conversion(this, handler); conversion.Convert(); break; } case 32 : { SpmConversion conversion(this, handler); conversion.Convert(); break; } case 33 : { SpmConversion conversion(this, handler); conversion.Convert(); break; } default : { wxLogMessage(_("BitsAllocated and PixelRepresentation values (%d, %d) not supported."), bits_allocated, pixel_rep); } } return 1; } /// /** */ template SpmConversion::SpmConversion(Basic3DOutputter* outputter, SeriesHandler* handler) : Basic3DConversion(outputter, handler) { mHeader = new NewSpmHeader(); } /// /** */ template SpmConversion::~SpmConversion() { delete mHeader; } /// /** */ template void SpmConversion::ProcessSlice(std::vector& slice) { std::reverse(slice.begin(), slice.end()); } /// /** */ template void SpmConversion::GetHeaderForSeries() { mHeader->InitHeader(); std::string s; this->mHandler->Find("SeriesDate", s); s.copy(mHeader->hist.exp_date, sizeof(mHeader->hist.exp_date)); this->mHandler->Find("SeriesTime", s); s.copy(mHeader->hist.exp_time, sizeof(mHeader->hist.exp_time)); this->mHandler->Find("SeriesDescription", s); s.copy(mHeader->hist.descrip, sizeof(mHeader->hist.descrip)); this->mHandler->Find("PatientName", s); s.copy(mHeader->hist.patient_id, sizeof(mHeader->hist.patient_id)); float fvar; this->mHandler->Find("RepetitionTime", fvar); mHeader->dime.pixdim[4] = fvar; mHeader->dime.dim[1] = this->mHandler->GetColumns(); mHeader->dime.dim[2] = this->mHandler->GetRows(); mHeader->dime.dim[3] = this->mHandler->GetNumberOfSlices(); // dim[3] recalculated in mConvert std::vectorvoxel_size = this->mHandler->GetVoxelSize(); mHeader->dime.pixdim[1] = voxel_size[0]; mHeader->dime.pixdim[2] = voxel_size[1]; mHeader->dime.pixdim[3] = voxel_size[2]; // pixdim[3] recalculated in mConvert this->mHandler->Find("PhotometricInterpretation", s); if (s == "RGB") { mHeader->dime.datatype = 128; // DT_RGB } else { this->mHandler->Find("BitsAllocated", mHeader->dime.bitpix); // Standard Analyze data types don't include // either unsigned 16 bit or signed 8 bit switch (mHeader->dime.bitpix) { case 16 : mHeader->dime.datatype = 4; // DT_SIGNED_SHORT break; case 8 : mHeader->dime.datatype = 8; // DT_UNSIGNED_CHAR break; default : mHeader->dime.datatype = 0; // DT_UNKNOWN } } // Write/calculate remaining fields mHeader->hk.sizeof_hdr = 348; mHeader->dime.dim[0] = 4; mHeader->dime.dim[4] = 1; // one volume per file by default int dimensionality = this->mOutputter->GetDimensionality(this->mHandler->GetSeriesUid()); if (dimensionality == 4) { mHeader->dime.dim[4] = this->GetNumberOfVolumes(); } mHeader->hk.regular = 'r'; // all volumes same size mHeader->dime.vox_offset = 0; mHeader->hist.origin[0] = mHeader->dime.dim[1]/2; mHeader->hist.origin[1] = mHeader->dime.dim[2]/2; mHeader->hist.origin[2] = mHeader->dime.dim[3]/2; } /// /** \param volPair A volume identifier and a volume. */ template void SpmConversion::CompleteHeaderForVolume(std::pair > volPair) { // Calculate number of slices for this volume int n_slices = volPair.second.size(); mHeader->SetNumberOfSlices(n_slices); // Calculate voxel size in Z from slice spacing for multi-slice files if (n_slices > 1) { mHeader->SetSliceSpacing(volPair.second.GetSpacing()); } double slope, intercept; if (this->mOutputter->rescale == false && this->mHandler->GetRescaleSlopeAndIntercept(volPair.first, slope, intercept)) { mHeader->dime.scale = slope; mHeader->dime.intercept = intercept; } else { mHeader->dime.scale = 1; mHeader->dime.intercept = 0; } } mriconvert/Volume.cpp0000640000175000000620000000005512542632322014224 0ustar stevestaff#include "Volume.h" using namespace jcs; mriconvert/EnhancedMrHandler.cpp0000640000175000000620000002213412542632332016262 0ustar stevestaff/// EnhancedMrHandler.cpp /** */ #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "SeriesHandler.h" #include "EnhancedMrHandler.h" using namespace jcs; /// /** */ EnhancedMrHandler::EnhancedMrHandler(const std::string& seriesUid) : SeriesHandler(seriesUid) { } /// /** */ std::string EnhancedMrHandler::GetImagePositionPatient(DicomFile& dfile, int frame) { return ipps.at(frame); } /// /** */ int EnhancedMrHandler::GetRescaleSlopeAndIntercept(DicomFile& dfile, double& slope, double& intercept, int frame) const { // use a private std::vector // if it's empty, fill it on the first call // or fill it in getvolids slope = slopes.at(frame); intercept = intercepts.at(frame); return 1; } /// /** */ std::vector EnhancedMrHandler::GetStringInfo() { std::vector info = SeriesHandler::GetStringInfo(); return info; } /// /** */ SeriesHandler::VolListType EnhancedMrHandler::ReadVolIds(DicomFile& file) { std::string imageType; file.Find("ImageType", imageType); bool isdti = (imageType.find("DIFFUSION") != std::string::npos); VolListType v; std::string sequence; std::vector dips; file.Find("DimensionIndexSequence", sequence); file.FindInSequence(sequence, "DimensionIndexPointer", dips); unsigned int n_indices = dips.size(); sequence.clear(); std::vector fc_sequence; std::vector po_sequence; std::vector pp_sequence; std::vector diff_sequence; std::vector pm_sequence; std::vector pvt_sequence; // This is a type 2 element. Could probably comment this out? if (file.Find("SharedFunctionalGroupsSequence", sequence)) { file.FindInSequence(sequence, "PlaneOrientationSequence", po_sequence); file.FindInSequence(sequence, "PlanePositionSequence", pp_sequence); } sequence.clear(); if (!file.Find("PerFrameFunctionalGroupsSequence", sequence)) { wxLogError(_("Unable to find PerFrameFunctionalGroupsSequence")); return v; } if (!file.FindInSequence(sequence, "FrameContentSequence", fc_sequence)) { wxLogError(_("Unable to find FrameContentSequence")); return v; } if (po_sequence.size() == 0) { if (!file.FindInSequence(sequence, "PlaneOrientationSequence", po_sequence)) { wxLogError(_("Unable to find PlaneOrientationSequence")); return v; } } if (pp_sequence.size() == 0) { if (!file.FindInSequence(sequence, "PlanePositionSequence", pp_sequence)) { wxLogError(_("Unable to find PlanePositionSequence")); return v; } } file.FindInSequence(sequence, "PixelMeasuresSequence", pm_sequence); if (isdti) { file.FindInSequence(sequence, "MrDiffusionSequence", diff_sequence); } int pvt_found = file.FindInSequence(sequence, "PixelValueTransformationSequence", pvt_sequence); std::vector::iterator fc_it = fc_sequence.begin(); std::vector::iterator po_it = po_sequence.begin(); std::vector::iterator pp_it = pp_sequence.begin(); std::vector::iterator diff_it = diff_sequence.begin(); std::vector::iterator pvt_it = pvt_sequence.begin(); std::vector > rotations; std::vector > divs(n_indices); std::vector inStackPositions; std::vector bvecs; std::vector bvals; // Assumes pixel spacing same in every frame -- not, strictly speaking, // a safe assumption std::vector vals; if (!pm_sequence.empty()) { file.FindInSequence(pm_sequence.front(), "PixelSpacing", vals); if (!vals.empty()) { pixelSpacing = vals.front(); } } while (fc_it != fc_sequence.end()) { vals.clear(); if (file.FindInSequence(*fc_it, "DimensionIndexValues", vals)) { for (unsigned int i = 0; i < n_indices; ++i) { divs.at(i).push_back(stoi(vals.front(), i)); } vals.clear(); } if (file.FindInSequence(*fc_it, "InStackPositionNumber", vals)) { inStackPositions.push_back(stoi(vals.front())); vals.clear(); } else { inStackPositions.push_back(0); } double rescale_val; if (pvt_found && file.FindInSequence(*pvt_it, "RescaleIntercept", vals)) { intercepts.push_back(stof(vals.front())); vals.clear(); } else { if (file.Find("RescaleIntercept", rescale_val)) { intercepts.push_back(rescale_val); } else { intercepts.push_back(0); } } if (pvt_found && file.FindInSequence(*pvt_it, "RescaleSlope", vals)) { slopes.push_back(stof(vals.front())); vals.clear(); } else if (file.Find("RescaleSlope", rescale_val)) { intercepts.push_back(rescale_val); } else { slopes.push_back(1); } if (file.FindInSequence(*pp_it, "ImagePositionPatient", vals)) { ipps.push_back(vals.front()); } else { ipps.push_back("0/0/0"); } vals.clear(); if (!file.FindInSequence(*po_it, "ImageOrientationPatient", vals)) { vals.push_back("1/0/0/0/1/0"); } std::vector rotation; rotation.resize(9, 0); for (int i = 0; i < 6; ++i) { double f = stof(vals.front(), i); // round off rotation[i] = static_cast(static_cast(f * 100000 + 0.5)) / 100000; } rotation[6] = rotation[1]*rotation[5] - rotation[2]*rotation[4]; rotation[7] = rotation[2]*rotation[3] - rotation[0]*rotation[5]; rotation[8] = rotation[0]*rotation[4] - rotation[1]*rotation[3]; rotations.push_back(rotation); if (isdti && diff_sequence.size() != 0) { vals.clear(); file.FindInSequence(*diff_it, "DiffusionBValue", vals); if (vals.size() != 0) { bvals.push_back(vals.front()); } else bvals.push_back("-1"); vals.clear(); file.FindInSequence(*diff_it, "DiffusionDirectionality", vals); if (vals.front() == "DIRECTIONAL") { vals.clear(); if (file.FindInSequence(*diff_it, "DiffusionGradientDirectionSequence", vals)) { std::vector dgo; if (file.FindInSequence(vals.front(), "DiffusionGradientOrientation", dgo)) { bvecs.push_back(dgo.front()); } } } else { bvecs.push_back("0/0/0"); } ++diff_it; }; ++fc_it; if (po_sequence.size() == fc_sequence.size()) { ++po_it; } if (pp_sequence.size() == fc_sequence.size()) { ++pp_it; } wxTheApp->Yield(); } std::vector use_index; for (unsigned int i = 0; i < divs.size(); ++i) { // Don't use if indices simply reflect inStackPositions bool use = divs.at(i) != inStackPositions; // or if they just count up from 1 to nslices unsigned int j = 0; bool match = use; while (match && j < divs.at(i).size()) { match = (divs.at(i).at(j) == j+1); ++j; } use &= !match; use_index.push_back(use); } for (unsigned int i = 0; i < rotations.size(); ++i) { VolId info; info.ids.push_back(GetSeriesUid()); for (unsigned int j = 0; j < divs.size(); ++j) if (use_index.at(j)) { info.ids.push_back(itos(divs.at(j).at(i), 3)); } std::vector >::iterator pos; pos = find(orientations.begin(), orientations.end(), rotations.at(i)); if (pos != orientations.end()) { info.orientNumber = distance(orientations.begin(), pos); } else { info.orientNumber = orientations.size(); orientations.push_back(rotations.at(i)); } v.push_back(info); if (isdti && diff_sequence.size() != 0) { bvalMap[info] = bvals.at(i); bvecMap[info] = bvecs.at(i); } wxTheApp->Yield(); } return v; } /// /** */ GradientInfo EnhancedMrHandler::GetGradientInfo() { GradientInfo info; std::set vols = GetVolIds(); std::vector r = GetRotationMatrix(*vols.begin()); for (std::set::iterator it = vols.begin(); it != vols.end(); ++it) { info.values.push_back(stof(bvalMap[*it])); info.xGrads.push_back(stof(bvecMap[*it], 0)); info.yGrads.push_back(stof(bvecMap[*it], 1)); info.zGrads.push_back(stof(bvecMap[*it], 2)); }; wxLogWarning(_("Warning: bvecs have NOT been verified as correct for enhanced MR DICOM files. If you would like to help with this, please email jolinda@uoregon.edu.")); RotateGradInfo(info, r); return info; } /// /** */ bool EnhancedMrHandler::IsDti() const { std::string imageType; Find("ImageType", imageType); return (imageType.find("DIFFUSION") != std::string::npos); } /// /** */ std::vector EnhancedMrHandler::GetVoxelSize() { std::vector voxel_size(3, 0); if (pixelSpacing.empty()) { Find("PixelSpacing", pixelSpacing); } if (!pixelSpacing.empty()) { voxel_size[0] = stof(pixelSpacing, 0); voxel_size[1] = stof(pixelSpacing, 1); } //Find("SliceSpacing", voxel_size[2]); Find("SpacingBetweenSlices", voxel_size[2]); if (voxel_size[2] == 0) { Find("SliceThickness", voxel_size[2]); } return voxel_size; } mriconvert/GeDti2Handler.h0000640000175000000620000000100712542632332014775 0ustar stevestaff/// GeEpiHandler.h /** */ #ifndef GE_DTI2_HANDLER_H #define GE_DTI2_HANDLER_H #include "GeEpiHandler.h" namespace jcs { /// /** */ class GeDti2Handler : public GeEpiHandler { public: GeDti2Handler(const std::string& seriesUid); virtual GradientInfo GetGradientInfo(); virtual bool IsDti() const { return true; } protected: virtual VolListType ReadVolIds(DicomFile& file); private: std::vector > gradients; }; } #endif mriconvert/NoOptionsDlg.h0000640000175000000620000000056212542632314015005 0ustar stevestaff/// NoOptionsDlg.h /** */ #ifndef NO_OPTIONS_DLG_H_ #define NO_OPTIONS_DLG_H_ #include #include #include namespace jcs { class NoOptionsDlg: public wxDialog { public: NoOptionsDlg(); void OnOkay(wxCommandEvent& event); protected: DECLARE_EVENT_TABLE() }; } #endif mriconvert/PhilipsDictionary.h0000640000175000000620000000742712542632322016072 0ustar stevestaff/** \file PhilipsDictionary.h These are proprietary tags for Philips systems. */ mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x0010 ), "Private_Creator_Group_2001", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1001 ), "Chemical_Shift", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1002 ), "Chemical_Shift_Number_MR", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1003 ), "Diffusion_B-Factor", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1004 ), "Diffusion_Direction", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1006 ), "Image_Enhanced", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1007 ), "Image_Type_ED_ES", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1008 ), "Phase_Number", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x100A ), "Slice_Number_MR", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1011 ), "Diffusion_Echo_Time", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1012 ), "Dynamic_Series", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1013 ), "EPI_Factor", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1014 ), "Number_of_Echoes", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1015 ), "Number_of_Locations", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1016 ), "Number_of_PC_Directions", "SS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1017 ), "Number_of_Phases_MR", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1018 ), "Number_of_Slices_MR", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1019 ), "Partial_Matrix_Scanned", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x101A ), "PC_Velocity", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x101B ), "Prepulse_Delay", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x101C ), "Prepulse_Type", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x101D ), "Reconstruction_Number_MR", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x101F ), "Respiration_Sync", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1021 ), "SPIR", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1022 ), "Water_Fat_Shift", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1023 ), "Flip_Angle_Philips", "DS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1060 ), "Number_of_Stacks", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x1081 ), "Number_of_Dynamic_Scans", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x107B ), "Acquisition_Number", "IS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x10F1 ), "Prospective_Motion_Correction", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2001, 0x10F2 ), "Retrospective_Motion_Correction", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2005, 0x0010 ), "Private_Creator_Group_2005", "LO" )); mAddEntry ( DicomElement ( DicomTag ( 0x2005, 0x1020 ), "Number_of_Chemical_Shift", "SL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2005, 0x10A1 ), "Syncra_Scan_Type", "CS" )); mAddEntry ( DicomElement ( DicomTag ( 0x2005, 0x10B0 ), "Diffusion_Direction_RL", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2005, 0x10B1 ), "Diffusion_Direction_AP", "FL" )); mAddEntry ( DicomElement ( DicomTag ( 0x2005, 0x10B2 ), "Diffusion_Direction_FH", "FL" )); mriconvert/version_string.h0000640000175000000620000000006112542632317015476 0ustar stevestaff#define VERSION_STRING "version 2.0.8 build 416" mriconvert/BvFiles.h0000640000175000000620000000273212542632310013755 0ustar stevestaff#ifndef BV_FILES_H_ #define BV_FILES_H_ #include #include #include #include "Globals.h" namespace jcs { struct FmrHeader { int volumes; int slices; int skipVolumes; std::string prefix; int tr; int interSliceT; int columns; int rows; int layoutColumns; int layoutRows; float IpResX; float IpResY; float sliceThickness; float sliceGap; }; class BvStc { public: BvStc(const std::string& filename) : mFileName(filename) {} ~BvStc(); int WriteStc(wxUint16 rows, wxUint16 cols, std::vector& data); private : std::string mFileName; std::fstream mFile; int mOpenFile(std::ios::openmode mode); void mCloseFile() { mFile.close(); } }; class BvVmr { public: BvVmr(const std::string& filename) : mFileName(filename) {} ~BvVmr(); int WriteVmr(std::vector& dim, std::vector& data); int WriteV16(std::vector& dim, std::vector& data); private : std::string mFileName; std::fstream mFile; int mOpenFile(std::ios::openmode mode, const char* suffix); void mCloseFile() { mFile.close(); } }; class BvFmr { public : BvFmr(const std::string& filename) : mFileName(filename) {} ~BvFmr(); void WriteFmr(const FmrHeader& header); private : std::string mFileName; std::fstream mFile; int mOpenFile(std::ios::openmode mode); void mCloseFile() { mFile.close(); } }; } #endif mriconvert/OutputList.h0000640000175000000620000000306212542632317014563 0ustar stevestaff/// OutputList.h /** */ #ifndef OUTPUT_LIST_H_ #define OUTPUT_LIST_H_ #include #include #include #include #include namespace jcs { class ImageFileName { public: ImageFileName(); void SetPrefix(const std::string& prefix); void SetPostfix(const std::string& postfix); std::string GetPrefix() const; std::string GetPostfix() const; void SetExt(const std::string& ext); void AppendDir(const std::string& uid, const std::string& dir); int GetDirCount() const; void ResetPath(); std::string GetFullName() const; std::string GetFullPath() const; std::string GetPath() const; std::string GetExt() const; std::string GetDirName(int pos) const; std::string GetDirUid(int pos) const; void SetDirName(int pos, std::string name); bool isRenameable; std::string seriesUid; private: std::string mPrefix; std::string mPostfix; std::string mExt; struct DirPair { std::string uid; std::string dir; }; typedef std::vector DirListType; DirListType mDirList; }; struct OutputList { // maps a list of unique file identifiers to a list of output files -- each id = 1 volume, but // could be multiple files out (ie, .hdr + .img) typedef std::multimap ListType; ListType fileNameList; wxString rootDir; wxFileName GetFullFileName(const std::string& key) const; }; } #endif mriconvert/Preamble.h0000640000175000000620000000055012542632322014151 0ustar stevestaff/// Preamble.h /** */ #ifndef PREAMBLE_H #define PREAMBLE_H #include #include namespace jcs { struct Preamble { char buff[4]; std::string magic; bool IsDICOM(); friend std::istream &operator>>(std::istream &in, Preamble &p); }; std::istream &operator>>(std::istream &in, Preamble &p); } #endif mriconvert/McFrame.cpp0000640000175000000620000001610712542632332014275 0ustar stevestaff/// McFrame.cpp /** Graphical User Interface main window. */ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include #include #include #include #include "StringConvert.h" #include "MRIConvert.h" #include "McFrame.h" #include "McPanel.h" #include "TextFileViewer.h" #include "version_string.h" // ---------------------------------------------------------------------------- // resources // ---------------------------------------------------------------------------- #include "MRIConvert.xpm" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- enum { MENU_INPUT_ADD_FILES = 1, MENU_INPUT_ADD_DIR, MENU_INPUT_REMOVE, MENU_INPUT_INFO, MENU_INPUT_DICOM, MENU_INPUT_IMAGE, MENU_CONVERT_NEW, MENU_CONVERT_CONVERT, MENU_OUTPUT_DIRECTORY, MENU_OUTPUT_RENAME, MENU_OUTPUT_OPTIONS, MENU_OUTPUT_OVERRIDE, MENU_HELP }; BEGIN_EVENT_TABLE(McFrame, wxFrame) EVT_MENU(MENU_CONVERT_NEW, McFrame::OnNew) EVT_MENU(MENU_INPUT_ADD_FILES, McFrame::OnAddFiles) EVT_MENU(MENU_INPUT_ADD_DIR, McFrame::OnAddDir) EVT_MENU(MENU_OUTPUT_DIRECTORY, McFrame::OnDirectory) EVT_MENU(MENU_CONVERT_CONVERT, McFrame::OnConvert) EVT_MENU(MENU_INPUT_INFO, McFrame::OnInfo) EVT_MENU(MENU_INPUT_DICOM, McFrame::OnDicom) EVT_MENU(MENU_INPUT_IMAGE, McFrame::OnImage) EVT_MENU(MENU_INPUT_REMOVE, McFrame::OnRemove) EVT_MENU(MENU_OUTPUT_RENAME, McFrame::OnRename) EVT_MENU(MENU_OUTPUT_OPTIONS, McFrame::OnOptions) EVT_MENU(MENU_OUTPUT_OVERRIDE, McFrame::OnOverride) EVT_MENU(wxID_ABOUT, McFrame::OnAbout) EVT_MENU(MENU_HELP, McFrame::OnHelp) EVT_MENU(wxID_EXIT, McFrame::OnQuit) END_EVENT_TABLE() // ---------------------------------------------------------------------------- // main frame // ---------------------------------------------------------------------------- // frame constructor McFrame::McFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame *)NULL, -1, title, pos, size) { SetIcon(wxIcon(MRIConvert)); CreateStatusBar(); wxMenuBar* pMenuBar = new wxMenuBar(); wxMenu* pInputMenu = new wxMenu(); pInputMenu->Append(MENU_INPUT_ADD_FILES, _("&Add Files\tCtrl+A"), _("Add files to convert")); pInputMenu->Append(MENU_INPUT_ADD_DIR, _("Add &Folder\tCtrl+F"), _("Add directory of files to convert")); pInputMenu->Append(MENU_INPUT_REMOVE, _("&Remove\tCtrl+R"), _("Remove files")); pInputMenu->AppendSeparator(); pInputMenu->Append(MENU_INPUT_INFO, _("&Series Info\tCtrl+S"), _("View series information")); pInputMenu->AppendSeparator(); pInputMenu->Append(MENU_INPUT_DICOM, _("View &DICOM\tCtrl+D"), _("View DICOM file as text")); pInputMenu->Append(MENU_INPUT_IMAGE, _("View &Image\tCtrl+I"), _("View image from DICOM file")); pMenuBar->Append(pInputMenu, _("&Input")); wxMenu* pOutputMenu = new wxMenu(); pOutputMenu->Append(MENU_OUTPUT_DIRECTORY, _("&Directory\tAlt+D"), _("Set output directory")); pOutputMenu->Append(MENU_OUTPUT_RENAME, _("&Rename\tAlt+R"), _("Rename output files/directories")); pOutputMenu->Append(MENU_OUTPUT_OPTIONS, _("&Options\tAlt+O"), _("Set default options for this format")); pOutputMenu->Append(MENU_OUTPUT_OVERRIDE, _("Override"), _("Override default options for this format")); pMenuBar->Append(pOutputMenu, _("&Output")); wxMenu* pConvertMenu = new wxMenu(); pConvertMenu->Append(MENU_CONVERT_CONVERT, _("&Convert All\tCtrl+C"), _("Convert all files")); pConvertMenu->Append(MENU_CONVERT_NEW, _("&New session\tCtrl+N"), _("Start new session")); pConvertMenu->Append(wxID_EXIT, _("E&xit\tCtrl+X"), _("Quit the application")); pMenuBar->Append(pConvertMenu, _("&Convert")); wxMenu* pHelpMenu = new wxMenu(); pHelpMenu->Append(MENU_HELP, _("File formats"), _("About output file formats")); pHelpMenu->Append(wxID_ABOUT, _("&About"), _("About MRIConvert")); pMenuBar->Append(pHelpMenu, _("&Help")); SetMenuBar(pMenuBar); mpPanel = new McPanel(this); wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(mpPanel, 1, wxEXPAND); SetSizer(sizer); sizer->SetSizeHints(this); SetSize(size); Move(pos); } /// /** */ McFrame::~McFrame() { wxConfig::Get()->Write(CFG_framewidth, GetSize().GetWidth()); wxConfig::Get()->Write(CFG_frameheight, GetSize().GetHeight()); wxConfig::Get()->Write(CFG_frameposx, GetPosition().x); wxConfig::Get()->Write(CFG_frameposy, GetPosition().y); } /// /** */ void McFrame::OnAddDir(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnAddDir(nullEvent); } /// /** */ void McFrame::OnAddFiles(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnAddFiles(nullEvent); } /// /** */ void McFrame::OnDicom(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnDicom(nullEvent); } /// /** */ void McFrame::OnImage(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnImage(nullEvent); } /// /** */ void McFrame::OnInfo(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnInfo(nullEvent); } /// /** */ void McFrame::OnRemove(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnRemove(nullEvent); } /// /** */ void McFrame::OnDirectory(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnDirectory(nullEvent); } /// /** */ void McFrame::OnNew(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnNew(nullEvent); } /// /** */ void McFrame::OnConvert(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnConvert(nullEvent); } /// /** */ void McFrame::OnRename(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnRename(nullEvent); } /// /** */ void McFrame::OnOptions(wxCommandEvent& event) { wxCommandEvent nullEvent(0,0); mpPanel->OnOptions(nullEvent); } /// /** */ void McFrame::OnOverride(wxCommandEvent& event) { mpPanel->OnMenuOverride(); } /// /** */ void McFrame::OnAbout(wxCommandEvent& event) { wxAboutDialogInfo info; info.SetName("MRIConvert"); info.SetVersion(_(VERSION_STRING)); info.SetDescription(_("MRIConvert converts DICOM files to other useful formats.")); info.SetCopyright("(C) 2013 University of Oregon\nLewis Center for Neuroimaging"); info.AddDeveloper("Jolinda Smith"); info.AddDeveloper("Chuck Theobald"); //info.AddTranslator("xxxx xxxxxxx"); info.SetWebSite("mailto:mriconvert@ithelp.uoregon.edu", _("Email Tech Support")); wxAboutBox(info); } /// /** */ void McFrame::OnHelp(wxCommandEvent& event) { TextFileViewer *view = new TextFileViewer(this, _("About file formats")); view->Show(); } /// /** */ void McFrame::OnQuit(wxCommandEvent& event) { Close(true); } mriconvert/NewBvOutputter.txx0000640000175000000620000001607412542632332016004 0ustar stevestaff/// NewBvOutputter.txx /** */ #ifndef NEW_BV_OUTPUTTER_TXX #define NEW_BV_OUTPUTTER_TXX #include #include #include "Volume.h" #include "BvFiles.h" #include "StringConvert.h" namespace jcs { template T Max(Volume vol) { typename std::map >::iterator it = vol.mSliceMap.begin(); typename std::map >::iterator end = vol.mSliceMap.end(); T vol_max = *std::max_element((*it).second.begin(), (*it).second.end()); while (++it != end) { T slice_max = *std::max_element((*it).second.begin(), (*it).second.end()); vol_max = std::max(vol_max, slice_max); } return vol_max; } template T Min(Volume vol) { typename std::map >::iterator it = vol.mSliceMap.begin(); typename std::map >::iterator end = vol.mSliceMap.end(); T vol_min = *std::min_element((*it).second.begin(), (*it).second.end()); while (++it != end) { T slice_min = *std::max_element((*it).second.begin(), (*it).second.end()); vol_min = std::min(vol_min, slice_min); } return vol_min; } template void NewBvOutputter::mConvertAnat(SeriesHandler* handler) { bool write_vmr = true; bool write_v16 = mSaveV16; if (!write_vmr && !write_v16) { return; } typedef std::map > vMapType; vMapType volumes; handler->GetVolumes(volumes); // Just to keep things simple, we only convert the first volume. typename vMapType::iterator vit = volumes.begin(); // Calculate scaling factor; T data_min, data_max; float scaling = 1; wxUint8 char_max = std::numeric_limits::max(); if (write_vmr) { if (verbose) { wxLogStatus(_T("Calculating scaling factor...")); } data_min = Min((*vit).second); data_max = static_cast(Max((*vit).second) * .5); if ((data_max - data_min) != 0) { scaling = static_cast(char_max)/static_cast(data_max - data_min); } } wxUint16 dim[3]; dim[0] = handler->GetColumns(); // original: x; BV: -z dim[1] = handler->GetRows(); // original: y; BV: +x dim[2] = (*vit).second.size(); // original: z; BV: -y int factor[] = {1, 1, 1}; int offset[] = {0, 0, 0}; for (int i = 0; i < 3; ++i) { while (dim[i] > 256*factor[i]) { factor[i] *= 2; } while ((dim[i] + offset[i]*factor[i]) < 256*factor[i]) { ++offset[i]; } assert((dim[i]/factor[i] + offset[i]) == 256); } std::vector data(256*256*256); // for .vmr file std::vector data_16; // for .v16 file if (mSaveV16) { data_16 = std::vector(256*256*256); } if (verbose) { wxLogStatus(_T("Converting data....")); } typename std::map >::iterator it = (*vit).second.begin(); typename std::map >::iterator last = (*vit).second.end(); wxUint8* start_point; start_point = &data.front() + 255*256 // last line, first slice + offset[0]*256*128 // BV z offset - offset[2]*128 // BV y offset + 256 - offset[1]/2; // BV x offset wxInt16* start_point_16; start_point_16 = &data_16.front() + 255*256 + offset[0]*256*128 - offset[2]*128 + 256 - offset[1]/2; int slice_no = 0; while (it != last) { T* source_ptr = &((*it).second.front()); wxUint8* data_ptr = start_point - slice_no*256; wxInt16* data_ptr_16 = start_point_16 - slice_no*256; for (int row_no = 0; row_no < dim[1]; row_no += factor[1]) { for (int col_no = 0; col_no < dim[0]; col_no += factor[0]) { if (write_vmr) { *data_ptr = std::min(char_max, static_cast((*source_ptr) * scaling - data_min * scaling)); } if (write_v16) { *data_ptr_16 = *source_ptr; } source_ptr += factor[0]; data_ptr += 256*256; data_ptr_16 += 256*256; } data_ptr -= 256*256*(dim[0]/factor[0]) - 1; data_ptr_16 -= 256*256*(dim[0]/factor[0]) - 1; source_ptr += dim[0] * (factor[1] - 1); } ++slice_no; for (int i = 0; i < factor[2]; ++i, ++it); } wxFileName file = GetFileName(handler->GetSeriesUid()); wxFileName::Mkdir(file.GetPath(wxPATH_GET_VOLUME), 0777, wxPATH_MKDIR_FULL); file.SetExt(_T("")); BvVmr vmr_file(static_cast(file.GetFullPath())); //.mb_str(wxConvLocal))); std::vector dimensions; dimensions.push_back(256); dimensions.push_back(256); dimensions.push_back(256); if (write_vmr) { vmr_file.WriteVmr(dimensions, data); } if (write_v16) { vmr_file.WriteV16(dimensions, data_16); } } template void NewBvOutputter::mConvertStc(SeriesHandler* handler) { typedef std::map > vMapType; vMapType volumes; handler->GetVolumes(volumes); // This could cause problems, but shouldn't ever happen if (typeid(T) != typeid(wxUint16)) { wxLogError(_T("Warning: data isn't 16 bit.")); } int n_volumes = handler->GetNumberOfVolumes(); int n_slices = handler->GetNumberOfSlices(); int n_rows = handler->GetRows(); int n_cols = handler->GetColumns(); // initialize time-course vectors std::vector< std::vector > time_courses(n_slices, std::vector(n_volumes*n_rows*n_cols)); std::vector< std::vector >::iterator tc_slice_it = time_courses.begin(); for(int i = 0; i < n_slices; ++i) { typename vMapType::iterator v_it = volumes.begin(); for (int n = 0; n < mSkip; ++n, ++v_it); std::vector::iterator tc_it = (*tc_slice_it).begin(); for (int j = mSkip; j < n_volumes; ++j) { std::copy((*v_it).second.GetSlice(i).begin(), (*v_it).second.GetSlice(i).end(), tc_it); tc_it += n_rows*n_cols; ++v_it; } ++tc_slice_it; // wxFileName file;// = mOutputList.GetFileName(v_it->first); wxFileName file = GetFileName(handler->GetSeriesUid()); wxFileName::Mkdir(file.GetPath(wxPATH_GET_VOLUME), 0777, wxPATH_MKDIR_FULL); file.SetExt(_T("")); std::string namebase(static_cast(file.GetFullPath())); //.mb_str(wxConvLocal))); // reverse slice order as requested by Yoshiko // string fname = namebase + "_" + itos(i+1); int reversed_slice_number = n_slices - i; int ndigits = itos(n_slices).size(); std::string fname = namebase + "_" + itos(reversed_slice_number, ndigits); // if (Validate((dirPair.second + fname + ".stc").c_str()) == wxID_YES) { BvStc stc_file(fname); stc_file.WriteStc(n_rows, n_cols, time_courses[i]); // } } } } #endif mriconvert/AchievaDtiHandler.cpp0000640000175000000620000000471312542632317016265 0ustar stevestaff/// AchievaDtiHandler.cpp /** */ #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "SeriesHandler.h" #include "AchievaDtiHandler.h" using namespace jcs; /// /** */ AchievaDtiHandler::AchievaDtiHandler(const std::string& seriesUid) : SeriesHandler(seriesUid) { } /// /** */ SeriesHandler::VolListType AchievaDtiHandler::ReadVolIds(DicomFile& file) { VolListType v = SeriesHandler::ReadVolIds(file); Dictionary* Achieva = PhilipsMr_Dictionary::Instance(); std::vector g_value; std::string b_direction; double value; file.Find(Achieva->Lookup("Diffusion_B-Factor"), value); g_value.push_back(value); file.Find(Achieva->Lookup("Diffusion_Direction_RL"), value); g_value.push_back(value); file.Find(Achieva->Lookup("Diffusion_Direction_AP"), value); g_value.push_back(value); file.Find(Achieva->Lookup("Diffusion_Direction_FH"), value); g_value.push_back(value); int g_number; std::vector >::iterator pos; pos = find(gradients.begin(), gradients.end(), g_value); if (pos != gradients.end()) { g_number = distance(gradients.begin(), pos); } else { g_number = gradients.size(); gradients.push_back(g_value); } v.front().ids.push_back(itos(g_number, 3)); return v; } /// /** */ GradientInfo AchievaDtiHandler::GetGradientInfo() { GradientInfo info; Dictionary* Achieva = PhilipsMr_Dictionary::Instance(); std::map volFileMap = GetVolIdsAndFiles(); std::map::iterator it = volFileMap.begin(); std::map::iterator it_end = volFileMap.end(); for (;it != it_end; it++) { //std::vector test = it->first.ids; //for (int t = 0; t < test.size(); ++t) // wxLogMessage(test[t].c_str()); DicomFile file(it->second.c_str()); double value; file.Find(Achieva->Lookup("Diffusion_B-Factor"), value); info.values.push_back(value); file.Find(Achieva->Lookup("Diffusion_Direction_RL"), value); info.xGrads.push_back(value); file.Find(Achieva->Lookup("Diffusion_Direction_AP"), value); info.yGrads.push_back(value); file.Find(Achieva->Lookup("Diffusion_Direction_FH"), value); info.zGrads.push_back(value); } std::vector r = GetRotationMatrix(volFileMap.begin()->first); RotateGradInfo(info, r); return info; } mriconvert/Globals.cpp0000640000175000000620000000013212542632333014336 0ustar stevestaff/// Globals.cpp /** */ #include "Globals.h" bool jcs::verbose; bool jcs::quiet; mriconvert/file.xpm0000640000175000000620000000062612542632317013726 0ustar stevestaff/* XPM */ static const char *file_xpm[]={ "16 16 2 1", "# c #000000", ". c #ffffff", "................", "..########......", "..#......#......", "..#.#.#..#......", "..#......####...", "..#.#.#.....#...", "..#.........#...", "..#.#.#.#.#.#...", "..#.........#...", "..#.#.#.#.#.#...", "..#.........#...", "..#.#.#.#.#.#...", "..#.........#...", "..###########...", "................", "................"}; mriconvert/ValueRepresentations.cpp0000640000175000000620000002377012542632317017154 0ustar stevestaff/// ValueRepresentations.cpp /** */ #include "ValueRepresentations.h" using namespace jcs; /// /** Depends upon input stream providing a string. Perhaps this should be explicitly defined. DICOM delimits sub-strings with a backslash. \param in An input stream, should be a stringstream. */ void DicomValue::GetStrings(std::istream &in) { char in_buff[100]; std::string tmp; while (!std::getline(in, tmp, '\\').fail()) { //(char)0x5C); values.push_back(wxString(tmp.c_str(), wxConvUTF8)); } } wxString DicomValue::first() { return values.front(); } wxInt16 DicomValue::EndianSwapInt16(wxInt16 value) { if (transferSyntaxCode == BEE_CODE) { wxINT16_SWAP_ON_LE(value); } else { wxINT16_SWAP_ON_BE(value); } return value; } wxInt32 DicomValue::EndianSwapInt32(wxInt32 value) { if (transferSyntaxCode == BEE_CODE) { wxINT32_SWAP_ON_LE(value); } else { wxINT32_SWAP_ON_BE(value); } return value; } wxUint16 DicomValue::EndianSwapUint16(wxUint16 value) { if (transferSyntaxCode == BEE_CODE) { wxUINT16_SWAP_ON_LE(value); } else { wxUINT16_SWAP_ON_BE(value); } return value; } wxUint32 DicomValue::EndianSwapUint32(wxUint32 value) { if (transferSyntaxCode == BEE_CODE) { wxUINT32_SWAP_ON_LE(value); } else { wxUINT32_SWAP_ON_BE(value); } return value; } wxUint64 DicomValue::EndianSwapUint64(wxUint64 value) { if (transferSyntaxCode == BEE_CODE) { wxUINT64_SWAP_ON_LE(value); } else { wxUINT64_SWAP_ON_BE(value); } return value; } /// /** \return True if all values in rhs are the same as all values in this. False otherwise. */ bool DicomValue::operator== (DicomValue &rhs) { bool retval = false; if (values.size() == rhs.values.size()) { std::vector::iterator it = values.begin(); std::vector::iterator it_end = values.end(); std::vector::iterator it_rhs = rhs.values.begin(); std::vector::iterator it_rhs_end = rhs.values.end(); for (; it < it_end; ++it, ++it_rhs) { if (it->Cmp(*it_rhs) == 0) { retval = true; } else { retval = false; break; } } } return retval; } std::ostream & jcs::operator<<(std::ostream &out, DicomValue &ve) { std::vector::iterator it = ve.values.begin(); std::vector::iterator it_end = ve.values.end(); for (; it < it_end; ++it) { out << static_cast(it->mb_str()) << " / "; } return out; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_AE &ae) { ae.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_AS &as) { as.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_AT &at) { wxUint32 n_read = 0; while (n_read < at.value_length) { at.val.transferSyntaxCode = at.transferSyntaxCode; in >> at.val; at.values.push_back(at.val); n_read += in.gcount(); } return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_CS &cs) { cs.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_DA &da) { da.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_DS &ds) { ds.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_DT &dt) { dt.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_FL &fl) { wxUint32 tmp; wxUint32 n_read = 0; while (n_read < fl.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = fl.EndianSwapUint32(tmp); fl.values.push_back((float)tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_FL &fl) { std::vector::iterator it = fl.values.begin(); std::vector::iterator it_end = fl.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_FD &fd) { wxUint64 tmp; wxUint32 n_read = 0; while (n_read < fd.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = fd.EndianSwapUint64(tmp); fd.values.push_back((double)tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_FD &fd) { std::vector::iterator it = fd.values.begin(); std::vector::iterator it_end = fd.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_IS &is) { is.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_LO &lo) { lo.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_LT <) { lt.GetStrings(in); return in; } /// /** Value multiplicity is always 1. */ std::istream & jcs::operator>> (std::istream &in, VR_OB &ob) { ob.GetStrings(in); return in; } /// /** Value multiplicity is always 1. */ std::istream & jcs::operator>> (std::istream &in, VR_OF &of) { wxUint32 tmp; wxUint32 n_read = 0; while (n_read < of.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = of.EndianSwapUint32(tmp); of.values.push_back((float)tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_OF &of) { std::vector::iterator it = of.values.begin(); std::vector::iterator it_end = of.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** Value multiplicity is always 1. */ std::istream & jcs::operator>> (std::istream &in, VR_OW &ow) { wxUint16 tmp; wxUint32 n_read = 0; while (n_read < ow.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = ow.EndianSwapUint16(tmp); ow.values.push_back((wxUint16)tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_OW &ow) { std::vector::iterator it = ow.values.begin(); std::vector::iterator it_end = ow.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_PN &pn) { pn.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_SH &sh) { sh.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_SL &sl) { wxInt32 tmp; wxUint32 n_read = 0; while (n_read < sl.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = sl.EndianSwapInt32(tmp); sl.values.push_back(tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_SL &sl) { std::vector::iterator it = sl.values.begin(); std::vector::iterator it_end = sl.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** Value multiplicity is always 1. */ std::istream & jcs::operator>> (std::istream &in, VR_SQ &sq) { return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_SS &ss) { wxInt16 tmp; wxUint32 n_read = 0; while (n_read < ss.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = ss.EndianSwapInt16(tmp); ss.values.push_back(tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_SS &ss) { std::vector::iterator it = ss.values.begin(); std::vector::iterator it_end = ss.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_ST &st) { st.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_TM &tm) { tm.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_UI &ui) { ui.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_UL &ul) { wxUint32 tmp; wxUint32 n_read = 0; while (n_read < ul.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = ul.EndianSwapUint32(tmp); ul.values.push_back(tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_UL &ul) { std::vector::iterator it = ul.values.begin(); std::vector::iterator it_end = ul.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** Value multiplicity is always 1. */ std::istream & jcs::operator>> (std::istream &in, VR_UN &un) { un.GetStrings(in); return in; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_US &us) { wxUint16 tmp; wxUint32 n_read = 0; while (n_read < us.value_length) { in.read((char *)&(tmp), sizeof(tmp)); tmp = us.EndianSwapUint16(tmp); us.values.push_back(tmp); n_read += in.gcount(); } return in; } /// /** */ std::ostream & jcs::operator<< (std::ostream &out, VR_US &us) { std::vector::iterator it = us.values.begin(); std::vector::iterator it_end = us.values.end(); for (; it < it_end; ++it) { out << *it << " / "; } return out; } /// /** */ std::istream & jcs::operator>> (std::istream &in, VR_UT &ut) { ut.GetStrings(in); return in; } mriconvert/SyngoMosaicHandler.h0000640000175000000620000000335012542632325016157 0ustar stevestaff/// SyngoMosaicHandler.h /** */ #ifndef SYNGO_MOSAIC_HANDLER_H #define SYNGO_MOSAIC_HANDLER_H #include #include #include #include #include #include "Dictionary.h" #include "DicomFile.h" #include "StringConvert.h" #include "Volume.h" #include "SyngoHandler.h" namespace jcs { class SyngoMosaicHandler : public SyngoHandler { public : SyngoMosaicHandler(const std::string& seriesUid); virtual int GetNumberOfSlices() const; virtual int GetRows(); virtual int GetColumns(); virtual std::vector GetStringInfo(); virtual bool IsMosaic() const { return true; } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } protected: virtual VolListType ReadVolIds(DicomFile& file); private : double GetPhaseFov() const; double GetRoFov() const; template void mGetVolumes(std::map >& v); }; }; #endif mriconvert/DicomElementInstance.cpp0000640000175000000620000001673012542632322017016 0ustar stevestaff/// DicomElementInstance.cpp /** */ #include "DicomElementInstance.h" using namespace jcs; /// /** Streams to a DicomElementInstance according to rules in DICOM Standard PS 3.5-2011 */ std::istream & jcs::operator>> (std::istream &in, DicomElementInstance &de) { de.tag.transferSyntaxCode = de.transferSyntaxCode; // Read DICOM Tag, determine VR, read Value Length. in >> de.tag; if (de.IsExplicitVR()) { // This form of in.get gets 2 chars and adds // the NULL terminator. in.get(de.vr_buff, 3); de.vr.assign(de.vr_buff); if (de.vr == "OB" || de.vr == "OW" || de.vr == "OF" || de.vr == "UT" || de.vr == "SQ" || de.vr == "UN" ) { in.ignore(2); in.read((char *)&(de.value_length), sizeof(de.value_length)); de.value_length = de.EndianSwapUint32(de.value_length); } else { wxUint16 vl; in.read((char *)&(vl), sizeof(vl)); de.value_length = vl; de.value_length = de.EndianSwapUint32(de.value_length); } } else { // implicit VR de.vr = de.GetVR(); in.read((char *)&(de.value_length), sizeof(de.value_length)); de.value_length = de.EndianSwapUint32(de.value_length); } // Now we can read the actual value(s). // First, load data into a string. wxUint32 n_to_read = de.value_length; std::string value; while (n_to_read > 0) { in.read(de.value_buff, std::min((long unsigned)sizeof(de.value_buff), (long unsigned)n_to_read)); n_to_read -= in.gcount(); value.append(de.value_buff, in.gcount()); } // Stream from string into the data handler. // NOTE: Should free this when done streaming to de.myValue. std::stringstream ss(value); // Create the data handler. This should really be implemented with a map to functions. // de.ReadStream[de.vr](ss); if (de.vr.compare("AE") == 0) { de.myValue = new VR_AE(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("AS") == 0) { de.myValue = new VR_AS(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("AT") == 0) { de.myValue = new VR_AT(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("CS") == 0) { de.myValue = new VR_CS(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("DA") == 0) { de.myValue = new VR_DA(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("DS") == 0) { de.myValue = new VR_DS(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("DT") == 0) { de.myValue = new VR_DT(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("FL") == 0) { de.myValue = new VR_FL(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("FD") == 0) { de.myValue = new VR_FD(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("IS") == 0) { de.myValue = new VR_IS(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("LO") == 0) { de.myValue = new VR_LO(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("LT") == 0) { de.myValue = new VR_LT(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("OB") == 0) { de.myValue = new VR_OB(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("OF") == 0) { de.myValue = new VR_OF(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("OW") == 0) { de.myValue = new VR_OW(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("PN") == 0) { de.myValue = new VR_PN(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("SH") == 0) { de.myValue = new VR_SH(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("SL") == 0) { de.myValue = new VR_SL(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("SQ") == 0) { de.myValue = new VR_SQ(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("SS") == 0) { de.myValue = new VR_SS(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("ST") == 0) { de.myValue = new VR_ST(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("TM") == 0) { de.myValue = new VR_TM(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("UI") == 0) { de.myValue = new VR_UI(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("UL") == 0) { de.myValue = new VR_UL(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("UN") == 0) { de.myValue = new VR_UN(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("US") == 0) { de.myValue = new VR_US(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } if (de.vr.compare("UT") == 0) { de.myValue = new VR_UT(de.value_length, de.transferSyntaxCode); ss >> *(dynamic_cast(de.myValue)); } return in; } /// /** Our canonical output streamer for DicomElementInstance. */ std::ostream & jcs::operator<< (std::ostream &out, DicomElementInstance &de) { out << de.tag << " "; out << de.vr << " "; out << de.value_length << " "; if (de.vr.compare("FL") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("FD") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("OF") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("OW") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("SL") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("SS") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("UL") == 0) { out << *(dynamic_cast(de.myValue)); } else if (de.vr.compare("US") == 0) { out << *(dynamic_cast(de.myValue)); } else out << *(de.myValue); return out; } /** DicomElementInstance::DicomElementInstance(Dictionary *dictionary) : mDicomDictionary(dictionary) { ReadStream[std::string("AE")] = { myValue = new VR_AE(value_length, transferSyntaxCode); ss >> *(dynamic_cast(myValue)); } } **/ /// /** Tests whether transferSyntaxCode suggests an Explicit Value Representation. */ bool DicomElementInstance::IsExplicitVR() { bool retval = false; if (transferSyntaxCode == LEE_CODE || transferSyntaxCode == BEE_CODE) { retval = true; } return retval; } std::string DicomElementInstance::GetVR() { return mDicomDictionary->Lookup(tag).vr; } wxUint32 DicomElementInstance::EndianSwapUint32(wxUint32 value) { if (transferSyntaxCode == BEE_CODE) { wxUINT32_SWAP_ON_LE(value); } else { wxUINT32_SWAP_ON_BE(value); } return value; } mriconvert/MRIConvert.ico0000640000175000000620000000627612542632322014750 0ustar stevestaff ¨ ( @   MMjj""%%R@@R@@5**II  -##]II{``x^^v\\|aaz__oVV5))C44†ii„gg‹mmŒnnooŽooŽoonn‚ee}aa=//SAAˆkkqqŸ||Ÿ||œzz—vvŸ||šyy™ww‘qqŠll{``3((€ddoo™xx›yy }}¦‚‚¸·¬‡‡zz•uu‡jj~bbH88WW^^DD33QQHH>=H;0ƒff˜ww }}¬‡‡©„„±ŠŠ³ŒŒ¥—uu£€€”tt…hhƒgg?2/VVrr||tt))!!oovvttGGMM€mDž{{›yyzz¬‡‡°‰‰¬‡‡«††¦‚‚Ÿ||{{—vv‘qqƒffŽoo3*#KKvvnnoo€€uu>>JC“ss—vvšxx›yy™xx£€€¢¨ƒƒ¬††ž{{—ww—vv€eeqqpo 77qqyyhh  iiyyoo##:0%˜ww˜ww›yyœzzŸ|| }}zz¤€€¡~~Ÿ}}›yy‰kk‡iiŠllfPM bbhh66--ccCC+"‹mmpp’rrpp”tt™xxœyyœzz˜vv•uuŒmm…hhˆjjjSR  <0,Šllpp“ss“sspp‘qq‹ll™ww—vv‰kk{``?20PP\\CC55PPOOKKkb „i_ˆkkŽoo“ss”tt˜ww‡lbXFB$<<==ZZ{{€€{{11,,tt€€\\ jjwwww&" #ZRup~{ xx::ooyyxxaa{{ˆˆŽŽ€€IIFFvvƒƒ~~mmqq}}qq++XXtt„„vvMM((nn€€kk ddŸŸss;;>>qq‚‚vvZZoo{{||llJJww„„pp>>ooyyWWIIttzzffkk~~jj66QQsswwSS&&kkzzddUUtthh33__ii88BBbbLL VVUU??OO..EE;;11EE!!BB;;  88@@$$==++3399 33qqwwoonnzz??RR{{gg ))uu||zz** hhyy{{YYoo}}€€==HH€€„„nn{{€€‚‚((ccƒƒ}}††UU00~~ƒƒ‡‡}} ttwwrr}}00FF„„‚‚uugg‡‡ww||bb~~}}SS77††ƒƒ||55kk22tt~~OO{{CCbbvvqquuCC€€~~::xx‰‰‚‚\\ 55MMFF  ffccjj##KKkkmmMM!!nnwwee^^zzjj44    //++&&,,@@44 ]]TT!! NNjjXX 77llrr''{{‚‚jj UU……}}''22}}ˆˆ__00zz‡‡„„--uuƒƒ††hhddtt<<@@llhh** FFjjllaa<<ttxx{{DD**ww{{vvvv==::KK""RR ))<<YYPP IIJJ$$PP,,ll66HHTT  !!** '' ((--##$$  ""    mriconvert/NiftiOutputter.h0000640000175000000620000002645012542632317015442 0ustar stevestaff/// NiftiOutputter.h /** */ #ifndef NIFTI_OUTPUTTER_H_ #define NIFTI_OUTPUTTER_H_ #include #include #include #include #include "SeriesHandler.h" #include "Basic3DOutputter.h" #include "BasicVolumeFormat.h" #include "NiftiVolume.h" #include "NiftiOutputterBase.h" namespace jcs { /// Basic NIfTY Outputter. class NiftiOutputter : public NiftiOutputterBase { public: NiftiOutputter(); ~NiftiOutputter(); int ConvertSeries(SeriesHandler* handler); private: static Options CreateOptions(); }; template class NiftiConversion: public Basic3DConversion { public: NiftiConversion(NiftiOutputterBase* outputter, SeriesHandler* handler); ~NiftiConversion(); protected: virtual void GetHeaderForSeries(); virtual void CompleteHeaderForVolume(std::pair > volPair); NiftiHeader* GetHeader() { return mHeader; } NiftiHeader* mHeader; virtual std::vector GetRotationMatrix(const VolId& id); std::vector DicomToNiftiQuat(std::vector rotation); }; template NiftiConversion::NiftiConversion(NiftiOutputterBase* outputter, SeriesHandler* handler) : Basic3DConversion(outputter, handler) { mHeader = new NiftiHeader(); } template NiftiConversion::~NiftiConversion() { delete mHeader; } /// /** */ template std::vector NiftiConversion::GetRotationMatrix(const VolId& id) { double image_size_x = this->mHandler->GetColumns() * this->mHandler->GetVoxelSize()[0]; double image_size_y = this->mHandler->GetRows() * this->mHandler->GetVoxelSize()[1]; std::vector ipp = this->mHandler->GetIppForFirstSlice(id); std::vector rotation = this->mHandler->GetRotationMatrix(id); std::vector r4; r4.push_back(-rotation.at(0)); r4.push_back(-rotation.at(1)); r4.push_back(rotation.at(2)); r4.push_back(0); r4.push_back(-rotation.at(3)); r4.push_back(-rotation.at(4)); r4.push_back(rotation.at(5)); r4.push_back(0); r4.push_back(-rotation.at(6)); r4.push_back(-rotation.at(7)); r4.push_back(rotation.at(8)); r4.push_back(0); r4.push_back(-ipp.at(0)); r4.push_back(-ipp.at(1)); r4.push_back(ipp.at(2)); r4.push_back(1); return r4; } /// /** */ template void NiftiConversion::GetHeaderForSeries() { mHeader->InitHeader(); mHeader->hdr.sizeof_hdr = 348; char freq_dim; char phase_dim; char slice_dim; std::string s; this->mHandler->Find("InPlanePhaseEncodingDirection", s); if (s == "ROW") { freq_dim = 2; phase_dim = 1; } else if (s == "COL") { freq_dim = 1; phase_dim = 2; } else { freq_dim = 0; phase_dim = 0; } slice_dim = 3; mHeader->SetDimInfo(freq_dim, phase_dim, slice_dim); int nVolumes = this->GetNumberOfVolumes(); int dimensionality = this->mOutputter->GetDimensionality(this->mHandler->GetSeriesUid()); if (dimensionality == 4 && nVolumes > 1) { mHeader->hdr.dim[0] = 4; mHeader->hdr.dim[4] = nVolumes; } else { mHeader->hdr.dim[0] = 3; mHeader->hdr.dim[4] = 1; } mHeader->hdr.dim[1] = this->mHandler->GetColumns(); mHeader->hdr.dim[2] = this->mHandler->GetRows(); mHeader->hdr.dim[3] = this->mHandler->GetNumberOfSlices(); // dim[3] recalculated in mConvert mHeader->hdr.dim[5] = 1; mHeader->hdr.dim[6] = 1; mHeader->hdr.dim[7] = 1; mHeader->hdr.intent_code = 0; int bits_allocated, pixel_rep, samples = 0; this->mHandler->Find("BitsAllocated", bits_allocated); this->mHandler->Find("PixelRepresentation", pixel_rep); this->mHandler->Find("SamplesPerPixel", samples); this->mHandler->Find("PhotometricInterpretation", s); if (s == "RGB") { mHeader->hdr.datatype = DT_RGB; } else { switch (bits_allocated + pixel_rep) { case 8 : mHeader->hdr.datatype = DT_UINT8; break; case 9 : mHeader->hdr.datatype = DT_INT8; break; case 16 : mHeader->hdr.datatype = DT_UINT16; break; case 17 : mHeader->hdr.datatype = DT_INT16; break; case 32 : mHeader->hdr.datatype = DT_UINT32; break; case 33 : mHeader->hdr.datatype = DT_INT32; break; default : mHeader->hdr.datatype = DT_UNKNOWN; } } mHeader->hdr.bitpix = bits_allocated * samples; mHeader->hdr.slice_start = 0; mHeader->hdr.slice_end = mHeader->hdr.dim[3] - 1; std::vectorvoxel_size = this->mHandler->GetVoxelSize(); mHeader->hdr.pixdim[1] = voxel_size[0]; mHeader->hdr.pixdim[2] = voxel_size[1]; mHeader->hdr.pixdim[3] = voxel_size[2]; // pixdim[3] recalculated during conversion if (dimensionality == 4 && nVolumes > 1) { mHeader->hdr.pixdim[4] = this->mHandler->GetVolumeInterval(); } else { mHeader->hdr.pixdim[4] = 0; } mHeader->hdr.pixdim[5] = 0; mHeader->hdr.pixdim[6] = 0; mHeader->hdr.pixdim[7] = 0; AoCode ac_order = this->mHandler->GetAcquisitionOrder(); switch (ac_order) { case ASCENDING: mHeader->hdr.slice_code = NIFTI_SLICE_SEQ_INC; break; case DESCENDING: mHeader->hdr.slice_code = NIFTI_SLICE_SEQ_DEC; break; case INTERLEAVED_ODD: mHeader->hdr.slice_code = NIFTI_SLICE_ALT_INC; break; case INTERLEAVED_EVEN: mHeader->hdr.slice_code = NIFTI_SLICE_ALT_INC2; break; default: mHeader->hdr.slice_code = NIFTI_SLICE_UNKNOWN; } char space_units = NIFTI_UNITS_MM; char time_units = NIFTI_UNITS_UNKNOWN; if (dimensionality == 4) { time_units = NIFTI_UNITS_SEC; } if (this->mOutputter->rescale) { mHeader->hdr.datatype = DT_FLOAT; mHeader->hdr.bitpix = 32 * samples; } mHeader->hdr.scl_slope = 1; // we'll fix it in "complete header" for rescale = 1 mHeader->hdr.scl_inter = 0; mHeader->hdr.xyzt_units = (space_units & 0x07) | (time_units & 0x38); mHeader->hdr.cal_max = 0; mHeader->hdr.cal_min = 0; mHeader->hdr.slice_duration = this->mHandler->GetSliceDuration()/1000.0; mHeader->hdr.toffset = 0; this->mHandler->Find("SeriesDescription", s); s.copy(mHeader->hdr.descrip, sizeof(mHeader->hdr.descrip)); mHeader->hdr.sform_code = NIFTI_XFORM_UNKNOWN; for (int i = 0; i < 4; ++i) { mHeader->hdr.srow_x[i] = 0; mHeader->hdr.srow_y[i] = 0; mHeader->hdr.srow_z[i] = 0; } mHeader->hdr.srow_x[0] = 1; mHeader->hdr.srow_y[1] = 1; mHeader->hdr.srow_z[2] = 1; NiftiOutputterBase* out = dynamic_cast(this->mOutputter); if (out->saveNii) { strcpy(mHeader->hdr.magic, "n+1"); mHeader->hdr.vox_offset = 352; } else { strcpy(mHeader->hdr.magic, "ni1"); mHeader->hdr.vox_offset = 0; } if (this->mHandler->IsDti()) { Basic3DConversion::WriteGradientFiles(); } } /// /** */ template void NiftiConversion::CompleteHeaderForVolume(std::pair > volPair) { // Calculate number of slices for this volume int n_slices = volPair.second.size(); mHeader->SetNumberOfSlices(n_slices); // Calculate voxel size in Z from slice spacing for multi-slice files if (n_slices > 1) { mHeader->SetSliceSpacing(volPair.second.GetSpacing()); } mHeader->hdr.qform_code = NIFTI_XFORM_SCANNER_ANAT; std::vector quat = DicomToNiftiQuat(GetRotationMatrix(volPair.first)); mHeader->hdr.qoffset_x = quat.at(0); mHeader->hdr.qoffset_y = quat.at(1); mHeader->hdr.qoffset_z = quat.at(2); mHeader->hdr.quatern_b = quat.at(3); mHeader->hdr.quatern_c = quat.at(4); mHeader->hdr.quatern_d = quat.at(5); double slope, intercept; if ((this->mOutputter->rescale == 0) && (this->mHandler->GetRescaleSlopeAndIntercept(volPair.first, slope, intercept))) { mHeader->hdr.scl_slope = slope; mHeader->hdr.scl_inter = intercept; } } /// /** Adapted from mat44_to_quatern from nifti_io */ template std::vector NiftiConversion::DicomToNiftiQuat(std::vector r) { std::vector quat; // first three items in vector are offsets quat.push_back(static_cast (r.at(12))); quat.push_back(static_cast (r.at(13))); quat.push_back(static_cast (r.at(14))); /* compute lengths of each column; these determine grid spacings */ double xd = sqrt( r.at(0)*r.at(0) + r.at(1)*r.at(1) + r.at(2)*r.at(2) ) ; double yd = sqrt( r.at(4)*r.at(4) + r.at(5)*r.at(5) + r.at(6)*r.at(6) ) ; double zd = sqrt( r.at(8)*r.at(8) + r.at(9)*r.at(9) + r.at(10)*r.at(10) ) ; /* if a column length is zero, patch the trouble */ if( xd == 0.0l ){ r.at(0) = 1.0l ; r.at(1) = r.at(2) = 0.0l ; xd = 1.0l ; } if( yd == 0.0l ){ r.at(5) = 1.0l ; r.at(4) = r.at(6) = 0.0l ; yd = 1.0l ; } if( zd == 0.0l ){ r.at(10) = 1.0l ; r.at(8) = r.at(9) = 0.0l ; zd = 1.0l ; } /* normalize the columns */ r.at(0) /= xd ; r.at(1) /= xd ; r.at(2) /= xd ; r.at(4) /= yd ; r.at(5) /= yd ; r.at(6) /= yd ; r.at(8) /= zd ; r.at(9) /= zd ; r.at(10) /= zd ; zd = r.at(0)*r.at(5)*r.at(10)-r.at(0)*r.at(6)*r.at(9)-r.at(1)*r.at(4)*r.at(10) +r.at(1)*r.at(6)*r.at(8)+r.at(2)*r.at(4)*r.at(9)-r.at(2)*r.at(5)*r.at(8) ; /* should be -1 or 1 */ if( zd <= 0 ){ mHeader->hdr.pixdim[0] = -1; r.at(8) = -r.at(8) ; r.at(9) = -r.at(9) ; r.at(10) = -r.at(10) ; } else { mHeader->hdr.pixdim[0] = 1; } /* now, compute quaternion parameters */ double a = r.at(0) + r.at(5) + r.at(10) + 1.0l; double b,c,d; if( a > 0.5l ) { /* simplest case */ a = 0.5l * sqrt(a) ; b = 0.25l * (r.at(6)-r.at(9)) / a ; c = 0.25l * (r.at(8)-r.at(2)) / a ; d = 0.25l * (r.at(1)-r.at(4)) / a ; } else { /* trickier case */ xd = 1.0 + r.at(0) - (r.at(5)+r.at(10)) ; /* 4*b*b */ yd = 1.0 + r.at(5) - (r.at(0)+r.at(10)) ; /* 4*c*c */ zd = 1.0 + r.at(10) - (r.at(0)+r.at(5)) ; /* 4*d*d */ if( xd > 1.0 ) { b = 0.5l * sqrt(xd) ; c = 0.25l* (r.at(4)+r.at(1)) / b ; d = 0.25l* (r.at(8)+r.at(2)) / b ; a = 0.25l* (r.at(6)-r.at(9)) / b ; } else { if( yd > 1.0 ) { c = 0.5l * sqrt(yd) ; b = 0.25l* (r.at(4)+r.at(1)) / c ; d = 0.25l* (r.at(9)+r.at(6)) / c ; a = 0.25l* (r.at(8)-r.at(2)) / c ; } else { d = 0.5l * sqrt(zd) ; b = 0.25l* (r.at(8)+r.at(2)) / d ; c = 0.25l* (r.at(9)+r.at(6)) / d ; a = 0.25l* (r.at(1)-r.at(4)) / d ; } } if( a < 0.0l ) { b=-b ; c=-c ; d=-d; a=-a; } } quat.push_back(static_cast(b)); quat.push_back(static_cast(c)); quat.push_back(static_cast(d)); return quat; } } #endif mriconvert/AchievaDtiHandler.h0000640000175000000620000000076212542632315015730 0ustar stevestaff /// /** */ #ifndef ACHIEVA_DTI_HANDLER_H #define ACHIEVA_DTI_HANDLER_H #include "SeriesHandler.h" namespace jcs { /// /** */ class AchievaDtiHandler : public SeriesHandler { public: AchievaDtiHandler(const std::string& seriesUid); virtual GradientInfo GetGradientInfo(); virtual bool IsDti() const { return true; } protected: virtual VolListType ReadVolIds(DicomFile& file); private: std::vector > gradients; }; }; #endif mriconvert/TextFileViewer.cpp0000750000175000000620000000203112542632311015657 0ustar stevestaff/// TextFileViewer.cpp /** */ #include #include #include #include #include #include "TextFileViewer.h" #include "fileformats.h" TextFileViewer::TextFileViewer(wxWindow* parent, const wxChar* caption) : wxFrame(parent, -1, wxString(caption, wxConvLocal)) { wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL); mTextCtrl = new wxTextCtrl(this, -1, _T(""), wxDefaultPosition, wxSize(400,400), wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH); frameSizer->Add(mTextCtrl, 1, wxEXPAND); std::istringstream input(fileformats_h, std::istringstream::in); if (!input.good()) { (*mTextCtrl) << _("problem opening istringstream::in\n"); } std::string str; while (getline(input, str)) { (*mTextCtrl) << wxString(str.c_str(), wxConvLocal) << _T("\n"); #ifdef __WXMSW__ (*mTextCtrl) << _T('\n'); #endif } // Scroll to the top of the text. mTextCtrl->SetInsertionPoint(0); SetSizer(frameSizer); frameSizer->Fit(this); } mriconvert/DicomFile.h0000640000175000000620000001215412542632332014261 0ustar stevestaff/// DicomFile.h /** Represents a file of DICOM format and its conents. */ #ifndef DICOMFILE_H_ #define DICOMFILE_H_ #include #include #include #include #include #include #include #include #include #include #include "Dictionary.h" #include "StringConvert.h" #include "Globals.h" #include "ReadStream.h" #include "DicomTags.h" //#include "ValueRepresentations.h" #include "Preamble.h" #include "MetaHeader.h" #include "MainHeader.h" namespace jcs { struct DicomTag; struct DicomElement; class Dictionary; class DicomFile { public : // Constructor/destructor //DicomFile(const char* pFileName); DicomFile(wxString pFileName); ~DicomFile(); // Export file void DataDump(const char *pFilename); std::vector DataDump(); int FindInSequence(const std::string& seq, DicomElement& d, std::vector& v); int FindInSequence(const std::string& seq, const char* str, std::vector& v); template int Find(DicomElement d, T& rValue); // Todo 20130215cdt: Find by DicomTag //template int Find(DicomTag t, T& rValue); template int Find(const std::string& s, T& rValue); template int PixelData(std::vector& data, std::streamsize data_length, double slope = 1, double intercept = 0, int frame = 0); // Or read directly into buffer...user must alloc/free mem template int PixelData(T* data, std::streamsize data_length); // These functions are for Syngo files only bool HasSiemensMrHeader(); bool GetCSAImageHeader(std::string& header); bool GetCSASeriesHeader(std::string& header); int ReadCSAImageHeader(const std::string& tag, std::string& value); int ReadCSAImageHeader(const std::string& tag, std::vector& value); int ReadCSASeriesHeader(const std::string& tag, std::string& value); int ReadCSASeriesHeader(const std::string& tag, std::vector& value); int ReadCSAHeader(const std::string& header, const std::string& tag, std::string& value); int ReadCSAHeader(const std::string& header, const std::string& tag, std::vector& value); bool IsBigEndian() const { return (mByteOrder == dBIG_ENDIAN); } bool IsOk(); //int GetHeaderSize(); //int GetFileSize(); const char* ErrorMessage() const; private : std::ifstream mInputFile; std::streampos mBeginning; std::streampos mPixelDataOffset; std::string mCharacterSet; MetaHeader mh; MainHeader main; // Error codes for DICOM files. enum ErrorCodes { NO_BYTES, NO_DICM, METAFILE_ERROR, TRANSFER_SYNTAX, NO_UID, NO_SERIES_UID, NO_INSTANCE, NO_IMAGE, NUM_CODES }; std::bitset mErrors; Dictionary* mDicom; Dictionary* mSpecial; const std::string mFileName; enum dicomEndianType { dLITTLE_ENDIAN, dBIG_ENDIAN } mByteOrder; enum VrSyntaxType { IMPLICIT_VR, EXPLICIT_VR } mVrSyntax; void mCheckOk(); bool mSkipPreamble(); bool mReadMetafile(); void mSetTransferSyntax(VrSyntaxType v, dicomEndianType b); bool mFindElement(const DicomTag& rTarget, DicomElement& rMatch, std::istream& input); std::vector mReadNextElementAll(); void mReadNextElement(DicomElement& e, std::istream& input); void mReadElementTag(DicomElement& e, std::istream& input); void mReadValueRepresentation(DicomElement& e, std::istream& input); void mReadValueLength(DicomElement& e, std::istream& input); template int mReadValue(DicomElement d, T& rValue, std::istream& input); // Specialization for strings int mReadValue(DicomElement d, std::string& rValue, std::istream& input); typedef std::vector (*read_ptr)(std::istream&, std::streamsize); std::map ReadMap; void mInitializeMap(); wxUint16 ByteSwap(wxUint16 value_to_swap) { return wxUINT16_SWAP_ON_BE(value_to_swap); } wxInt16 ByteSwap(wxInt16 value_to_swap) { return wxINT16_SWAP_ON_BE(value_to_swap); } wxUint32 ByteSwap(wxUint32 value_to_swap) { return wxUINT32_SWAP_ON_BE(value_to_swap); } wxInt32 ByteSwap(wxInt32 value_to_swap) { return wxINT32_SWAP_ON_BE(value_to_swap); } template int FindInStream(std::istream& input, DicomElement d, T& rValue); bool FindElement(DicomElement& d, std::istream& input); std::istream::pos_type GetPixelDataStart(); std::istream::pos_type pixelDataStart; bool foundPixelDataStart; bool FindCSAHeader(int or_val, std::string& value); bool IsSyngoFile(); }; } #include "DicomFile.txx" #endif mriconvert/Globals.h0000640000175000000620000000026212542632333014007 0ustar stevestaff/// Globals.h /** Variables available everywhere. */ #ifndef _GLOBALS_H_ #define _GLOBALS_H_ namespace jcs { extern bool verbose; extern bool quiet; } #endif mriconvert/ImageView.h0000640000175000000620000000407312542632322014303 0ustar stevestaff/// ImageView.h /** */ #ifndef IMAGE_VIEW_H #define IMAGE_VIEW_H #include #include #include #include class ImageViewerBase; class BitmapWindow : public wxWindow { public: BitmapWindow(ImageViewerBase* parent, const wxBitmap& bitmap); void SetBitmap(const wxBitmap& bitmap); void OnPaint(wxPaintEvent& event); void OnErase(wxEraseEvent& event); void OnMouseDown(wxMouseEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnDoubleClick(wxMouseEvent& event); private: DECLARE_EVENT_TABLE() wxBitmap mBitmap; wxPoint mPoint; ImageViewerBase* myParent; }; class ImageViewerBase: public wxFrame //Dialog { public: ImageViewerBase(wxWindow* parent, const wxString& title); virtual void UpdateImage() = 0; protected: void OnSlide(wxScrollEvent& event); void OnPlay(wxCommandEvent& event); void OnTimer(wxTimerEvent& event); void OnContextMenu(wxContextMenuEvent& event); void OnSave(wxCommandEvent& event); void OnSaveAll(wxCommandEvent& event); void SetImage(wxImage image); virtual void OnWindow(wxCommandEvent& event) {} void OnReset(wxCommandEvent& event); void OnClose(wxCommandEvent& event); BitmapWindow* mpBitmap; wxSlider* mpSliceSlider; private: DECLARE_EVENT_TABLE() wxButton* mpPlayButton; wxStaticText* mpText; wxTimer mTimer; wxImage mImage; }; class ImageViewer: public ImageViewerBase { public: ImageViewer(wxWindow* parent, const std::vector& filenames, const wxString& show_first); protected: void UpdateImage(); void OnWindow(wxCommandEvent& event); private: std::vector filenames; wxString showFirst; }; class MultiFrameImageViewer: public ImageViewerBase { public: MultiFrameImageViewer(wxWindow* parent, const wxString& filename); protected: void UpdateImage(); private: wxImage GetImage(int frame); bool CreateVolume(jcs::DicomFile& file); std::vector< std::vector > volume; bool goodVolume; int columns; int rows; int frames; }; #endif mriconvert/OutputterBase.h0000640000175000000620000001061012542632332015227 0ustar stevestaff/// OutputterBase.h /** */ #ifndef OUTPUTTER_BASE_H_ #define OUTPUTTER_BASE_H_ #include #include #include #include #include #include #include "OutputList.h" #include "SeriesHandler.h" #include "ConfigValues.h" namespace jcs { /// Container for output options. class Options { public: /// Pathname for config file. std::string pathname; /// Boolean options. std::map boolOptions; /// Integer options. std::map intOptions; /// String options. std::map stringOptions; /// Double options. std::map doubleOptions; /// Read option values from configuration file. void ReadConfig(); /// Write option values to configuration file. void WriteConfig(); }; /// Base class for all Outputter classes. /** Provides functionality common to all Outputters, including the loading and saving of configuration options. */ class OutputterBase { public : /// Constructor OutputterBase(const Options& options); virtual ~OutputterBase(); virtual void UpdateOutputForSeries(SeriesHandler* handler) = 0; virtual void RemoveSeries(const std::string& seriesUid) = 0; virtual int ConvertSeries(SeriesHandler* handler) = 0; ImageFileName GetImageFileName(const std::string& series_uid, const std::string& name); wxFileName GetFileName(const std::string& series_uid); void ChangeFileName(const std::string& series_uid, const std::string& new_name); void ChangeDirName(const std::vector& series_uids, const std::string& new_name, int position); /// Pure virtual since OutputterBase has no integer options. virtual void SetOption(const std::string& name, int value) {} virtual void SetOption(const std::string& name, bool value); /// /** Sets the boolOption 'split' to 'value'. \param value True means to save series in separate directories. */ void SetSplit(bool value) { mOptions.boolOptions["split_dir"] = value; } bool GetSplit() { return mOptions.boolOptions["split_dir"]; } void SetSplitSubj(bool value) { mOptions.boolOptions["split_subj"] = value; } bool GetSplitSubj() { return mOptions.boolOptions["split_subj"]; } void SetFlexFormat(bool value) { fnFlexFormat = value; } bool GetFlexFormat() { return fnFlexFormat; } void fnAppendComponent(wxString component) { fnComponents.Add(component); } OutputList mOutputList; // For management of output file naming. struct NameField { /// Name of the field, should follow canonical DICOM standard. std::string name; /// Indicates whether instance should be included in the output filename. bool value; /// Abbreviation, used by mcverter filename formatting string. wxString abbr; // Constructors NameField() {} NameField(std::string n, bool v) : name(n), value(v) {} NameField(std::string n, bool v, wxString a) : name(n), value(v), abbr(a) {} }; /// DICOM field names used for naming output files. enum { PatientName, PatientId, SeriesDate, SeriesTime, StudyId, StudyDescription, SeriesNumber, SequenceName, ProtocolName, SeriesDescription }; typedef std::map FieldMap; FieldMap defaultNameFields; // Use dfn to avoid using literal strings in code. Use // the above enum to provide keys. typedef std::map NameFields; NameFields dfn; NameFields abbr; protected : // Determines what kind of formatting to use for output filenames, // specifically in GenerateDefaultPrefix. bool fnFlexFormat; wxArrayString fnComponents; std::map volKeyMap; Options mOptions; std::map overrides; virtual void FillInDefaultDirs(ImageFileName& name, SeriesHandler* series); std::string GenerateDefaultPrefix(SeriesHandler* series); static Options GetBaseOptions(); bool FindIntInOverrides(const std::string& series_uid, const std::string& seek, int& value); bool FindBoolInOverrides(const std::string& series_uid, const std::string& seek, bool& value); }; } #endif mriconvert/BasicVolumeFormat.cpp0000640000175000000620000000570312542632333016346 0ustar stevestaff/// BasicVolumeFormat.cpp /** Responsible for writing target output files. */ #include #include #include #include #include #include "BasicVolumeFormat.h" using namespace jcs; /// /** */ BasicVolumeFormat::BasicVolumeFormat(const char* filename, const char* header_extension, const char* raw_extension) : mFileName(filename), mHeaderExtension(header_extension), mRawExtension(raw_extension) { wxFileName::Mkdir(mFileName.GetPath(wxPATH_GET_VOLUME), 0777, wxPATH_MKDIR_FULL); } /// /** */ BasicVolumeFormat::~BasicVolumeFormat() { if (mHeaderFile.is_open()) { mCloseHeaderFile(); } if (mRawDataFile.is_open()) { mCloseRawDataFile(); } } /// Tries to open a header file in given 'mode'. /** \param mode Open mode for file. \return Status code, false on bad file name, false on failure of 'open' call, true on success of 'open' call. */ int BasicVolumeFormat::mOpenHeaderFile(std::ios::openmode mode) { bool retval = false; if (mFileName.IsOk()) { if (mHeaderFile.is_open()) { mHeaderFile.close(); } mHeaderFile.clear(); mFileName.SetExt(mHeaderExtension); // Test possible overwrite condition. if (mFileName.FileExists()) { std::string errorMsg = "Warning: File exists, will overwrite "; errorMsg += mFileName.GetFullPath(); wxLogError(wxFormatString(errorMsg)); std::cout << errorMsg << std::endl; } mHeaderFile.open((const char *) mFileName.GetFullPath(), mode); retval = mHeaderFile.good(); } return retval; } /// Writes 'n_bytes' of 'data'. /** Overwrites a non-open file, appends to an open file. \param data Pointer to data to be written. \param n_bytes Number of bytes to write. \return Status code, false on file failure, true on success. */ int BasicVolumeFormat::AppendRawData(char* data, size_t n_bytes) { int retval = false; wxString extUsed; std::ios_base::openmode o_mode = std::ios::out | std::ios::binary; if (mRawExtension != _T("")) { extUsed = mRawExtension; o_mode |= std::ios::trunc; } else { extUsed = mHeaderExtension; o_mode |= std::ios::app; } mFileName.SetExt(extUsed); if (mFileName.IsOk()) { if (!mRawDataFile.is_open()) { if (mRawExtension != _T("")) { mRawDataFile.clear(); } // Test possible overwrite condition. if (mFileName.FileExists() && (o_mode & std::ios::trunc)) { std::string errorMsg = "Warning: File exists, will overwrite "; errorMsg += mFileName.GetFullPath(); wxLogError(wxFormatString(errorMsg)); std::cout << errorMsg << std::endl; } mRawDataFile.open((const char *) mFileName.GetFullPath(), o_mode); } if (mRawDataFile.good()) { mRawDataFile.write(data, n_bytes); retval = true; } } return retval; } mriconvert/GeEpiHandler.h0000640000175000000620000000053012542632336014714 0ustar stevestaff/// /** */ #ifndef GE_EPI_HANDLER_H #define GE_EPI_HANDLER_H #include "SeriesHandler.h" namespace jcs { /// /** */ class GeEpiHandler : public SeriesHandler { public: GeEpiHandler(const std::string& seriesUid); protected: virtual VolListType ReadVolIds(DicomFile& file); }; } #endif mriconvert/DicomTree.h0000640000175000000620000000117712542632322014303 0ustar stevestaff/// DicomTree.h /** Defines DicomTreeCtrl, the control that holds the list of inputs to process. */ #ifndef DICOM_TREE_H #define DICOM_TREE_H #include "jcsTree.h" namespace jcs { class SeriesHandler; class DicomTreeCtrl : public jcsTreeCtrl { public: DicomTreeCtrl(wxWindow* parent, wxWindowID id, long more_styles); DicomTreeCtrl(wxWindow* parent, wxWindowID id); void AddSeries(SeriesHandler* series); std::vector GetChildSeries(wxTreeItemId branch); std::vector GetFilenames(); std::vector GetFilesInSeries(const wxTreeItemId item); }; } #endif mriconvert/McPanel.h0000640000175000000620000000545612542632311013751 0ustar stevestaff/// McPanel.h /** Main user interface within McFrame. */ #ifndef MC_PANEL_H #define MC_PANEL_H #include #include #include #include "OutputTreeNew.h" #include "OutputterBase.h" namespace jcs { class Converter; class DicomTreeCtrl; class OutputTreeCtrl; } class wxTreeEvent; class wxSpinCtrl; /// Tooltip button /** Convenience class, creates a button with tool tip. */ class ttButton : public wxButton { public: ttButton(wxWindow* parent, wxWindowID window, const wxString& ButtonText, const wxString& HelpText) : wxButton(parent, window, ButtonText) { SetToolTip(HelpText); } }; // Define a new frame type class McPanel : public wxPanel { public: McPanel(wxWindow* parent); ~McPanel(); // event handlers void OnAddDir(wxCommandEvent& event); void OnAddFiles(wxCommandEvent& event); void OnRemove(wxCommandEvent& event); void OnInfo(wxCommandEvent& event); void OnDirectory(wxCommandEvent& event); void OnNew (wxCommandEvent& event); void OnConvert (wxCommandEvent& event); void OnRename(wxCommandEvent& event); void OnDicom(wxCommandEvent& event); void OnImage(wxCommandEvent& event); void OnOptions (wxCommandEvent& event); void OnQuit(wxCommandEvent& event); void OnChoiceOutput(wxCommandEvent& event); void OnContextMenu(wxContextMenuEvent& event); void OnDropFiles(wxDropFilesEvent& event); void OnSourceSelect(wxTreeEvent& event); void OnOutputSelect(wxTreeEvent& event); void OnEditEnd (wxTreeEvent& event); void OnEditBegin(wxTreeEvent& event); void OnOverride(const std::string& seriesUid); void OnMenuOverride(); enum { COMMAND_REMOVE, COMMAND_DICOM, COMMAND_INFO, COMMAND_IMAGE, COMMAND_ADD_FILES, COMMAND_ADD_DIR, COMMAND_OPTIONS, COMMAND_DIRECTORY, COMMAND_NEW, COMMAND_CONVERT, COMMAND_RENAME, CHOICE_OUTPUT, SOURCE_CTRL, OUTPUT_CTRL }; protected: DECLARE_EVENT_TABLE() private: void SetPathInfo(wxString path); jcs::DicomTreeCtrl* mpSourceCtrl; jcs::NewOutputTreeCtrl* mpOutputCtrl; ttButton* mpRemoveButton; ttButton* mpRenameButton; ttButton* mpOptionsButton; wxChoice* mpOutputChooser; int m_output_type; wxStaticText* mpPathInfo; jcs::Converter* mpConverter; void SetSplitDirs(bool split); void SetSplitSubj(bool split); void RefreshSourceCtrl(); void ResetOutput(); void UpdateOutputCtrl(); void ShowMessageBox(); void mAddSomeFilesDialog(wxArrayString files, const wxChar* msg = _("Adding files...")); friend class jcs::NewOutputTreeCtrl; bool ShowOptionsDlg(int type, jcs::OutputterBase* outputter); bool ShowOverride(int type, jcs::OutputterBase* outputter, const std::string& series_uid); }; #endif mriconvert/OutputterBase.cpp0000640000175000000620000003707612542632326015604 0ustar stevestaff/// OutputterBase.cpp /** Handles naming of output directories and files. Handles reading and writing of end-user output options. */ #include "OutputterBase.h" using namespace jcs; /// /** Retrieves all Options values from the user's configuration file. */ void Options::ReadConfig() { #ifndef NO_CONFIG wxString oldPath = wxConfig::Get()->GetPath(); wxConfig::Get()->SetPath("/" + pathname); std::map::iterator bool_it = boolOptions.begin(); std::map::iterator bool_it_end = boolOptions.end(); for (; bool_it != bool_it_end; ++bool_it) { wxConfig::Get()->Read(bool_it->first, &bool_it->second, bool_it->second); } std::map::iterator int_it = intOptions.begin(); std::map::iterator int_it_end = intOptions.end(); for (; int_it != int_it_end; ++int_it) { wxConfig::Get()->Read(int_it->first, &int_it->second, int_it->second); } std::map::iterator string_it = stringOptions.begin(); std::map::iterator string_it_end = stringOptions.end(); for (; string_it != string_it_end; ++string_it) { wxConfig::Get()->Read(string_it->first, &string_it->second, string_it->second); } std::map::iterator double_it = doubleOptions.begin(); std::map::iterator double_it_end = doubleOptions.end(); for (; double_it != double_it_end; ++double_it) { wxConfig::Get()->Read(double_it->first, &double_it->second, double_it->second); } wxConfig::Get()->SetPath(oldPath); #endif } /// /** Stores all Options values to the user's configuration file. */ void Options::WriteConfig() { #ifndef NO_CONFIG wxString oldPath = wxConfig::Get()->GetPath(); wxConfig::Get()->SetPath("/" + pathname); std::map::iterator bool_it = boolOptions.begin(); std::map::iterator bool_it_end = boolOptions.end(); for (; bool_it != bool_it_end; ++bool_it) { wxConfig::Get()->Write(bool_it->first, bool_it->second); } std::map::iterator int_it = intOptions.begin(); std::map::iterator int_it_end = intOptions.end(); for (; int_it != int_it_end; ++int_it) { wxConfig::Get()->Write(int_it->first, int_it->second); } std::map::iterator string_it = stringOptions.begin(); std::map::iterator string_it_end = stringOptions.end(); for (; string_it != string_it_end; ++string_it) { wxConfig::Get()->Write(string_it->first, string_it->second); } std::map::iterator double_it = doubleOptions.begin(); std::map::iterator double_it_end = doubleOptions.end(); for (; double_it != double_it_end; ++double_it) { wxConfig::Get()->Write(double_it->first, double_it->second); } wxConfig::Get()->SetPath(oldPath); #endif } /// /** Loads option values from the user's configuration file, if found. Populates the 'defaultNameFields' array. \param options A reference to an Options object. */ OutputterBase::OutputterBase(const Options& options) : mOptions(options) { mOptions.ReadConfig(); fnFlexFormat = false; // These values must match DicomElement names as defined in // DicomDictionary.h to enable successful lookups. // That is, they must be canonical DICOM element names. dfn[PatientName] = "PatientName"; dfn[PatientId] = "PatientID"; dfn[SeriesDate] = "SeriesDate"; dfn[SeriesTime] = "SeriesTime"; dfn[StudyId] = "StudyID"; dfn[StudyDescription] = "StudyDescription"; dfn[SeriesNumber] = "SeriesNumber"; dfn[SequenceName] = "SequenceName"; dfn[ProtocolName] = "ProtocolName"; dfn[SeriesDescription] = "SeriesDescription"; abbr[PatientName] = "PN"; abbr[PatientId] = "PI"; abbr[SeriesDate] = "SD"; abbr[SeriesTime] = "ST"; abbr[StudyId] = "SI"; abbr[StudyDescription] = "TD"; abbr[SeriesNumber] = "SN"; abbr[SequenceName] = "SQ"; abbr[ProtocolName] = "PR"; abbr[SeriesDescription] = "RD"; defaultNameFields[PatientName] = NameField(dfn[PatientName], mOptions.boolOptions[dfn[PatientName]], abbr[PatientName]); defaultNameFields[PatientId] = NameField(dfn[PatientId], mOptions.boolOptions[dfn[PatientId]], abbr[PatientId]); defaultNameFields[SeriesDate] = NameField(dfn[SeriesDate], mOptions.boolOptions[dfn[SeriesDate]], abbr[SeriesDate]); defaultNameFields[SeriesTime] = NameField(dfn[SeriesTime], mOptions.boolOptions[dfn[SeriesTime]], abbr[SeriesTime]); defaultNameFields[StudyId] = NameField(dfn[StudyId], mOptions.boolOptions[dfn[StudyId]], abbr[StudyId]); defaultNameFields[StudyDescription] = NameField(dfn[StudyDescription], mOptions.boolOptions[dfn[StudyDescription]], abbr[StudyDescription]); defaultNameFields[SeriesNumber] = NameField(dfn[SeriesNumber], mOptions.boolOptions[dfn[SeriesNumber]], abbr[SeriesNumber]); defaultNameFields[SequenceName] = NameField(dfn[SequenceName], mOptions.boolOptions[dfn[SequenceName]], abbr[SequenceName]); defaultNameFields[ProtocolName] = NameField(dfn[ProtocolName], mOptions.boolOptions[dfn[ProtocolName]], abbr[ProtocolName]); defaultNameFields[SeriesDescription] = NameField(dfn[SeriesDescription], mOptions.boolOptions[dfn[SeriesDescription]], abbr[SeriesDescription]); } /// The Destructor /** Gathers option values and writes a configuration file for the user. */ OutputterBase::~OutputterBase() { mOptions.boolOptions[dfn[PatientName]] = defaultNameFields[PatientName].value; mOptions.boolOptions[dfn[PatientId]] = defaultNameFields[PatientId].value; mOptions.boolOptions[dfn[SeriesDate]] = defaultNameFields[SeriesDate].value; mOptions.boolOptions[dfn[SeriesTime]] = defaultNameFields[SeriesTime].value; mOptions.boolOptions[dfn[StudyId]] = defaultNameFields[StudyId].value; mOptions.boolOptions[dfn[StudyDescription]] = defaultNameFields[StudyDescription].value; mOptions.boolOptions[dfn[SeriesNumber]] = defaultNameFields[SeriesNumber].value; mOptions.boolOptions[dfn[SequenceName]] = defaultNameFields[SequenceName].value; mOptions.boolOptions[dfn[ProtocolName]] = defaultNameFields[ProtocolName].value; mOptions.boolOptions[dfn[SeriesDescription]] = defaultNameFields[SeriesDescription].value; mOptions.WriteConfig(); } /// /** Create and initialize an Options object with program default values for output operations. Options set here apply to all derivative outputters. \return an Options object initialized to program defaults. */ Options OutputterBase::GetBaseOptions() { Options options; // Flag whether to save in separate directories. options.boolOptions["split_dir"] = true; options.boolOptions["split_subj"] = true; // Options pertaining to output file naming. options.boolOptions["PatientName"] = true; options.boolOptions["PatientID"] = false; options.boolOptions["SeriesDate"] = true; options.boolOptions["SeriesTime"] = false; options.boolOptions["StudyID"] = true; options.boolOptions["StudyDescription"] = false; options.boolOptions["SeriesNumber"] = true; options.boolOptions["SequenceName"] = false; options.boolOptions["ProtocolName"] = true; options.boolOptions["SeriesDescription"] = true; return options; } /// /** Generate and return a filename prefix according to program rules and user selection. \param series A pointer to a SeriesHandler \return A string to be used as a prefix for output files */ std::string OutputterBase::GenerateDefaultPrefix(SeriesHandler* series) { std::string prefix; if (!fnFlexFormat) { std::string pn = ""; bool first = true; FieldMap::iterator it = defaultNameFields.begin(); FieldMap::iterator it_end = defaultNameFields.end(); for (; it != it_end; ++it) { if (it->second.value) { std::string str; if (series->Find(it->second.name, str)) { // If using protocol name AND series description, don't use // both if they are the same if (it->second.name == dfn[ProtocolName]) { pn = str; } else { if (str == pn) { continue; } } // Separate filename elements with an underscore character. if (!first) { prefix.append("_"); } // Any numbers should be padded out to at least 3 digits if (itos(stoi(str)) == str) { str = itos(stoi(str), 3); } prefix.append(str); first = false; } } } prefix = wxString::From8BitData(prefix.c_str()); } else { std::string str; FieldMap::iterator it, it_end; wxArrayString::iterator arr_it = fnComponents.begin(); wxArrayString::iterator arr_it_end = fnComponents.end(); for (; arr_it != arr_it_end; ++arr_it) { bool lookup = false; it = defaultNameFields.begin(); it_end = defaultNameFields.end(); for (; it != it_end; ++it) { if (arr_it->IsSameAs(it->second.abbr)) { lookup = true; if (series->Find(it->second.name, str)) { // Any numbers should be padded out to at least 3 digits if (itos(stoi(str)) == str) { str = itos(stoi(str), 3); } prefix.append(wxString::From8BitData(str.c_str())); } break; } } if (!lookup) { prefix.append(*arr_it); } } } // If prefix ends up empty, set it to a useful default value. if (prefix.empty()) { prefix = "output"; } return RemoveInvalidChars(prefix); } /// /** Fills in default dirs \param name \param series */ void OutputterBase::FillInDefaultDirs(ImageFileName& name, SeriesHandler* series) { name.ResetPath(); if (GetSplitSubj()) { // This mess is because subject name in DICOM files is often coded as Unicode. // Translation is needed to match filesystem UTF-8. std::string subject_dir = wxString::From8BitData(series->seriesInfo.subject_name.c_str()).ToStdString(); if (subject_dir.empty()) { subject_dir = series->seriesInfo.subject_id; } subject_dir = RemoveInvalidChars(subject_dir); if (subject_dir.empty()) { subject_dir = "unknown"; } name.AppendDir(subject_dir, subject_dir); } if (GetSplit()) { std::string series_dir = series->seriesInfo.study_number + "_" + series->seriesInfo.series_number; if (!series->seriesInfo.series_description.empty()) { series_dir.append("_"); series_dir.append(series->seriesInfo.series_description); } if (!series->seriesInfo.SeriesDate.empty()) { series_dir.append("_"); series_dir.append(series->seriesInfo.SeriesDate); } series_dir = RemoveInvalidChars(series_dir); name.AppendDir(series->GetSeriesUid(), series_dir); } } /// /** Gets the Image file name. \param series_uid \param name Name of file to match. \return Existing ImageFileName object if found in mOutputList, otherwise a new object. */ ImageFileName OutputterBase::GetImageFileName(const std::string& series_uid, const std::string& name) { ImageFileName retval = ImageFileName(); OutputList::ListType::iterator pos = mOutputList.fileNameList.lower_bound(series_uid); OutputList::ListType::iterator end_pos = mOutputList.fileNameList.end(); for (; pos != end_pos; ++pos) if (pos->second.GetFullName() == name) { retval = pos->second; break; } return retval; } /// /** Gets the file name for the SeriesUid. \param series_uid SeriesUid to act upon. \return A wxFileName */ wxFileName OutputterBase::GetFileName(const std::string& series_uid) { wxFileName name(_T("error")); OutputList::ListType::iterator pos = mOutputList.fileNameList.lower_bound(series_uid); if (pos != mOutputList.fileNameList.end()) { name = wxFileName(mOutputList.rootDir + wxFileName::GetPathSeparator() + pos->second.GetFullPath()); } return name; } /// /** Changes the file name of the given SeriesUid \param series_uid The SeriesUid to act upon. \param new_name The new name to bestow. */ void OutputterBase::ChangeFileName(const std::string& series_uid, const std::string& new_name) { OutputList::ListType::iterator pos; pos = mOutputList.fileNameList.lower_bound(series_uid); while (pos != mOutputList.fileNameList.end() && !pos->first.compare(0, series_uid.size(), series_uid)) { if (pos->second.isRenameable) { pos->second.SetPrefix(new_name); } ++pos; } } /// /** Changes the directory for a vector of SeriesUids \param series_uids The vector of SeriesUids to change. \param new_name The new directory name \param position */ void OutputterBase::ChangeDirName(const std::vector& series_uids, const std::string& new_name, int position) { std::vector::const_iterator it = series_uids.begin(); std::vector::const_iterator it_end = series_uids.end(); for (; it != it_end; ++it) { OutputList::ListType::iterator pos; pos = mOutputList.fileNameList.lower_bound(*it); while (pos != mOutputList.fileNameList.end() && !pos->first.compare(0, it->size(), *it)) { pos->second.SetDirName(position, new_name); ++pos; } } } /// Sets a boolean option. /** Two boolean options exist, split by subject ("split_subj"), and split by series ("split_dir"). \param name Name of the option. \param value Value of the option. */ void OutputterBase::SetOption(const std::string& name, bool value) { if (name.find("split_dir") != std::string::npos) { SetSplit(value); } if (name.find("split_subj") != std::string::npos) { SetSplitSubj(value); } } /// Seeks an integer override. /** Discovers whether there is an 'overrides' entry for 'series_uid'. If so, sets 'value' to its value and returns true, otherwise returns false. \param series_uid String representing a SeriesUid. \param seek String representing an Option value. \param value Option value is returned in this parameter. \return True if an override is found, false otherwise. */ bool OutputterBase::FindIntInOverrides(const std::string& series_uid, const std::string& seek, int& value) { bool retval = false; std::map::const_iterator pos = overrides.find(series_uid); if (pos != overrides.end()) { std::map ::const_iterator find_seek = pos->second.intOptions.find(seek); if (find_seek != pos->second.intOptions.end()) { value = find_seek->second; retval = true; } } return retval; } /// Seeks a boolean override. /** Discovers whether there is an 'overrides' entry for 'series_uid'. If so, sets 'value' to its value and returns true, otherwise returns false. \param series_uid String representing a SeriesUid. \param seek String representing an Option value. \param value Option value is returned in this parameter. \return True if an override is found, false otherwise. */ bool OutputterBase::FindBoolInOverrides(const std::string& series_uid, const std::string& seek, bool& value) { bool retval = false; std::map::const_iterator pos = overrides.find(series_uid); if (pos != overrides.end()) { std::map::const_iterator find_seek = pos->second.boolOptions.find(seek); if (find_seek != pos->second.boolOptions.end()) { value = find_seek->second; retval = true; } } return retval; } mriconvert/MetaOptionsDlg.cpp0000640000175000000620000000641212542632322015651 0ustar stevestaff/// MetaOptionsDlg.cpp /** */ #include #include #include #include "MetaOptionsDlg.h" #include "NewMetaOutputter.h" using namespace jcs; BEGIN_EVENT_TABLE(MetaOptionsDlg, wxDialog) EVT_BUTTON(wxID_OK, MetaOptionsDlg::OnOkay) EVT_BUTTON(wxID_CLEAR, MetaOptionsDlg::OnClear) END_EVENT_TABLE() /// /** */ MetaOptionsDlg::MetaOptionsDlg(NewMetaOutputter* outputter) : BasicOptionsDlg(_("MetaImage options"), outputter), mOutputter(outputter) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dlgSizer->Add(myPanel); wxString check_text(_("Save header only ")); mpHeaderOnlyCheck = new wxCheckBox(this, -1, check_text); mpHeaderOnlyCheck->SetValue(mOutputter->SaveHeaderOnly()); dlgSizer->Add(mpHeaderOnlyCheck, 0, wxALL, 10); dlgSizer->Add(new wxStaticText(this, -1, _("Add fields")), 0, wxTOP|wxLEFT, 10); mpCheckList = new wxCheckListBox(this, -1); Dictionary* dicom = Dicom_Dictionary::Instance(); std::vector tagList = dicom->TagList(); for (unsigned int i = 0; i < tagList.size(); ++i) { mAddTag(tagList.at(i)); } mpCheckList->SetSize(mpCheckList->GetBestSize()); dlgSizer->Add(mpCheckList, 1, wxEXPAND|wxALL, 10); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); buttonSizer->Add(new wxButton(this, wxID_CLEAR, _("Clear fields")), 0, wxRIGHT, 10); wxButton* okayButton = new wxButton(this, wxID_OK, _("Okay")); buttonSizer->Add(okayButton, 0, wxRIGHT, 10); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); okayButton->SetDefault(); dlgSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); mNeedsRebuild = false; } /// /** */ void MetaOptionsDlg::SetFields(std::vector fields) { for (unsigned int i = 0; i < fields.size(); ++i) { mCheckItem(fields.at(i)); } } /// /** */ std::vector MetaOptionsDlg::GetFields() const { std::vector fields; int n_items = mpCheckList->GetCount(); for (int i = 0; i < n_items; ++i) { if (mpCheckList->IsChecked(i)) { fields.push_back(static_cast(mpCheckList->GetString(i).mb_str(wxConvLocal))); } } return fields; } /// /** */ int MetaOptionsDlg::mAddTag(const std::string tag) { if (tag.compare(0, 2, "Mf")) { // ignore metafile elements mpCheckList->Append(wxString(tag.c_str(), wxConvLocal)); } return 1; } /// /** */ int MetaOptionsDlg::mCheckItem(const std::string item) { int index = mpCheckList->FindString(wxString(item.c_str(), wxConvLocal)); mpCheckList->Check(index); return 1; } /// /** */ void MetaOptionsDlg::OnClear(wxCommandEvent& event) { int n_items = mpCheckList->GetCount(); for (int i = 0; i < n_items; ++i) mpCheckList->Check(i, false); } /// /** */ void MetaOptionsDlg::OnOkay(wxCommandEvent& event) { bool rbld = Rebuild(); bool nfSave = SaveNameFields(); bool hdrOnly = (SaveHeaderOnly() != mOutputter->SaveHeaderOnly()); mNeedsRebuild = rbld || hdrOnly || nfSave; BasicOptionsDlg::OnOkay(event); mOutputter->SetSaveHeader(SaveHeaderOnly()); mOutputter->fields = GetFields(); EndModal(event.GetId()); } mriconvert/AnalyzeOutputter.cpp0000750000175000000620000001312212542632325016320 0ustar stevestaff/// AnalyzeOutputter.cpp /** Encapsulates the logic of the Analyze format. */ #include #include #include #include #include "SeriesHandler.h" #include "AnalyzeVolume.h" #include "AnalyzeOutputter.h" using namespace jcs; /// /** */ AnalyzeOutputter::AnalyzeOutputter() : Basic3DOutputter(CreateOptions()) { } /// /** */ Options AnalyzeOutputter::CreateOptions() { Options options = Get3DOptions(); options.pathname = "Analyze"; return options; } /// /** */ BasicVolumeFormat* AnalyzeOutputter::GetOutputVolume(const char* file) { //return new AnalyzeVolume(file, headerExtension.mb_str(wxConvLocal), rawExtension.mb_str(wxConvLocal)); return new AnalyzeVolume(file, headerExtension, rawExtension); } /// /** Creates an instance of AnalyzeConversion capable of handling the incoming DICOM pixel data. \param handler A pointer to the SeriesHandler. \return 1 */ int AnalyzeOutputter::ConvertSeries(SeriesHandler* handler) { int bits_allocated, pixel_rep = 0; handler->Find("BitsAllocated", bits_allocated); handler->Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 8 : { AnalyzeConversion conversion(this, handler); conversion.Convert(); break; } case 9 : { AnalyzeConversion conversion(this, handler); conversion.Convert(); break; } case 16 : { AnalyzeConversion conversion(this, handler); conversion.Convert(); break; } case 17 : { AnalyzeConversion conversion(this, handler); conversion.Convert(); break; } case 32 : { AnalyzeConversion conversion(this, handler); conversion.Convert(); break; } case 33 : { AnalyzeConversion conversion(this, handler); conversion.Convert(); break; } default : { wxLogMessage(_("BitsAllocated and PixelRepresentation values (%d, %d) not supported."), bits_allocated, pixel_rep); } } return 1; } /// /** */ template AnalyzeConversion::AnalyzeConversion(Basic3DOutputter* outputter, SeriesHandler* handler) : Basic3DConversion(outputter, handler) { mHeader = new AnalyzeHeader(); } /// /** */ template AnalyzeConversion::~AnalyzeConversion() { delete mHeader; } /// /** */ template void AnalyzeConversion::ProcessSlice(std::vector& slice) { // rotate 180 reverse(slice.begin(), slice.end()); // flip L/R unsigned int row_size = mHeader->dime.dim[1]; if (this->mHeader->dime.datatype == 128) { //rgb row_size *= 3; } typename std::vector::iterator row_begin = slice.begin(); while (row_begin < slice.end()) { typename std::vector::iterator row_end = row_begin + row_size; reverse(row_begin, row_end); row_begin = row_end; } } /// /** */ template void AnalyzeConversion::GetHeaderForSeries() { mHeader->InitHeader(); std::string s; this->mHandler->Find("SeriesDate", s); s.copy(mHeader->hist.exp_date, sizeof(mHeader->hist.exp_date)); this->mHandler->Find("SeriesTime", s); s.copy(mHeader->hist.exp_time, sizeof(mHeader->hist.exp_time)); this->mHandler->Find("SeriesDescription", s); s.copy(mHeader->hist.descrip, sizeof(mHeader->hist.descrip)); this->mHandler->Find("PatientName", s); s.copy(mHeader->hist.patient_id, sizeof(mHeader->hist.patient_id)); float fvar; this->mHandler->Find("RepetitionTime", fvar); mHeader->dime.pixdim[4] = fvar; mHeader->dime.dim[1] = this->mHandler->GetColumns(); mHeader->dime.dim[2] = this->mHandler->GetRows(); mHeader->dime.dim[3] = this->mHandler->GetNumberOfSlices(); // dim[3] recalculated in mConvert std::vectorvoxel_size = this->mHandler->GetVoxelSize(); mHeader->dime.pixdim[1] = static_cast(voxel_size[0]); mHeader->dime.pixdim[2] = static_cast(voxel_size[1]); mHeader->dime.pixdim[3] = static_cast(voxel_size[2]); // pixdim[3] recalculated in mConvert this->mHandler->Find("PhotometricInterpretation", s); if (s == "RGB") { mHeader->dime.datatype = 128; // DT_RGB } else { this->mHandler->Find("BitsAllocated", mHeader->dime.bitpix); // Standard Analyze data types don't include // either unsigned 16 bit or signed 8 bit switch (mHeader->dime.bitpix) { case 16 : mHeader->dime.datatype = 4; // DT_SIGNED_SHORT break; case 8 : mHeader->dime.datatype = 8; // DT_UNSIGNED_CHAR break; default : mHeader->dime.datatype = 0; // DT_UNKNOWN } } // Write/calculate remaining fields mHeader->hk.sizeof_hdr = 348; mHeader->dime.dim[0] = 4; mHeader->dime.dim[4] = 1; // one volume per file by default int dimensionality = this->mOutputter->GetDimensionality(this->mHandler->GetSeriesUid()); if (dimensionality == 4) { mHeader->dime.dim[4] = this->GetNumberOfVolumes(); } mHeader->dime.vox_offset = 0; mHeader->hk.regular = 'r'; // all volumes same size } /// /** */ template void AnalyzeConversion::CompleteHeaderForVolume(std::pair > volPair) { // Calculate number of slices for this volume int n_slices = volPair.second.size(); mHeader->SetNumberOfSlices(n_slices); // Calculate voxel size in Z from slice spacing for multi-slice files if (n_slices > 1) { mHeader->SetSliceSpacing(volPair.second.GetSpacing()); } } mriconvert/DicomFile.cpp0000640000175000000620000007305212542632333014621 0ustar stevestaff/// DicomFile.cpp /** */ #include "DicomFile.h" #include "utf8proc-v1.1.6/utf8proc.h" using namespace jcs; //DicomFile::DicomFile(const char* filename) DicomFile::DicomFile(wxString filename) : mVrSyntax(EXPLICIT_VR), mByteOrder(dLITTLE_ENDIAN), mFileName(filename), mBeginning(0) //, //mInputFile(filename, std::ios::binary) { mErrors.reset(); mDicom = Dicom_Dictionary::Instance(); mInitializeMap(); mInputFile.open((const char *) filename, std::ios::binary); // Don't need to check open condition here except to try // opening files with differing Unicode encodings. Other code // below will handle not-open condition. if (!mInputFile.is_open()) { filename = utf8proc_NFD((unsigned char *) filename.ToUTF8().data()); //filename = wxString::From8BitData(filename); mInputFile.open((const char *) filename, std::ios::binary); if (!mInputFile.is_open()) { std::cout << "DicomFile ctor, unable to open " << filename << std::endl; } } if (!mSkipPreamble()) { if (mErrors.test(NO_DICM)) { // attempt to read as dataset DicomElement e1, e2; mReadNextElement(e1, mInputFile); mReadNextElement(e2, mInputFile); mInputFile.seekg(std::ios::beg); if ((e1.tag.group == 8) && (e2.tag.group == 8)) { mErrors.reset(); } else { mSetTransferSyntax(IMPLICIT_VR, dLITTLE_ENDIAN); mReadNextElement(e1, mInputFile); mReadNextElement(e2, mInputFile); mInputFile.seekg(std::ios::beg); if ((e1.tag.group == 8) && (e2.tag.group == 8)) { mErrors.reset(); } } } } else { mReadMetafile(); } mCheckOk(); std::string manufacturer; Find("Manufacturer", manufacturer); Find("SpecificCharacterSet", mCharacterSet); if (manufacturer == "SIEMENS") { std::string software; Find("SoftwareVersions", software); // Is Numaris used with other software versions? 20130409cdt if (software == ("VA13F")) { mSpecial = Numaris_Dictionary::Instance(); } else { mSpecial = mDicom; } } else if (manufacturer == "GE MEDICAL SYSTEMS") { std::string product_id; Find(DicomTag(0x0009, 0x1004), product_id); if (product_id.find("SIGNA") != std::string::npos) { mSpecial = Excite_Dictionary::Instance(); } else { mSpecial = mDicom; } } else if (manufacturer.find("Philips") != std::string::npos) { std::string modality; Find("Modality", modality); if (modality == "MR") { mSpecial = PhilipsMr_Dictionary::Instance(); } else { mSpecial = mDicom; } } else { mSpecial = mDicom; } foundPixelDataStart = false; } /// /** Wraps mErrors.none(). \return True if no mErrors bits are set, false otherwise. */ bool DicomFile::IsOk() { return mErrors.none(); } /// /** If IsOk() returns true, checks for SOPInstanceUID, SeriesInstanceUID, InstanceNumber and PhotometricInterpretation elements. If these are not found, will set appropriate error code bit in mErrors. */ // This is where we put reasons to reject files. void DicomFile::mCheckOk() { if (IsOk()) { std::string s; if (!Find("SOPInstanceUID", s)) { mErrors.set(NO_UID); } if (!Find("SeriesInstanceUID", s)) { mErrors.set(NO_SERIES_UID); } if (!Find("InstanceNumber", s)) { mErrors.set(NO_INSTANCE); } if (!Find("PhotometricInterpretation", s)) { mErrors.set(NO_IMAGE); } } } /// /** Tests mErrors, returns a string describing any error conditions. \return A character string. */ const char* DicomFile::ErrorMessage() const { std::string retval; if (mErrors.none()) { return "No errors."; } if (mErrors.test(NO_BYTES)) { return "File is <128 bytes. Not a valid DICOM file."; } if (mErrors.test(NO_DICM)) { return "Unable to read file, possibly not DICOM format."; } if (mErrors.test(METAFILE_ERROR)) { return "Problem reading metafile header."; } if (mErrors.test(TRANSFER_SYNTAX)) { return "Unsupported transfer syntax."; } if (mErrors.test(NO_SERIES_UID)) { return "Unable to find series UID."; } if (mErrors.test(NO_UID)) { return "Unable to find instance UID."; } if (mErrors.test(NO_INSTANCE)) { return "Unable to find instance number."; } if (mErrors.test(NO_IMAGE)) { return "File does not contain image data."; } // should never get here, but... return "Error reading DICOM file."; } /// /** Map indices refer to VR types, defined in PS 3.5. */ void DicomFile::mInitializeMap() { ReadMap["FL"] = ReadStream::doit; ReadMap["FD"] = ReadStream::doit; ReadMap["OW"] = ReadStream::doit; //ReadMap["AT"] = ReadStream>::doit; ReadMap["AT"] = ReadStream::doit; ReadMap["SL"] = ReadStream::doit; ReadMap["SS"] = ReadStream::doit; ReadMap["UL"] = ReadStream::doit; ReadMap["US"] = ReadStream::doit; ReadMap["UN"] = ReadStream::doit; // Default } DicomFile::~DicomFile() { mInputFile.close(); } /// /** Wraps mFindElement. \param d Reference to a DicomElement to seek. \param input Input stream from which to read. \return True if element is found, false otherwise. */ bool DicomFile::FindElement(DicomElement& d, std::istream& input) { bool retval = false; if (input.good()) { DicomElement e; if (mFindElement(d.tag, e, input)) { if (mVrSyntax == EXPLICIT_VR && e.vr != "OB" && e.vr != "UN") { d.vr = e.vr; } d.value_length = e.value_length; retval = true; } } return retval; } /// /** Determines whether the file is a Siemens syngo file based on SoftwareVersions tag and magic string. \return True if SoftwareVersions contains "syngo", false otherwise. */ bool DicomFile::IsSyngoFile() { bool retval = false; std::string software; Find("SoftwareVersions", software); if (software.find("syngo") != std::string::npos) { retval = true; } return retval; } /// /** Seeks magic string in private group 0x0029. \param or_val Value to OR with a matching element value. In practice, this will be 0x0010 or 0x0020. \param header A string reference to receive the data found in the matching element. \return True if element is found, false otherwise. */ bool DicomFile::FindCSAHeader(int or_val, std::string& header) { bool retval = false; wxUint16 group, element; group = 0x0029; if (IsSyngoFile()) { for (element = 0x0010; element < 0x0100; ++element) { DicomElement creator(DicomTag(group, element)); std::string creator_name; if (Find(creator, creator_name)) { if (creator_name == "SIEMENS CSA HEADER") { element = (element << 8) | or_val; DicomTag csa_header_info_tag(group, element); if (Find(csa_header_info_tag, header)) { retval = true; } break; } } } } return retval; } /// /** Calls FindCSAHeader with or_val of 0x0010. \param header A string reference that receives the tag data. \return True or false. */ bool DicomFile::GetCSAImageHeader(std::string& header) { return FindCSAHeader(0x0010, header); } /// /** Calls FindCSAHeader with or_val of 0x0020. \param header A string reference that receives the tag data. \return True or false. */ bool DicomFile::GetCSASeriesHeader(std::string& header) { return FindCSAHeader(0x0020, header); } /// /** Tests whether there is a private tag in group 0x0019 that matches a magic string. \return True if there is such a tag, false if Siemens MR Header not found in private creator list. */ bool DicomFile::HasSiemensMrHeader() { bool retval = false; wxUint16 group, element; group = 0x0019; if (IsSyngoFile()) { for (element = 0x0010; element < 0x0100; ++element) { DicomElement creator(DicomTag(group, element)); std::string creator_name; if (Find(creator, creator_name)) { if (creator_name == "SIEMENS MR HEADER") { retval = true; break; } } } } return retval; } /// /** */ int DicomFile::ReadCSAImageHeader(const std::string& search, std::string& value) { int retval = 0; value = std::string(); // set value to empty string std::string csa_header_info; if (GetCSAImageHeader(csa_header_info)) { retval = ReadCSAHeader(csa_header_info, search, value); } return retval; } /// /** */ int DicomFile::ReadCSAImageHeader(const std::string& search, std::vector& value) { int retval = 0; value.clear(); std::string csa_header_info; if (GetCSAImageHeader(csa_header_info)) { retval = ReadCSAHeader(csa_header_info, search, value); } return retval; } /// /** */ int DicomFile::ReadCSASeriesHeader(const std::string& search, std::string& value) { int retval = 0; value = std::string(); // set value to empty string std::string csa_header_info; if (GetCSASeriesHeader(csa_header_info)) { retval = ReadCSAHeader(csa_header_info, search, value); } return retval; } /// /** */ int DicomFile::ReadCSASeriesHeader(const std::string& search, std::vector& value) { int retval = 0; value.clear(); std::string csa_header_info; if (GetCSASeriesHeader(csa_header_info)) { retval = ReadCSAHeader(csa_header_info, search, value); } return retval; } /// /** Routine to read Siemens' "shadow" header. Searches data in 'header' for value given by 'search'. Expects to have a successful call to one of the GetCSA*Header methods to populate 'header'. \param header \param search \param value A string reference to hold value found. \return 0 if not found, -1 if found but no data, 1 if found and there exists data. */ int DicomFile::ReadCSAHeader(const std::string& header, const std::string& search, std::string& value) { std::string::size_type pos = 0; wxUint32 intval2; wxUint32 intval3; wxInt32 n_values; //*** Duplicate block. for (;;) { pos = header.find(search, pos); if (pos == std::string::npos) { return 0; // search string not found } if (search.compare(header.substr(pos, 64).c_str())) { // wrong hit pos += 1; continue; } pos += 64; n_values = *reinterpret_cast (&header.substr(pos)[0]); if (n_values > 10000) { // crude way to look for another wrong hit pos -= 63; continue; } pos += 3*4; intval2 = *reinterpret_cast(&header.substr(pos)[0]); pos += 4; intval3 = *reinterpret_cast(&header.substr(pos)[0]); if (intval3 == 205) { return -1; // search string found, but no value given } if ((intval2 % 6) == 0 && intval3 == 77) { break; } } //*** End duplicate block pos += 4*4; wxUint32 value_length = *reinterpret_cast(&header.substr(pos)[0]); pos += 4; value = header.substr(pos, value_length); return 1; } /// /** Routine to read Siemens' "shadow" header. Searches data in 'header' for value given by 'search'. Expects to have a successful call to one of the GetCSA*Header methods to populate 'header'. \param header \param search \param value A vector of strings reference to hold values found. \return 0 if not found, -1 if found but no data, 1 if found and there exists data. */ int DicomFile::ReadCSAHeader(const std::string& header, const std::string& search, std::vector& value) { std::string::size_type pos = 0; wxUint32 intval2; wxUint32 intval3; wxInt32 n_values; //*** Duplicate block. for(;;) { pos = header.find(search, pos); if (pos == std::string::npos) { return 0; // search string not found } if (search.compare(header.substr(pos, 64).c_str())) { // wrong hit pos += 1; continue; } pos += 64; n_values = *reinterpret_cast (&header.substr(pos)[0]); if (n_values > 10000) { // crude way to look for another wrong hit pos -= 63; continue; } pos += 3*4; intval2 = *reinterpret_cast(&header.substr(pos)[0]); pos += 4; intval3 = *reinterpret_cast(&header.substr(pos)[0]); if (intval3 == 205) { return -1; // search string found, but no value given } if ((intval2 % 6) == 0 && intval3 == 77) { break; } } //*** End duplicate block pos += 4; for (;;) { pos += 4; intval2 = *reinterpret_cast(&header.substr(pos)[0]); pos += 4; intval3 = *reinterpret_cast(&header.substr(pos)[0]); if (intval3 != 77 || pos == std::string::npos) { break; } pos += 4; wxUint32 value_length = *reinterpret_cast(&header.substr(pos)[0]); pos += 4; value.push_back(header.substr(pos, value_length)); while (value_length % 4) { ++value_length; } pos += value_length; } return 1; } /// /** Dumps elements in mInputFile to a vector of DicomElements. \return A vector of DicomElements. */ std::vector DicomFile::DataDump() { std::vector dump; mInputFile.clear(); mInputFile.seekg(mBeginning); std::vector temp; temp = mReadNextElementAll(); while(mInputFile.good()) { dump.insert(dump.end(), temp.begin(), temp.end()); temp = mReadNextElementAll(); }; return dump; } /// /** Dumps all elements up to PixelData in mInputFile to file given as parameter. \param filename Target of the dump. */ void DicomFile::DataDump(const char *filename) { std::ofstream output; output.open(filename); DicomElement e; mReadNextElement(e, mInputFile); while(e.tag != Tag("PixelData")) { output << e.tag; if (e.value_length != UNDEFINED) { output << e.value_length << ' '; std::string s; mInputFile.seekg(-static_cast(e.value_length), std::ios::cur); for (unsigned int i = 0; i < e.value_length; ++i) { s += mInputFile.get(); } output << s << std::endl; } else { output << "Undefined length item" << std::endl; } mReadNextElement(e, mInputFile); } output.close(); } /// /** */ //int //DicomFile::GetHeaderSize() //{ // mInputFile.seekg(mBeginning); // // DicomElement element; // mReadNextElement(element, mInputFile); // while (mInputFile.good() && (element.tag != Tag("PixelData"))) { // mReadNextElement(element, mInputFile); // } // return (static_cast(mInputFile.tellg()) - element.value_length); //} /// /** */ //int //DicomFile::GetFileSize() //{ // mInputFile.seekg(0, std::ios::end); // return static_cast(mInputFile.tellg()); //} /// /** Reads file, skips the magic number of bytes, then seeks the magic DICOM string. Leaves file pointer ready to read DICOM elements on success, or at beginning of file on failure. Sets error code in some cases. \return false on failure, true if magic DICOM string is found. */ bool DicomFile::mSkipPreamble() { //**** // This bit of code illustrates a way of reading DICOM files // using stream operators. Relies on developing istream>> operators // for each data bit to be read. Such data bits provide the means // to read themselves. Generally, a DICOM group,element comprise // a "data bit". 201304cdt // // Preamble is the unused 128 bytes at the start of DICOM files. /** Preamble p; mInputFile >> p; // MetaHeader is the byte-swap-agnostic portion of DICOM files. mInputFile >> mh; // The rest of the header must consider byte-ordering, hence the // setting of transferSyntaxCode. main.transferSyntaxCode = mh.GetMainTransferSyntaxCode(); mInputFile >> main; **/ // Display fluff, proving we know what we are about. /** std::vector::iterator it; std::vector::iterator it_end; it = mh.mhElements.begin(); it_end = mh.mhElements.end(); for (; it < it_end; ++it) { std::cout << *it << std::endl; } std::cout << "transfer code: " << main.transferSyntaxCode << std::endl; it = main.mhElements.begin(); it_end = main.mhElements.end(); for (; it < it_end; ++it) { // if (it->tag.group % 2 == 0) { std::cout << *it << std::endl; // } } **/ // Reset input pointer, as if nothing had happened... //mInputFile.seekg(0); // //**** bool retval = false; //std::cout << "mSkipPreamble" << std::endl; if (mInputFile.is_open()) { if (IsOk()) { // First 128 bytes of DICOM files are not used. mInputFile.ignore(128); if (mInputFile.good()) { std::string s; for (int i = 0; i < 4; ++i) { s += mInputFile.get(); } if (s == "DICM") { retval = true; } else { mErrors.set(NO_DICM); mInputFile.seekg(std::ios::beg); } } else { mErrors.set(NO_BYTES); } } } return retval; } /////// //int //DicomFile::mReadMetafile() //{ // if (!mInputFile.is_open() || !IsOk()) { // return 0; // } // // mBeginning = mInputFile.tellg(); // std::streamsize group_length; // //int Findresult = Find("MfGroupLength", group_length); // int Findresult = Find("FileMetaInformationGroupLength", group_length); // if (!Findresult) { // mErrors.set(METAFILE_ERROR); // return 0; // } // // std::streampos meta_file_end = mInputFile.tellg() + // static_cast(group_length); // // std::string s; // //if (!Find("MfTransferSyntax", s)) { // if (!Find("TransferSyntaxUID", s)) { // mErrors.set(TRANSFER_SYNTAX); // return 0; // } // // // Can only read little endian // if (strcmp(s.c_str(), LEI_UID) == 0) { // mSetTransferSyntax(IMPLICIT_VR, dLITTLE_ENDIAN); // } // else if (strcmp(s.c_str(), LEE_UID) == 0) { // mSetTransferSyntax(EXPLICIT_VR, dLITTLE_ENDIAN); // } // else { // mErrors.set(TRANSFER_SYNTAX); // return 0; // } // // mInputFile.seekg(meta_file_end); // mBeginning = mInputFile.tellg(); // return 1; //} ///////// /// /** Careful here, substantial rewrite. Compare to original code above. 20131111cdt \return True if the TransferSyntax is little-endian implicit or little-endian explicit, false otherwise. */ bool DicomFile::mReadMetafile() { bool retval = false; if (mInputFile.is_open() && IsOk()) { mBeginning = mInputFile.tellg(); std::streamsize group_length; //if (Find("MfGroupLength", group_length)) { if (Find("FileMetaInformationGroupLength", group_length)) { std::streampos meta_file_end = mInputFile.tellg() + static_cast(group_length); std::string s; //if (Find("MfTransferSyntax", s)) { if (Find("TransferSyntaxUID", s)) { // Can only read little endian if (strcmp(s.c_str(), LEI_UID) == 0) { mSetTransferSyntax(IMPLICIT_VR, dLITTLE_ENDIAN); mInputFile.seekg(meta_file_end); mBeginning = mInputFile.tellg(); retval = true; } else if (strcmp(s.c_str(), LEE_UID) == 0) { mSetTransferSyntax(EXPLICIT_VR, dLITTLE_ENDIAN); mInputFile.seekg(meta_file_end); mBeginning = mInputFile.tellg(); retval = true; } else { mErrors.set(TRANSFER_SYNTAX); } } else { mErrors.set(TRANSFER_SYNTAX); } } else { mErrors.set(METAFILE_ERROR); } } return retval; } /// /** */ void DicomFile::mSetTransferSyntax(VrSyntaxType v, dicomEndianType b) { mByteOrder = b; mVrSyntax = v; } /// /** */ // 20070511cdt - byte-swap on big-endian machines void DicomFile::mReadElementTag(DicomElement& e, std::istream& input) { input.read(reinterpret_cast (&e.tag.group), 2); input.read(reinterpret_cast (&e.tag.element), 2); wxUint16 group_raw = e.tag.group; wxUint16 element_raw = e.tag.element; } /// /** */ void DicomFile::mReadValueRepresentation(DicomElement& e, std::istream& input) { // Check VR Syntax, but groups < 0x0008 are always EXPLICIT_VR. if ((mVrSyntax == IMPLICIT_VR) && (e.tag.group >= 0x0008)) { return; } e.vr = input.get(); e.vr += input.get(); } /// /** */ void DicomFile::mReadValueLength(DicomElement& e, std::istream& input) { wxUint32 value_length_raw = e.value_length; // Check VR Syntax, but groups < 0x0008 are always EXPLICIT_VR. if ((mVrSyntax == IMPLICIT_VR) && (e.tag.group >= 0x0008)) { input.read(reinterpret_cast (&e.value_length), sizeof(e.value_length)); // e.value_length = ByteSwap (e.value_length); } // These VR types have a 32-bit value length, see Table 7.1-1 // of PS 3.5-2011. else if ( e.vr == "OB" || e.vr == "OW" || e.vr == "OF" || // 20070516cdt e.vr == "UT" || // 20070516cdt e.vr == "SQ" || e.vr == "UN" ) { input.ignore(2); // 2 bytes are reserved input.read(reinterpret_cast (&e.value_length), sizeof(e.value_length)); // e.value_length = ByteSwap (e.value_length); } else { wxUint16 vl_16; input.read(reinterpret_cast (&vl_16), sizeof(vl_16)); // vl_16 = ByteSwap (vl_16); e.value_length = static_cast (vl_16); } } /// /** */ void DicomFile::mReadNextElement(DicomElement &rElement, std::istream& input) { mReadElementTag(rElement, input); mReadValueRepresentation(rElement, input); mReadValueLength(rElement, input); if (rElement.value_length != UNDEFINED) { input.ignore(rElement.value_length); } // Undefined length item else { std::istream::pos_type start_pos = input.tellg(); DicomElement item; mReadElementTag(item, input); input.read(reinterpret_cast (&item.value_length), sizeof(item.value_length)); //while (item.tag != Tag("SqDelimiter")) { while (item.tag != Tag("SequenceDelimitationItem")) { if (item.value_length != UNDEFINED) { input.ignore(item.value_length); } else { DicomElement e; mReadElementTag(e, input); //while (e.tag != Tag("ItemDelimiter")) { while (e.tag != Tag("ItemDelimitationItem")) { input.seekg(-4, std::ios::cur); mReadNextElement(e, input); mReadElementTag(e, input); } input.ignore(4); } mReadElementTag(item, input); input.read(reinterpret_cast (&item.value_length), sizeof(item.value_length)); } rElement.value_length = input.tellg() - start_pos; } } /// /** */ std::vector DicomFile::mReadNextElementAll() { DicomElement e; std::vector elementVector; mReadElementTag(e, mInputFile); mReadValueRepresentation(e, mInputFile); mReadValueLength(e, mInputFile); if (e.tag == Tag("PixelData")) { mInputFile.ignore(e.value_length); elementVector.push_back(e); } else if (e.value_length != UNDEFINED) { DicomElement dict_entry; if (e.tag.group & 1) { // private tags dict_entry = mSpecial->Lookup(e.tag); } else { dict_entry = mDicom->Lookup(e.tag); } if ((mVrSyntax != EXPLICIT_VR) || (dict_entry.vr != "UN")) { e.vr = dict_entry.vr; } e.description = dict_entry.description; mReadValue(e, e.value, mInputFile); elementVector.push_back(e); } else { // Undefined length item elementVector.push_back(e); DicomElement item; mReadElementTag(item, mInputFile); mInputFile.read(reinterpret_cast (&item.value_length), sizeof(item.value_length)); //while (item.tag != Tag("SqDelimiter")) { while (item.tag != Tag("SequenceDelimitationItem")) { if (item.value_length != UNDEFINED) { mReadValue(item, item.value, mInputFile); elementVector.push_back(item); } else { DicomElement ee; mReadElementTag(ee, mInputFile); //while (ee.tag != Tag("ItemDelimiter")) { while (ee.tag != Tag("ItemDelimitationItem")) { mInputFile.seekg(-4, std::ios::cur); std::vector nv = mReadNextElementAll(); elementVector.insert(elementVector.end(), nv.begin(), nv.end()); mReadElementTag(ee, mInputFile); } mInputFile.ignore(4); } mReadElementTag(item, mInputFile); mInputFile.read(reinterpret_cast (&item.value_length), sizeof(item.value_length)); } } return elementVector; } /// /** \param tag Constant reference to a DicomTag instance. \param element A DicomElement reference, receives data from 'input'. \param input An input stream. \return */ bool DicomFile::mFindElement(const DicomTag& tag, DicomElement& element, std::istream& input) { bool retval = false; mReadNextElement(element, input); if (element.tag == tag) { retval = true; } else { if ((element.tag > tag) || !input.good() || element.tag == DicomTag(0,0)) { input.clear(); if (input == mInputFile) { input.seekg(mBeginning); } else { input.seekg(0); } } while (input.good()) { mReadNextElement(element, input); if (element.tag == tag) { retval = true; break; } if (element.tag > tag) { break; } } } return retval; } /// /** */ // specialization of readvalue for strings int DicomFile::mReadValue(DicomElement d, std::string& sValue, std::istream& input) { sValue.clear(); if (!mInputFile.good()) { return 0; } std::vector v; if (ReadMap.count(d.vr)) { v = ReadMap[d.vr](input, d.value_length); } else { v = ReadMap["UN"](input, d.value_length); } if (!v.empty()) { sValue = v.front(); std::vector::iterator it = v.begin(); while(++it != v.end()) { sValue += "/"; sValue += *it; } } // remove leading/trailing spaces sValue.erase(0, sValue.find_first_not_of(' ')); sValue.resize(sValue.find_last_not_of(' ') + 1); return 1; } /// /** Handles MoCo and DTI series. \param seq \param str \param v \return */ int DicomFile::FindInSequence(const std::string& seq, const char* str, std::vector& v) { DicomElement de = DicomElement(Tag(str)); return FindInSequence(seq, de, v); } /// /** Handles MoCo and DTI series. \param seq \param d \param v \return */ int DicomFile::FindInSequence(const std::string& seq, DicomElement& d, std::vector& v) { int found = 0; std::stringstream ss(seq); DicomElement item; mReadElementTag(item, ss); ss.read(reinterpret_cast (&item.value_length), sizeof(item.value_length)); while (ss.good()) { if (item.value_length != UNDEFINED) { std::istream::pos_type pos = ss.tellg(); std::istream::pos_type end_pos = pos + static_cast(item.value_length); DicomElement e; while (ss.good() && (pos < end_pos)) { mReadNextElement(e, ss); if (ss.good() && (e.tag == d.tag)) { std::string str; ss.seekg(- static_cast(e.value_length), std::ios::cur); mReadValue(e, str, ss); v.push_back(str); found = 1; } pos = ss.tellg(); } } else { DicomElement e; mReadElementTag(e, ss); //while (e.tag != Tag("ItemDelimiter")) { while (e.tag != Tag("ItemDelimitationItem")) { ss.seekg(-4, std::ios::cur); mReadNextElement(e, ss); if (e.tag == d.tag) { std::string str; ss.seekg(- static_cast(e.value_length), std::ios::cur); mReadValue(e, str, ss); v.push_back(str); found = 1; } mReadElementTag(e, ss); } ss.ignore(4); } mReadElementTag(item, ss); ss.read(reinterpret_cast (&item.value_length), sizeof(item.value_length)); } return found; } /// /** */ std::iostream::pos_type DicomFile::GetPixelDataStart() { if (!foundPixelDataStart) { if (!mInputFile.is_open()) { return 0; } mInputFile.clear(); mInputFile.seekg(mBeginning); DicomElement element; mReadNextElement(element, mInputFile); while ((mInputFile.good()) && (element.tag != Tag("PixelData"))) { mReadNextElement(element, mInputFile); } std::streamoff offset = static_cast(element.value_length); // assume if input file not good, data is at end if (!mInputFile.good()) { mInputFile.clear(); mInputFile.seekg(-offset, std::ios::end); } else { mInputFile.seekg(-offset, std::ios::cur); } pixelDataStart = mInputFile.tellg(); foundPixelDataStart = true; } return pixelDataStart; } mriconvert/SpmOptionsDlg.h0000640000175000000620000000107712542632312015170 0ustar stevestaff/// SpmOptionsDlg.h /** */ #ifndef SPM_OPTIONS_DLG_H_ #define SPM_OPTIONS_DLG_H_ #include "BasicOptionsDlg.h" namespace jcs { class NewSpmOutputter; class SpmOptionsDlg : public BasicOptionsDlg { public: SpmOptionsDlg(NewSpmOutputter* outputter); void OnOkay(wxCommandEvent& event); bool NeedsRebuild() const { return mNeedsRebuild; } protected: DECLARE_EVENT_TABLE() private: bool mNeedsRebuild; bool mSplit; int mDim; int mSkip; NewSpmOutputter* mOutputter; }; } #endif mriconvert/BvOptionsDlg.cpp0000640000175000000620000001013112542632311015321 0ustar stevestaff/// BvOptionsDlg.cpp /** */ #include #include #include #include "BvOptionsDlg.h" using namespace jcs; BEGIN_EVENT_TABLE(BvOptionsDlg, wxDialog) EVT_BUTTON(wxID_OK, BvOptionsDlg::OnOkay) END_EVENT_TABLE() BvOptionsDlg::BvOptionsDlg(NewBvOutputter* outputter) : wxDialog(NULL, -1, wxString(_("BrainVoyager options"))), mOutputter(outputter) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dlgSizer->Add(new wxStaticText(this, -1, _("Items for default file names")), 0, wxTOP|wxLEFT|wxRIGHT, 10); mpNameFields = new wxCheckListBox(this, -1); OutputterBase::FieldMap::iterator it = mOutputter->defaultNameFields.begin(); OutputterBase::FieldMap::iterator it_end = mOutputter->defaultNameFields.end(); int i = 0; while (it != it_end) { mpNameFields->Append(wxString(it->second.name.c_str(), wxConvLocal)); mpNameFields->Check(i, it->second.value); ++i; ++it; } // default min size has extra white space vertically wxSize boxSize = mpNameFields->GetEffectiveMinSize(); boxSize.SetHeight(boxSize.GetHeight()*3/4); mpNameFields->SetMinSize(boxSize); dlgSizer->Add(mpNameFields, 0, wxEXPAND|wxALL, 10); wxBoxSizer* bvSizer = new wxBoxSizer(wxHORIZONTAL); bvSizer->Add(new wxStaticText(this, -1, _("Skip volumes:")), 0, wxTOP|wxALIGN_CENTER, 5); mpBvSpin = new wxSpinCtrl(this, -1, _T("0")); mpBvSpin->SetValue(mOutputter->mSkip); bvSizer->Add(mpBvSpin); dlgSizer->Add(bvSizer, 0, wxALL, 10); mpBvCheck = new wxCheckBox(this, -1, _("Save .v16 file")); mpBvCheck->SetValue(mOutputter->mSaveV16); dlgSizer->Add(mpBvCheck, 0, wxALL, 10); mpSplitDirsCheck = new wxCheckBox(this, -1, _("Save each series in separate directory")); mpSplitDirsCheck->SetValue(mOutputter->GetSplit()); dlgSizer->Add(mpSplitDirsCheck, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); mpSplitSubjCheck = new wxCheckBox(this, -1, _("Save each subject in separate directory")); mpSplitSubjCheck->SetValue(mOutputter->GetSplitSubj()); dlgSizer->Add(mpSplitSubjCheck, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxButton* okayButton = new wxButton(this, wxID_OK, _("Okay")); buttonSizer->Add(okayButton, 0, wxRIGHT, 10); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); okayButton->SetDefault(); dlgSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); mNeedsRebuild = false; } void BvOptionsDlg::OnOkay(wxCommandEvent& event) { bool splitDirs = (SplitDirs() != mOutputter->GetSplit()); bool splitSubj = (SplitSubj() != mOutputter->GetSplitSubj()); bool saveV16 = (SaveV16() != mOutputter->mSaveV16); bool saveSkip = (Skip() != mOutputter->mSkip); bool nfSave = SaveNameFields(); mNeedsRebuild = splitDirs || splitSubj || saveV16 || saveSkip || nfSave; mOutputter->SetSplit(SplitDirs()); mOutputter->SetSplitSubj(SplitSubj()); mOutputter->mSaveV16 = SaveV16(); mOutputter->mSkip = Skip(); EndModal(event.GetId()); } bool BvOptionsDlg::SaveNameFields() { bool needsRebuild = false; for (unsigned int i = 0; i < mpNameFields->GetCount(); ++i) { std::string name(mpNameFields->GetString(i).mb_str(wxConvLocal)); bool value = mpNameFields->IsChecked(i); OutputterBase::FieldMap::iterator it = mOutputter->defaultNameFields.begin(); OutputterBase::FieldMap::iterator it_end = mOutputter->defaultNameFields.end(); for (;it != it_end; ++it) { if (it->second.name == name) { if (it->second.value != value) { needsRebuild = true; } it->second.value = value; break; } } } return needsRebuild; } bool BvOptionsDlg::SplitDirs() const { return mpSplitDirsCheck->GetValue(); } bool BvOptionsDlg::SplitSubj() const { return mpSplitSubjCheck->GetValue(); } bool BvOptionsDlg::SaveV16() const { return mpBvCheck->GetValue(); } int BvOptionsDlg::Skip() const { return mpBvSpin->GetValue(); } mriconvert/McFrame.h0000640000175000000620000000205312542632333013736 0ustar stevestaff/// McFrame.h /** */ #ifndef MC_FRAME_H #define MC_FRAME_H #include class McPanel; // Define a new frame type class McFrame : public wxFrame { public: // ctor(s) McFrame(const wxString& title, const wxPoint& pos, const wxSize& size); // dtor ~McFrame(); // event handlers void OnAddFiles (wxCommandEvent& event); void OnAddDir (wxCommandEvent& event); void OnDicom (wxCommandEvent& event); void OnImage (wxCommandEvent& event); void OnInfo (wxCommandEvent& event); void OnRemove (wxCommandEvent& event); void OnDirectory (wxCommandEvent& event); void OnNew (wxCommandEvent& event); void OnConvert (wxCommandEvent& event); void OnRename (wxCommandEvent& event); void OnOptions (wxCommandEvent& event); void OnOverride (wxCommandEvent& event); void OnAbout (wxCommandEvent& event); void OnHelp (wxCommandEvent& event); void OnQuit (wxCommandEvent& event); protected: DECLARE_EVENT_TABLE() private: McPanel* mpPanel; }; #endif mriconvert/EnhancedMrHandler.h0000640000175000000620000000174512542632333015735 0ustar stevestaff/// EnhancedMrHandler.h /** */ #ifndef ENHANCED_MR_HANDLER_H #define ENHANCED_MR_HANDLER_H #include "SeriesHandler.h" namespace jcs { /// /** */ class EnhancedMrHandler : public SeriesHandler { public: EnhancedMrHandler(const std::string& seriesUid); virtual GradientInfo GetGradientInfo(); virtual bool IsDti() const; virtual std::vector GetStringInfo(); virtual std::vector GetVoxelSize(); virtual int GetRescaleSlopeAndIntercept(DicomFile& dfile, double& slope, double& intercept, int frame = 0) const; protected: virtual VolListType ReadVolIds(DicomFile& file); virtual std::string GetImagePositionPatient(DicomFile& dfile, int frame); private: std::vector ipps; std::vector slopes; std::vector intercepts; std::map bvecMap; std::map bvalMap; std::map volFrameMap; std::string pixelSpacing; }; }; #endif mriconvert/AnalyzeOutputter.h0000750000175000000620000000214712542632322015767 0ustar stevestaff/// AnalyzeOutputter.h /** Oversees the conversion and output production of the Analyze format. */ #ifndef ANALYZE_OUTPUTTER_H_ #define ANALYZE_OUTPUTTER_H_ #include #include #include "Basic3DOutputter.h" #include "BasicVolumeFormat.h" namespace jcs { struct AnalyzeHeader; class AnalyzeOutputter : public Basic3DOutputter { public : AnalyzeOutputter(); virtual int ConvertSeries(SeriesHandler* handler); protected: virtual BasicVolumeFormat* GetOutputVolume(const char* file); private: static Options CreateOptions(); }; template class AnalyzeConversion: public Basic3DConversion { public: AnalyzeConversion(Basic3DOutputter* outputter, SeriesHandler* handler); ~AnalyzeConversion(); protected: virtual void GetHeaderForSeries(); virtual void CompleteHeaderForVolume(std::pair > volPair); virtual void ProcessSlice(std::vector& slice); AnalyzeHeader* GetHeader() { return mHeader; } private: AnalyzeHeader* mHeader; }; } #endif mriconvert/MRIConvert.xpm0000640000175000000620000001423412542632333014775 0ustar stevestaff/* XPM */ static const char *MRIConvert[]={ "32 32 254 2", "bD c #000000", ".d c #000101", "Qt c #000202", ".c c #000303", ".e c #000404", ".h c #000505", ".# c #000606", ".q c #000707", ".m c #000808", "#r c #000909", ".a c #000a0a", ".n c #000b0b", ".i c #000c0c", ".b c #000d0d", ".l c #000e0e", "bR c #000f0f", ".k c #001010", ".G c #001111", ".s c #001212", ".y c #001313", "#t c #001414", ".w c #001515", ".j c #001616", ".M c #001717", ".x c #001818", "#s c #001919", ".p c #001a1a", ".o c #001b1b", ".L c #001c1c", ".v c #001d1d", "#u c #001e1e", ".7 c #001f1f", ".g c #002020", ".r c #002121", ".f c #002222", ".B c #002323", ".C c #002424", "b1 c #002525", "#k c #002626", ".u c #002727", ".z c #002828", ".I c #002929", ".t c #002a2a", "#w c #002b2b", ".Q c #002c2c", ".A c #002d2d", "#7 c #002e2e", "#v c #002f2f", "#d c #003030", "#Y c #003131", "#a c #003232", "#V c #003333", "#l c #003434", "#x c #003535", ".S c #003636", "#p c #003737", "#2 c #003838", "#3 c #003939", ".E c #003a3a", "#1 c #003b3b", ".J c #003c3c", ".D c #003d3d", "a# c #003e3e", "#W c #003f3f", ".X c #004040", "#0 c #004242", "#I c #004343", ".4 c #004444", "#Z c #004545", ".Z c #004646", "bd c #004747", ".T c #004848", ".O c #004949", ".P c #004a4a", ".F c #004b4b", "#5 c #004c4c", "#y c #004d4d", "#n c #004e4e", "#H c #004f4f", ".N c #005050", "#8 c #005151", ".H c #005252", "#S c #005353", ".U c #005454", ".9 c #005555", "#6 c #005656", "ac c #005757", "#o c #005858", ".K c #005959", "aa c #005a5a", "#O c #005c5c", "#m c #005d5d", "#F c #005e5e", "#c c #005f5f", ".1 c #006161", "#J c #006262", "#A c #006363", ".V c #006464", "#E c #006565", "#z c #006666", "#P c #006767", ".Y c #006868", "#4 c #006969", ".0 c #006a6a", "#B c #006b6b", ".R c #006c6c", "#C c #006d6d", "#D c #006e6e", "#T c #006f6f", "ab c #007070", "#K c #007171", "#q c #007272", "#9 c #007373", ".W c #007474", "#h c #007575", ".6 c #007676", ".5 c #007777", ".2 c #007878", "#X c #007979", "#e c #007a7a", ".3 c #007b7b", "#Q c #007c7c", "## c #007d7d", "#G c #007e7e", "#R c #007f7f", "#L c #008080", "#M c #008181", ".8 c #008282", "#i c #008383", "#g c #008484", "#. c #008585", "#j c #008686", "#f c #008787", "#b c #008888", "#N c #008989", "#U c #008d8d", "ad c #008e8e", "a. c #009f9f", "bQ c #020202", "at c #020505", "aF c #020506", "bm c #023d3e", "bH c #030304", "b7 c #050506", "bS c #060608", "ai c #097b7e", "aS c #0b0f12", "bc c #0c1518", "ae c #0d2226", "b2 c #0e0e12", "bv c #0f1216", "b6 c #101015", "b5 c #121218", "ah c #127075", "af c #1a1c23", "a3 c #1a434a", "as c #1b1d24", "ag c #1d525a", "aG c #1f222b", "aj c #20626b", "bT c #23232d", "bl c #232a33", "aT c #25303a", "bG c #282833", "b0 c #292935", "b4 c #2a2a35", "au c #2c303c", "bP c #2f2f3d", "bu c #2f323f", "aE c #30323f", "bn c #303b48", "bI c #343443", "bC c #383848", "b3 c #404052", "bE c #414153", "ar c #424658", "be c #446d80", "bU c #49495d", "a2 c #4d5066", "aR c #52536a", "bZ c #56566f", "bW c #5c5c76", "bV c #5e5e78", "bY c #5f5f7a", "ak c #5f6984", "aD c #60607b", "bX c #61617c", "bO c #61617d", "bB c #62627e", "aq c #626c87", "bw c #646480", "b# c #656580", "bN c #656582", "bk c #666683", "bt c #676783", "bK c #676784", "aP c #686885", "bJ c #696986", "a1 c #696987", "bA c #6a6a87", "aQ c #6a6a88", "al c #6b6b88", "aC c #6b6b89", "av c #6c6c8a", "az c #6c6c8b", "aH c #6d6d8b", "aO c #6d6d8c", "bL c #6e6e8c", "bM c #6e6e8d", "bx c #6f6f8d", "am c #6f6f8e", "bb c #6f708f", "aw c #70708f", "ax c #707090", "ba c #717190", "ay c #717191", "aI c #727292", "an c #737393", "ao c #747494", "aN c #757595", "bs c #757597", "aB c #767697", "aM c #767698", "b. c #777797", "ap c #777798", "aA c #777799", "aJ c #787899", "a4 c #78789a", "bF c #79799a", "aU c #79799b", "aK c #79799c", "aL c #7a7a9c", "aX c #7a7a9d", "bj c #7b7b9d", "a9 c #7b7b9e", "aV c #7c7c9f", "a0 c #7d7d9f", "aW c #7d7da0", "aZ c #7e7ea1", "a6 c #7f7fa2", "a5 c #8080a3", "aY c #8080a4", "br c #8181a5", "bi c #8282a6", "a7 c #8383a8", "bo c #8484a9", "bh c #8686ab", "a8 c #8686ac", "bf c #8787ac", "bg c #8989b0", "bp c #8a8ab1", "bq c #8c8cb3", "bz c #8f8fb7", "by c #9090b8", "Qt.#.a.#.b.c.d.e.f.#.g.h.dQt.i.j.k.lQtQt.c.k.m.b.c.dQt.m.n.a.hQt", "Qt.o.n.#.p.qQt.b.r.e.s.j.d.c.t.l.i.u.cQt.v.w.p.x.yQt.n.z.A.B.C.c", ".h.D.E.l.F.GQt.f.H.i.I.JQt.l.K.L.M.N.bQt.O.P.C.N.QQt.v.R.S.T.U.q", "Qt.y.V.W.J.qQt.y.X.R.Y.t.e.a.Z.0.R.1.s.c.J.W.2.3.4Qt.t.5.3.6.6.q", "Qt.7.3.8.0.n.d.m.9#.##.u.c.h#a###b#c.m.c#d#e#f#g.AQt.M#h#i#j.Y.h", ".d.h#k.Q.7.e.d.#.v.X#l.bQt.c.p#m.U.r.eQt.b#n.0#o.aQt.e#p.R#q.u.c", "Qt.c.b.s.aQtQtQt#r#s#s.eQtQt#r.k#t.sQtQt.e.L.L#u.c.dQt.y#v#w.qQt", "Qt.o#x#y.Z.iQt.a#z#A.0.BQt.c.F#B#C#y.cQt.r#D.5#E.wQt.##F#e.0#lQt", ".h#x#B#a.W.wQt.j#G#H.3#IQt.m#J.6#K#h.lQt#I#L#M#G.EQt.o.2#N.8#O#r", ".n.W.5#q###dQt.Z#g.8#h#P.#.M#f.5#Q#R.v.c#J#G###R#S.c#p#j#i#M#Q.y", ".##T###U#L.DQt.T#M#L#g#D.#.p.3#L.8#R.z.c#A#i###j.9.c#d#G#i#f##.s", "Qt#V#K.5#T.yQt.y#D#e#R#WQt.e.H.3#M#P.aQt.I#h#Q#e.tQt.n.Y#X.3.K.h", ".d.q#Y#Z.r.eQt.c.L#0#1.aQtQt.i#2.X.p.cQt.h.C.D#w.hQt.c.k#V#3.iQt", "Qt.M#c#4#2.c.d.c#0#J#5.n.dQt.L#6.9.vQtQt.e#W#H#7.c.dQt.x#Z#1.#Qt", "Qt.O.W#e#z.xQt.v#B#G.0.SQt.h#8#9.5#S.hQt#k#B#e.V.x.d.e.9.W.Y#VQt", ".m.V#Ra.#9#1Qta##K.8.6aa.h.G#T.3#Q.R#sQt.P.5#gaba#Qt.M#T#M#Xac.h", ".h.3#bad#L.OQt.Z.6#i#G#C.m#s#K###R#K#w.e#o.W#g.6#yQt.z#D#M#L#B.a", ".caa.3#L.3#YQt.Q.W#L#R#O.e.a.0.5#R.5aeafagahai.2.EQt#t#T#X.2.1.#", ".d.s.N#O#I.#.d.e#x.N#H.w.dQt.o.Fajakalamanaoapaqarasat#u.J.D.GQt", "Qt.c.l.w.hQt.dQt.##r.hQtQt.d.cauavawananaxayazaAaBaCaDaEaF.cQtQt", ".d.b#J.Y.S.c.d.c.A#A#I.#Qt.daGaHaxaIawaoaJaKaLaMaNaOaPaQaRaS.cQt", "Qt#p#K#X.Y.i.d#r#4#X#T.B.dQtaTapapaUaLaVaWaXaYaZa0aUaCa1ava2.qQt", ".c.F.6#M#D#u.d.j#T#L#ha#.c.ca3anaBa4aUaJa5a6a7a8a9b.aBb#babbbc.d", ".e#6#q#Q.W.IQt.r#T.6.Wbd.e.h#ybea9aUaXbfbgbfbhbiaVbjaBaybkamblQt", "Qt.pac#F.4.#.d.h#V#8.T.l.dQt.sbmbnbkapaWbfbobpbqbrbsa5aoaPbtbuQt", ".dQt.h.h.eQt.d.d.e.e.eQt.d.dQt.ebvbwbxaJaUaWbibybzbfaXaNbAbBbC.d", ".dQt.e.hQt.d.dQtQt.e.cQt.dbDbDbDbDbEalbaaVaVaLaBaVbFaAayavaDbGbD", ".dQt.#.e.hQt.d.d.e.m.#Qt.dbDbDbDbDbHbIbJbKaHbLbxamambMbNbObPbQbD", ".d.h.v.ObRQt.d.d.n.m.aQt.dbDbDbDbDbDbDbSbTbUaDbVbWbXbYbZb0bDbDbD", "Qt.##y.0.f.e.dQt.mb1.s.m.dbDbDbDbDbDbDbDbDb2b3b3b4b5b6b7bDbDbDbD", ".d.#.x#u.b.e.d.d#r.q.a.e.dbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbD", ".d.d.h.m.h.d.d.dQt.#.hQt.dbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbD"}; mriconvert/BvFiles.cpp0000640000175000000620000001143112542632333014311 0ustar stevestaff/// BvFiles.cpp /** */ #include #include #include #include "BvFiles.h" #include "StringConvert.h" using namespace jcs; BvStc::~BvStc() { if (mFile.is_open()) { mCloseFile(); } } /// /** */ int BvStc::WriteStc(wxUint16 rows, wxUint16 cols, std::vector & v) { if (!mOpenFile(std::ios::out|std::ios::binary)) { return 0; } mFile.write(reinterpret_cast (&rows), sizeof(rows)); mFile.write(reinterpret_cast (&cols), sizeof(cols)); mFile.write(reinterpret_cast (&v.front()), 2 * v.size()); mCloseFile(); if (verbose && !quiet) { std::cout << "Wrote " << mFileName << std::endl; } return 1; } /// /** */ int BvStc::mOpenFile(std::ios::openmode mode) { if (mFileName.empty()) { return 0; } if (mFile.is_open()) { mFile.close(); } mFile.clear(); std::string filename = mFileName; filename.append(".stc"); mFile.open(filename.c_str(), mode); return mFile.good(); } /// /** */ BvVmr::~BvVmr() { if (mFile.is_open()) { mCloseFile(); } } /// /** \param dim A vector of wxUint16 \param data A vector of wxUint8 \return 1 */ int BvVmr::WriteVmr(std::vector & dim, std::vector & data) { if (!mOpenFile(std::ios::out|std::ios::binary, ".vmr")) { return 0; } mFile.write(reinterpret_cast (&dim.front()), 2 * dim.size()); mFile.write(reinterpret_cast (&data.front()), data.size()); mCloseFile(); if (verbose && !quiet) { std::cout << "Wrote " << mFileName << std::endl; } return 1; } /// /** \param dim A vector of wxUint16 \param data A vector of wxUint16 \return 0 or 1 */ int BvVmr::WriteV16(std::vector & dim, std::vector & data) { if (!mOpenFile(std::ios::out | std::ios::binary, ".v16")) { return 0; } mFile.write(reinterpret_cast (&dim.front()), 2 * dim.size()); mFile.write(reinterpret_cast (&data.front()), 2 * data.size()); mCloseFile(); if (verbose && !quiet) { std::cout << "Wrote " << mFileName << std::endl; } return 1; } /// /** */ // Suffix = ".vmr" or ".v16" int BvVmr::mOpenFile(std::ios::openmode mode, const char* suffix) { if (mFileName.empty()) { return 0; } if (mFile.is_open()) { mFile.close(); } mFile.clear(); std::string filename = mFileName; filename.append(suffix); mFile.open(filename.c_str(), mode); return mFile.good(); } /// /** */ BvFmr::~BvFmr() { if (mFile.is_open()) { mCloseFile(); } } /// /** */ int BvFmr::mOpenFile(std::ios::openmode mode) { if (mFileName.empty()) { return 0; } if (mFile.is_open()) { mFile.close(); } mFile.clear(); std::string filename = mFileName; filename.append(".fmr"); mFile.open(filename.c_str(), mode); return mFile.good(); } /// /** */ void BvFmr::WriteFmr(const FmrHeader& header) { if (!mOpenFile(std::ios::out)) { wxLogError(_T("Cannot create file %s.fmr"), mFileName.c_str()); return; } mFile << "FileVersion: 2\n"; mFile << "NrOfVolumes: " << header.volumes << "\n"; mFile << "NrOfSlices: " << header.slices << "\n"; mFile << "NrOfSkippedVolumes: " << header.skipVolumes << "\n"; mFile << "Prefix: " << header.prefix << "\n"; mFile << "TR: " << header.tr << "\n"; mFile << "InterSliceTime: " << header.interSliceT << "\n"; mFile << "TimeResolutionVerified: 1\n"; mFile << "ResolutionX: " << header.columns << "\n"; mFile << "ResolutionY: " << header.rows << "\n"; mFile << "LoadAMRFile: \n"; mFile << "ShowAMRFile: 1\n"; mFile << "ImageIndex: 0\n"; mFile << "LayoutNColumns: " << header.layoutColumns << "\n"; mFile << "LayoutNRows: " << header.layoutRows << "\n"; mFile << "LayoutZoomLevel: 1\n"; mFile << "SegmentSize: 10\n"; mFile << "SegmentOffset: 0\n"; mFile << "ProtocolVersion: 2\n"; mFile << "ProtocolFile: \n"; mFile.setf(std::ios_base::fixed); mFile.precision(6); mFile << "InplaneResolutionX: " << header.IpResX << "\n"; mFile << "InplaneResolutionY: " << header.IpResY << "\n"; mFile << "SliceThickness: " << header.sliceThickness << "\n"; mFile << "SliceGap: " << header.sliceGap << "\n"; mFile << "VoxelResolutionVerified: 1\n"; mCloseFile(); if (verbose && !quiet) { std::cout << "Wrote " << mFileName << std::endl; } } mriconvert/SeriesHandler.txx0000640000175000000620000001062712542632333015556 0ustar stevestaff /// SeriesHandler.txx /** */ #ifndef SERIES_HANDLER_TXX #define SERIES_HANDLER_TXX namespace jcs { /// /** \param e DicomElement, group and element of DICOM value to find. \param value Variable to hold value found. \return 0 if no files in mFileMap. Result of dicomFile.Find otherwise. */ template int SeriesHandler::Find(DicomElement e, T& value) const { if (mFileMap.empty()) { return 0; } DicomFile dicomFile((*mFileMap.begin()).first.c_str()); return dicomFile.Find(e, value); } /// /** \param s String reference, name of DICOM element to find. \param value Variable to hold value found. \return 0 if no files in mFileMap. Result of dicomFile.Find otherwise. */ template int SeriesHandler::Find(const std::string& s, T& value) const { if (mFileMap.empty()) { return 0; } DicomFile dicomFile((*mFileMap.begin()).first.c_str()); return dicomFile.Find(s, value); } /// /** \param s String reference, name of DICOM element to find. \param value Variable to hold value found. \param id Reference to VolId. \return 0 of no match to 'id' is found. Result of dicomFile.Find otherwise. */ template int SeriesHandler::Find(const std::string& s, T& value, const VolId& id) const { std::string filename; if (!GetFirstFilename(id, filename)) { return 0; } DicomFile dicomFile(filename.c_str()); return dicomFile.Find(s, value); } /// /** Called as part of conversion process. \param v A std::map of VolId to Volume */ template void SeriesHandler::mGetVolumes(std::map >& v) { v.clear(); std::string uid = GetSeriesUid(); wxString message = _("Reading series ") + wxString(uid.c_str(), wxConvLocal); if (verbose) { wxLogStatus(message); } int image_columns, image_rows; //Find(DT_IMAGECOLUMNS, image_columns); Find("Columns", image_columns); //Find(DT_IMAGEROWS, image_rows); Find("Rows", image_rows); int file_number = 0; FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator end = mFileMap.end(); std::map minDistMap; std::map ippMap; int samples_per_pixel; Find("SamplesPerPixel", samples_per_pixel); // For each file... for (;it != end; ++it) { std::vector data; DicomFile d_file((*it).first.c_str()); // For each frame/slice in file... VolListType::const_iterator vit = it->second.begin(); for (unsigned int frame = 0; frame < it->second.size(); ++frame, ++vit) { // Problem with non-unique volume identifiers shows up here. // No, not really. The problem shows later in the processing cycle. -20131216cdt if (v.find(*vit) == v.end()) { v[*vit] = Volume (image_rows, image_columns); } std::vector rotation = GetRotationMatrix(*vit); std::string ipp; ipp = GetImagePositionPatient(d_file, frame); double dist = 0; for (int i = 0; i < 3; ++i) { dist += rotation[i+6] * stof(ipp, i); } double slope = 1; double intercept = 0; // If rescale, retrieved slope and intercept will cause PixelData to rescale. // Otherwise, slope and intercept values cause PixelData to avoid rescale. if (rescale) { GetRescaleSlopeAndIntercept(d_file, slope, intercept, frame); } d_file.PixelData(data, image_rows * image_columns * sizeof(T) * samples_per_pixel, slope, intercept, frame); v[*vit].AddSlice(dist, data, (*it).first); if (minDistMap.find(*vit) == minDistMap.end()) { minDistMap[*vit] = dist; ippMap[*vit] = ipp; } if (dist < minDistMap[*vit]) { minDistMap[*vit] = dist; ippMap[*vit] = ipp; } wxTheApp->Yield(); } } std::map::iterator ippIt = ippMap.begin(); std::map::iterator ippIt_end = ippMap.end(); for (;ippIt != ippIt_end; ++ippIt) { std::vector ipp; for (int i = 0; i < 3; ++i) { ipp.push_back(stof(ippIt->second, i)); } position[ippIt->first] = ipp; } } } #endif mriconvert/OutputFactory.h0000640000175000000620000000131012542632336015252 0ustar stevestaff/// OutputFactory.h /** */ #ifndef OUTPUT_FACTORY_H_ #define OUTPUT_FACTORY_H_ #include #include "NewSpmOutputter.h" #include "NewMetaOutputter.h" #include "NewBvOutputter.h" #include "AnalyzeOutputter.h" #include "NiftiOutputter.h" #include "FslNiftiOutputter.h" namespace jcs { class OutputterBase; class SeriesHandler; class OutputFactory { public : static OutputterBase* CreateNewOutputter(int type); static const char* GetDescription(int type); static const char* GetShortDescription(int type); static int GetNumberOfTypes() { return NUM_TYPES; } enum { FSL, SPM, META, NIFTI, ANALYZE, BV, NUM_TYPES }; }; } #endif mriconvert/MainHeader.h0000640000175000000620000000106712542632312014422 0ustar stevestaff/// MainHeader.h /** */ #ifndef MAINHEADER_H #define MAINHEADER_H #include #include #include #include #include "Dictionary.h" #include "DicomTags.h" #include "DicomElementInstance.h" namespace jcs { struct MainHeader { wxUint8 transferSyntaxCode; std::vector mhElements; bool isPixelData(DicomElementInstance de); friend std::istream &operator>>(std::istream &in, MainHeader &mh); }; std::istream &operator>>(std::istream &in, MainHeader &mh); } #endif mriconvert/MetaHeader.h0000640000175000000620000000124412542632322014422 0ustar stevestaff/// MetaHeader.h /** */ #ifndef METAHEADER_H #define METAHEADER_H #include #include #include #include #include "Dictionary.h" #include "DicomTags.h" #include "DicomElementInstance.h" namespace jcs { // Handles group 0x0002 tags. struct MetaHeader { static const wxUint8 transferSyntaxCode = LEE_CODE; std::vector mhElements; bool IsMetaHeaderElement(DicomElementInstance de); wxUint8 GetMainTransferSyntaxCode(); friend std::istream &operator>>(std::istream &in, MetaHeader &mh); }; std::istream &operator>>(std::istream &in, MetaHeader &mh); } #endif mriconvert/folder.xpm0000640000175000000620000000110312542632325014250 0ustar stevestaff/* XPM */ static const char *folder_xpm[] = { /* width height num_colors chars_per_pixel */ " 16 16 5 1", /* colors */ ". c #000000", "# c #c0c0c0", "a c #808080", "b c #ffff00", "c c None", /* pixels */ "cccccccccccccccc", "cccaaaaacccccccc", "ccab#b#baccccccc", "cab#b#b#baaaaaac", "cacccccccccccca.", "cacb#b#b#b#b#ba.", "cac#b#b#b#b#b#a.", "cacb#b#b#b#b#ba.", "cac#b#b#b#b#b#a.", "cacb#b#b#b#b#ba.", "cac#b#b#b#b#b#a.", "cacb#b#b#b#b#ba.", "caaaaaaaaaaaaaa.", "cc..............", "cccccccccccccccc", "cccccccccccccccc", }; mriconvert/DicomViewer.h0000640000175000000620000000223512542632332014642 0ustar stevestaff/// DicomViewer.h /** Displays DICOM header information in a wxFrame. */ #ifndef DICOM_VIEWER_H #define DICOM_VIEWER_H #include #include #include "DicomFile.h" class wxListView; class CSAViewer : public wxFrame { public: CSAViewer(wxWindow* parent, const wxString& title, const std::string& header); private: wxTextCtrl* mTextCtrl; void AddHeader(const std::string& header); void AddNext(std::istream& in); }; class DicomViewer: public wxFrame { public: DicomViewer(wxWindow* parent, const char* filename); void OnSave(wxCommandEvent& event); void OnQuit(wxCommandEvent& event); void OnCsaImage(wxCommandEvent& event); void OnCsaSeries(wxCommandEvent& event); void ShowFindDialog(wxCommandEvent& event); void OnFindDialog(wxFindDialogEvent& event); void OnCloseFindDialog(wxFindDialogEvent& event); protected: DECLARE_EVENT_TABLE() private: jcs::DicomFile mDicomFile; wxListView* mpDicomList; void InitList(); int AddElement(jcs::DicomElement& e); wxString mGetItemText(long index, int column) const; std::string::size_type mDescLength; }; #endif mriconvert/OutputList.cpp0000640000175000000620000000527712542632332015125 0ustar stevestaff/// OutputList.cpp /** */ #include #include #include #include #include #include #include "OutputList.h" using namespace jcs; /// /** */ bool IsInSeries(const OutputList::ListType::value_type list_item, const std::string& seriesUid) { return list_item.second.seriesUid == seriesUid; } /// /** */ ImageFileName::ImageFileName() { isRenameable = true; } /// /** */ void ImageFileName::SetPrefix(const std::string& prefix) { mPrefix = prefix.c_str(); } /// /** */ void ImageFileName::SetPostfix(const std::string& postfix) { mPostfix = postfix.c_str(); } /// /** */ std::string ImageFileName::GetPrefix() const { return mPrefix; } /// /** */ std::string ImageFileName::GetPostfix() const { return mPostfix; } /// /** */ void ImageFileName::AppendDir(const std::string& uid, const std::string& dir) { DirPair dirPair; dirPair.uid = uid; dirPair.dir = dir; mDirList.push_back(dirPair); } /// /** */ int ImageFileName::GetDirCount() const { return mDirList.size(); } /// /** */ void ImageFileName::ResetPath() { mDirList.clear(); } /// /** */ std::string ImageFileName::GetPath() const { std::string path; DirListType::const_iterator it = mDirList.begin(); DirListType::const_iterator it_end = mDirList.end(); for (;it != it_end; ++it) { path += it->dir; path += "/"; //GetPathSeparator } return path; } /// /** */ std::string ImageFileName::GetFullName() const { std::string filename = mPrefix + mPostfix; if (!mExt.empty()) { filename += "." + mExt; } return filename; } /// /** */ std::string ImageFileName::GetFullPath() const { return GetPath() + GetFullName(); } /// /** */ std::string ImageFileName::GetExt() const { return mExt; } /// /** */ void ImageFileName::SetExt(const std::string& ext) { mExt = ext; } /// /** */ std::string ImageFileName::GetDirName(int pos) const { return mDirList.at(pos).dir; } /// /** */ std::string ImageFileName::GetDirUid(int pos) const { return mDirList.at(pos).uid; } /// /** */ void ImageFileName::SetDirName(int pos, std::string name) { mDirList.at(pos).dir = name; } /// /** */ wxFileName OutputList::GetFullFileName(const std::string& key) const { wxFileName name; ListType::const_iterator pos = fileNameList.find(key); if (pos != fileNameList.end()) { name = wxFileName(rootDir + wxFileName::GetPathSeparator() + pos->second.GetFullPath()); } else { name.SetName(_T("error")); } return name; } mriconvert/NewMetaOutputter.cpp0000640000175000000620000002275712542632317016272 0ustar stevestaff/// NewMetaOutputter.cpp /** */ #include #include #include "SeriesHandler.h" #include "NewMetaVolume.h" #include "NewMetaOutputter.h" using namespace jcs; /// /** */ NewMetaOutputter::NewMetaOutputter() : Basic3DOutputter(CreateOptions()) { if (rawExtension == _T("")) { saveHeaderOnly = true; } else { saveHeaderOnly = false; } saveHeaderOnly = (rawExtension == _T("")) ? true : false; } /// Sets output options, including MetaImage-specific ones. /** */ Options NewMetaOutputter::CreateOptions() { Options options = Get3DOptions(); options.pathname = "MetaImage"; options.stringOptions["header"] = _T("mhd"); options.stringOptions["raw"] = _T("raw"); return options; } /// /** \param file \return NewMetaVolume object */ BasicVolumeFormat* NewMetaOutputter::GetOutputVolume(const char* file) { return new NewMetaVolume(file, headerExtension.mb_str(wxConvLocal), rawExtension.mb_str(wxConvLocal)); } /// /** \param handler A pointer to a SeriesHandler object. */ void NewMetaOutputter::UpdateOutputForSeries(SeriesHandler* handler) { Basic3DOutputter::UpdateOutputForSeries(handler); } /// /** Creates a correctly-typed MetaConversion object and calls Convert. \param handler Pointer to SeriesHandler object. \return 1 */ int NewMetaOutputter::ConvertSeries(SeriesHandler* handler) { int bits_allocated, pixel_rep = 0; handler->Find("BitsAllocated", bits_allocated); handler->Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { case 8 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 9 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 16 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 17 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 32 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 33 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 64 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; case 65 : { MetaConversion conversion(this, handler); conversion.Convert(); } break; default : { wxLogMessage(_("BitsAllocated and PixelRepresentation values (%d, %d) not supported."), bits_allocated, pixel_rep); } } return 1; } /// /** */ void NewMetaOutputter::SetSaveHeader(bool value) { saveHeaderOnly = value; if (saveHeaderOnly) { rawExtension = _T(""); } else { rawExtension = _T("raw"); } } /// /** */ void NewMetaOutputter::SetOption(const std::string& name, bool value) { Basic3DOutputter::SetOption(name, value); if (name.find("ho") != std::string::npos) { SetSaveHeader(value); } } /// /** */ template MetaConversion::MetaConversion(Basic3DOutputter* outputter, SeriesHandler* handler) : Basic3DConversion(outputter, handler) { mHeader = new NewMetaHeader(); } /// /** */ template MetaConversion::~MetaConversion() { delete mHeader; } /// /** */ template void MetaConversion::GetHeaderForSeries() { int nVolumes = this->GetNumberOfVolumes(); int dimensionality = this->mOutputter->GetDimensionality(this->mHandler->GetSeriesUid()); bool save4D = (dimensionality == 4 && nVolumes > 1); if (save4D) { mHeader->nDims = 4; } else { mHeader->nDims = 3; } mHeader->nDims = save4D ? 4 : 3; mHeader->dimSize[0] = this->mHandler->GetColumns(); mHeader->dimSize[1] = this->mHandler->GetRows(); mHeader->dimSize[2] = this->mHandler->GetNumberOfSlices(); // dimSize[2] recalculated in mConvert if (save4D) { mHeader->dimSize[3] = nVolumes; } std::vectorvoxel_size = this->mHandler->GetVoxelSize(); mHeader->elementSpacing[0] = voxel_size[0]; mHeader->elementSpacing[1] = voxel_size[1]; mHeader->elementSpacing[2] = voxel_size[2]; // elementSpacing[2] recalculated in mConvert if (save4D) { mHeader->elementSpacing[3] = this->mHandler->GetVolumeInterval(); } mHeader->byteOrderMSB = this->mHandler->IsBigEndian(); this->mHandler->Find("SamplesPerPixel", mHeader->numberOfChannels); int bits_allocated, pixel_rep = 0; this->mHandler->Find("BitsAllocated", bits_allocated); this->mHandler->Find("PixelRepresentation", pixel_rep); switch (bits_allocated + pixel_rep) { // See metaTypes.h for information on actual, machine-specific, sizes. case 8 : mHeader->elementType = MET_UCHAR; break; case 9 : mHeader->elementType = MET_CHAR; break; case 16 : mHeader->elementType = MET_USHORT; break; case 17 : mHeader->elementType = MET_SHORT; break; case 32 : mHeader->elementType = MET_UINT; break; case 33 : mHeader->elementType = MET_INT; break; case 64 : mHeader->elementType = MET_ULONG_LONG; break; case 65 : mHeader->elementType = MET_LONG_LONG; break; default : mHeader->elementType = MET_USHORT; } if (this->mOutputter->rescale == 1) { mHeader->elementType = MET_FLOAT; } mHeader->origin[0] = 0; mHeader->origin[1] = 0; mHeader->origin[2] = 0; NewMetaOutputter* out = dynamic_cast(this->mOutputter); std::vector::iterator it = out->fields.begin(); std::vector::iterator it_end = out->fields.end(); for (; it != it_end; ++it) { std::string value; this->mHandler->Find(*it, value); mHeader->extraFields.push_back(*it); mHeader->extraFields.back().append(" = "); mHeader->extraFields.back().append(value); } // set to default, may change in ConvertmHeaderOnly. mHeader->headerSize = -1; if (this->mHandler->IsDti()) { Basic3DConversion::WriteGradientFiles(); } } /// /** */ template void MetaConversion::CompleteHeaderForVolume(std::pair > volPair) { int n_slices = volPair.second.size(); mHeader->dimSize[2] = n_slices; if (n_slices > 1) { mHeader->elementSpacing[2] = volPair.second.GetSpacing(); } std::vector ipp = this->mHandler->GetIppForFirstSlice(volPair.first); for (unsigned int i = 0; i < ipp.size(); ++i) { mHeader->origin[i] = ipp.at(i); } mHeader->origin[3] = 0; mHeader->orientation.clear(); mHeader->orientation = this->mHandler->GetRotationMatrix(volPair.first); wxFileName name = this->mOutputter->GetFileNameFromVolId(volPair.first); if (name.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } name.SetExt(this->mOutputter->rawExtension.c_str()); mHeader->elementFile = name.GetFullName().mb_str(wxConvLocal); } /// /** */ template void MetaConversion::Convert() { NewMetaOutputter* out = dynamic_cast(this->mOutputter); if (!out->SaveHeaderOnly()) { Basic3DConversion::Convert(); return; } std::string series_uid = this->mHandler->GetSeriesUid(); int dimensionality = this->mOutputter->GetDimensionality(series_uid); GetHeaderForSeries(); typedef std::map > vMapType; vMapType volumes; this->mHandler->GetVolumes(volumes); if (dimensionality == 4) { wxFileName file = this->mOutputter->GetFileName(series_uid); if (file.GetName() == _T("error")) { wxLogError(_T("File name error")); return; } file.SetExt(_T("")); BasicVolumeFormat* outputVolume = this->mOutputter->GetOutputVolume(file.GetFullPath()); //.mb_str(wxConvLocal)); typename vMapType::iterator it = volumes.begin(); CompleteHeaderForVolume(*it); mHeader->elementFile = "LIST"; mHeader->sourceFileVector.clear(); while(it != volumes.end()) { std::map::iterator dicom_names = it->second.dicomFiles.begin(); while (dicom_names != it->second.dicomFiles.end()) { mHeader->sourceFileVector.push_back(dicom_names->second); ++dicom_names; } ++it; wxTheApp->Yield(); } outputVolume->WriteHeader(GetHeader()); delete outputVolume; } else { typename vMapType::iterator it = volumes.begin(); typename vMapType::iterator it_end = volumes.end(); for (;it != it_end; it++) { CompleteHeaderForVolume(*it); mHeader->elementFile = "LIST"; wxFileName file = this->mOutputter->GetFileNameFromVolId(it->first); if (file.GetName() == _T("error")) { wxLogError(_T("File name error")); break; } file.SetExt(_T("")); BasicVolumeFormat* outputVolume = this->mOutputter->GetOutputVolume(file.GetFullPath()); //.mb_str(wxConvLocal)); mHeader->sourceFileVector.clear(); std::map::iterator dicom_names = it->second.dicomFiles.begin(); std::map::iterator dicom_names_end = it->second.dicomFiles.end(); for (;dicom_names != dicom_names_end; dicom_names++) { mHeader->sourceFileVector.push_back(dicom_names->second); } outputVolume->WriteHeader(GetHeader()); delete outputVolume; wxTheApp->Yield(); } } } mriconvert/NumarisMosaicHandler.h0000640000175000000620000000330312542632322016471 0ustar stevestaff/// NumarisMosaicHandler.h /** */ #ifndef NUMARIS_MOSAIC_HANDLER_H #define NUMARIS_MOSAIC_HANDLER_H #include "SeriesHandler.h" namespace jcs { /// /** */ class NumarisMosaicHandler : public SeriesHandler { public : NumarisMosaicHandler(const std::string& seriesUid); virtual int GetNumberOfSlices() const; virtual std::vector GetVoxelSize(); virtual int GetRows(); virtual int GetColumns(); virtual AoCode GetAcquisitionOrder() const; virtual double GetVolumeInterval() const; virtual std::vector GetStringInfo(); virtual bool IsMosaic() const { return true; } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } virtual void GetVolumes (std::map >& v) { mGetVolumes (v); } protected : virtual std::vector GetSliceOrder(); virtual VolListType ReadVolIds(DicomFile& file); private: template void mGetVolumes(std::map >& v); }; }; #endif mriconvert/MRIConvert.icns0000640000175000000620000031055512542632311015126 0ustar stevestafficns‘mis32§6HDDFDDFDDFDDH7ˆ  ƒH%P[` q† !Š" # $"$0s;‚ 60œ/&§7„ # . 7@ˆ ;)R .b$iq†\Ÿc¦V¯,H·;9»E‚G FFD F‚/]4Z(_\ […q°g²T·'@º2,¼5„FCC< :‚7/ ( WŸOž4› ’† „.% §6HDDFDDFDDFDDH7ˆ  ƒH%P[` q† !Š" # $"$0s;‚ 60œ/&§7„ # . 7@ˆ ;)R .b$iq†\Ÿc¦V¯,H·;9»E‚G FFD F‚/]4Z(_\ […q°g²T·'@º2,¼5„FCC< :‚7/ ( WŸOž4› ’† „.% §6HDDFDDFDDFDDH7ˆ  ƒH%P[` q† !Š" # $"$0s;‚ 60œ/&§7„ # . 7@ˆ ;)R .b$iq†\Ÿc¦V¯,H·;9»E‚G FFD F‚/]4Z(_\ […q°g²T·'@º2,¼5„FCC< :‚7/ ( WŸOž4› ’† „.% s8mkWÇ·ººººººººººº·Çwÿûÿÿÿÿÿÿÿÿÿÿÿûÿvÿùýýýýýýýýýýýùÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿvÿùýýýýýýýýýýýùÿwÿûÿÿÿÿÿÿÿÿÿÿÿûÿil32 ¨¯;LJI€HILJI€HKKI€HIJHJLIJ>‚‰"# $ %   4*vZ iua‹:KV?“q MD PSKd/DeC<gU €   Ž/! 0 ./ :##1 %ŽS+N=\BE\ZN6oHh:v(4sBy?/Œ‚%'„•K.~š}0‡–:$‡›XŒ/$‚Œ> h‹JN‰UŒƒŸ”U k–™kW•—{7”•‡‰–‘+‰“–’tyŠ}ke‡ˆ‹.Vމ@9ŽŒ’SŒ‰—Ÿdj™ xM›žŠ,•›“œ–,$[YQTBQ#-A$9"€_>F?&8+€{‘_ ’!.š•) ‚™3[š:-“BŽzˆŒPV‹T)Š’cr™nJ£u[”76‹?t€APv?'c5‘ /0 *$ ˜¯;LJI€HILJI€HKKI€HIJHJLIJ>‚‰"# $ %   4*vZ iua‹:KV?“q MD PSKd/DeC<gU €   Ž/! 0 ./ :##1 %ŽS+N=\BE\ZN6oHh:v(4sBy?/Œ‚%'„•K.~š}0‡–:$‡›XŒ/$‚Œ> h‹JN‰UŒƒŸ”U k–™kW•—{7”•‡‰–‘+‰“–’tyŠ}ke‡ˆ‹.Vމ@9ŽŒ’SŒ‰—Ÿdj™ xM›žŠ,•›“œ–,$[YQTBQ#-A$9"€_>F?&8+€{‘_ ’!.š•) ‚™3[š:-“BŽzˆŒPV‹T)Š’cr™nJ£u[”76‹?t€APv?'c5‘ /0 *$ ˜¯;LJI€HILJI€HKKI€HIJHJLIJ>‚‰"# $ %   4*vZ iua‹:KV?“q MD PSKd/DeC<gU €   Ž/! 0 ./ :##1 %ŽS+N=\BE\ZN6oHh:v(4sBy?/Œ‚%'„•K.~š}0‡–:$‡›XŒ/$‚Œ> h‹JN‰UŒƒŸ”U k–™kW•—{7”•‡‰–‘+‰“–’tyŠ}ke‡ˆ‹.Vމ@9ŽŒ’SŒ‰—Ÿdj™ xM›žŠ,•›“œ–,$[YQTBQ#-A$9"€_>F?&8+€{‘_ ’!.š•) ‚™3[š:-“BŽzˆŒPV‹T)Š’cr™nJ£u[”76‹?t€APv?'c5‘ /0 *$ ˜l8mkPó¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶´Àoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿùýýýýýýýýýýýýýýýýýýýýýýýýýýýúÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿoÿùýýýýýýýýýýýýýýýýýýýýýýýýýýýúÿoÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿit32¯¤×Va__``€_``^`a`__€`€_ `__`__`_a``_`_‚`_a`_`‡_``_``_€`__`__a†_``__`€_`€_`„_`_`__`ac`_a`__`_`€_aV‡¿…“ ’ˆ@À  … € €ƒ €†-   A¿‡‚€€ ƒ€€ €€@¿  €„„‚  …. @¿  … ƒ‚   €ƒ ( €6@¿       €  ƒ  ƒ - €@¿    €G    $ * #    .  ‚€ 1€@À. ((‚,&(  2 #+*-'K 4/  2%+ '0@¿ !5$, /)9€-7-#5@%%.  -6:-$ ' -0$20>7 (+ €3(>& /D(#C¿1('/%:, (=$#I? €$3->3   ‚ 05  21-)C &g@ C¿ "2)N27  '2:) €(   ‚    %€*( QPXb A¿""7%3+ €€ 1#&2 ‚+  €   ‚  z9 ,4 ,1 €@¿ %     €€,  A. €179- @¿! '^U‚ AžB)“™%oÀ|*€€z\ ~jv,@À *“–"C B”ˆ|!3]*  K˜ˆ‰HnX#   #bœ‰Š”•“[€J[Œ‚ƒ˜«¸—!C¿ 1I]”rD>2    _y†…‡Ž„‡M  €-7k}…•±¨…P (Hkuo†’§£Ž> @Dms{‘›”Œ‘† €D¿  Gtux¤‚‡wN € 2hsu|€„ƒla€ Aot{}‚‚‰‰vd 1`dehq~„wzuu  ‚ _idkZ{‰}‡”d@¿€  Nknh–ÁvnkJ2flqw{}|hiQ‚ Vbjt{zƒtn}TƒG.fihaq~€kolR `cgiTp†wz€\@¿ 1eed[cpil&‚ Ydgjgnj_p<ƒ.?ebfmtyen…AYcshkzttwu7€- 0ghkpv}wqn, A¿3`h#lS'† -]gh.dl^G ƒ Lh_dWraoeƒ &_mlaimsxYƒFproott~qG€@¿*:  !„ #MP G  „€ @bVYa7 …#VmR2mcD ‡, IgkMTsa; @¿#+‚€  % €€, % €€+ † &*/@¿€   ‚" „€  %    ‚?¿  ƒ ‚‚  ‚‚ ƒƒ   @¿ „  ‚‚ € @¿€ ƒ    ‚€  …€  €?¿7N„ =8   * ‚ #ƒ  €@¿  FT „$€ "gP‚6. Cd$€€8&J[ƒ'%FA¿€ P[ 8 sb€€DqR 7„U [zI0‰9€€€ay,E@¿  ,‚, C/3& 3‡S(X.€€ Q0*  \‚€A¿ 1* 5ƒ+?1 , 6&-4€!  + ‚  €A¿(3 0(+  ‚1:)X*-€b $=* 0Q5-2F ;2,?<  $+(@¿7/3,lL.€€/;H%  B€^3€;3\7  Hqt:€H%<(9!a}j85AE  YX$ A¿ 0=c~o ;dG  9VwmC. 9YuY € Br‡H!>ZuZ €I 2AryV HVnX,>‹\IWa5 @¿#NŠ{s&Rfzq- €3ysyf4  #Oitx@ € "`€hg9 'Xfgq? 2p‡lW(\oqh%0,oxu@1_ƒƒxJ @¿Vpwt:-„xhx= €S€oŠ< N|uj~R  ;qzn~q N}xer> G{nt€V+<1"[~}‚‚c& A¿ !$.‚m"\8+u}knC Ngo’Ž&:^TNŠruJ Aivz”v.N=V‡…mzeO~k„”‡bigm–}ktr'qކ€™…¦v‰¡…r‰K C¿, /?{‚…u'1T>  ";>H9/d„y‚nWPZhk"5kutbjƒ€v{x}€mp}.€]vr†qrwo~‰isy&€+pvvˆŽy„~~–”€‡ƒ]D¿ 6™|yy†@+' 5! /`zw„{R90 4[@J{ˆ|€‡~‹„`]\Qliy‚‘{…„–›ˆktx' krm€ŒŠ‰ƒ…˜œŽyƒuB¿D—†~¨ŒŸˆ9 'PŽ”‡­ ˜†[  41Š~‘–­ŸƒŠuYO0 &H@z‹‹Š”£¢‘™ƒuzv&,Yr€›‘žªŸ“‘ƒx†k"B¿8‡€p—¥‡¦…_o8!$" € Ai7~l ‚/ Qn“†"Fˆ… 'pk¤x"Kš{/ €ICvˆ“uTPu§‚w'AÀ FS>uV##'8r‹`jx€‰‘ˆ>€,rŽzƒ„ƒ‘’: U”€wu~‰•u’‹,$ƒŒ}„‘ƒ™‡™n?¿K[hq–vƒ™žl8-86j|lŒ•€|ŒŠ›h+=;††xp„uox’V €|8U–{p‚‘…•Šv‹šG@¿->+E %DI\Žƒo]A+?;jƒtbJ\te|›‡S<$ E=‹•viŠˆx~‘‘X24Y–‚†nww–j"‚b.{ƒ†{tœ›ƒv‡„‹Y@¿-9 $^?4{?r¢~$/ F7c™u?TjWvœ—•+'2Q+eŒ—ƒ[pyƒœ ŒF#/€+'?;‰–ŽqvuІ’œ”\!d“œ”xtsžŒš”ƒ>€|@¿ :%Sya"] }¯ª0FPˆ­…<2M^o—Ÿ£k8 &Av¦Ÿ…a[az†Ž›ˆy.35/%€œ—„ƒ^l} ™†8&++‚–Šƒ…c~˜–Šf €2@¿%|Ž‹šJH–••6(-¦“Ÿ“N8`œ™˜I(€0#h¤ž•sQLycZu›˜5. ;Sžm`ž³ij~ž’‹0+€24A•• ‚w‡ªžzyŽ˜…ŒD@¿ 4‚‹‹fHP=P‡—†u€#S–—…`?dQH`˜šŠ„2 6ƒˆ—™X9vÃkDg›—d";‡—žQZ¾ÄsVx›“‹ -#,=™–z`†€‰…vФ‹Ž<'@¿#[ƒ‰‹Œ‹i„hN‡˜Ž'`ŽŸ˜ƒet³„h]‘ †/€&“©„Ru¥»”we™–Œ‡09P‘Žš{^‰¥¬’vyš•€E (*Xšˆ›€m’‹’†Ž•›T"B¿ #r™“z]bcjpx‡Š›awŒƒq“ƒ‡}‘“z™D|?„¤{‡™¸”‰{œ—…ˆ@ 4t•”ž‹}Š¥°”†ˆž„|w'$)r§“–…‘„‹”‡Ž‘¡Z$C¿tŽ”ˆu‰•‹ƒ€“™z pšŽ~~„‰•Ÿ˜ˆ{|{l€E‘~|Ž­•²“ƒƒ…Œ[€(r‘‰”‰}•¢‹°–‡•‘šF$*|–“ŸŠ~žŒš±Ž˜š•w'C¿|•Ž‚¡œ›ªª‹¥­‰”˜x$Ž£ˆ¥”†{šµž}m">’”ˆ¡¦{oˆ²‡„‡—a.aˆ…€§œ€w˜”‘™ŠD4tˆ‰‚«¯Šˆ›•–•‚2B¿ "s„‚”…·½š—ºˆ†—t!9—–«›––œ³…‰•P!H˜†“›“n|„›˜„ŒŒJa,PŸš…–œˆnW†rŒ‹ŠŽ=+f–†Œ¨€ts~zŽŠŠ„~,B¿#T~ˆ‡ƒ¡­—–—…—F'u’~…¡——•’‰ƒˆ‰3€.";Љ“›ƒ”“¨¥‰–”t(&?›‘“Œ€–”e›£“ˆ•”t€%N ‘”‡€•‰€š”Š•˜Ÿb A¿‡”…w}zp“„ƒ|ƒ{ 7›‹sšŽiu›‹zv‡{  `¨…{…›n”›”…„’g $vœ‘…—šŽ¢š¤‹”œD€H&‚›Š–˜žŸ›Ÿ—Š™£'A¿4Œtˆ…y‹¦‰}¥> X•|€¸ƒ„Ž‘ˆ|‡œ.‚*‚•}{•ˆŒ†…'•…’~}†‰•‡“~ €55¢…’ƒ‹„’—™^?¿TŒ}„ˆŽ˜’Š~‹V € y™w’ˆ–}˜D€!…‡u‰‡|“‰|†š5€P<˜ €z„„‹ŽŽ– B§‰zƒŠœ£x @¿  f™€u‡z†€6€ n‘‚„x”•‘+„pŽŠˆzˆ’’l%o„ŽŠw‰ž’U ƒ- 1Ž”s‘ŽK @¿>„•‚5}‹( €‚ 1‚›v>ƒz& €€€  Pˆ–X=xa „FuA>k4„0H€Y2BE@¿ B$ € ;€ #  ƒ   €@¿ ‚ „  €€ €†€   ‚?¿€ƒƒƒ… €@¿€  €    ‚ ƒ €*@¿     †   ƒ    €@¿ &Pf_,e€a$ … $R|NB>‚€Pv,,OQ' ƒ7G?+„+ 18D  @¿ QŠ‚ƒ†Ž’“Q€„ Z‰ˆŠ€H‚Ev”Ž••‘= … Qƒ’‹˜˜jH  HmŽŒ€# A¿1…”Ÿ‹}‘‘ŠA 5Œƒ{‘˜w‹t!‚A’„{|ƒ|†ˆB†!o‘‚—‹}‡–O +^–ˆ‚‘€€‹‰#A¿ *r†ˆ¢¢œ‹…w‚)ƒ/mˆŽ‚Š›œ„|T rˆƒ‡¢Œ‚†ˆq€ u‰‹ƒ„™™w…@€€I b’‰Žƒ ”}ƒ•} A¿Gyx}ƒ–ª ƒzuw‡P@~€ƒŽ¥¬§€z}i€,:ƒ|~†¡±  ˆ~‡_0ˆ|‚™š”‚…„“$‚0 %‚Œ–…‚œ™€…’ŒE@¿0|nŒˆ—„Š›‰wtY!H„su††²‘‰‚{‚„;€€ !_ˆ}…‘ž«Ÿ‡|~} € LŽ‚‡‡œ§–š€|xW€ E‚ƒ˜€“’|€Š†…€L@¿ @qŽˆ™¡‚–¤ƒyn|u #[€wzƒ™™Ÿ‘”~ƒ‰‘Zl‰†‡”¬ŠˆŒŒ—8 € iŠ}†Ÿž˜…„Š n€ƒŸ¤˜†‚‡šA@¿ gŠ~”Š€¦Ê¹Œ‰|y‰|D(2uŒxs‘Ÿ“~~‰x, yŒ‚~~ ¡„€‡e J '“Жއ†“¤‰ŽŽˆ5 *™š„“ž¡”…”™l@¿+o‚‹ž‘—ÔÅˆŠ…r}f"€/8zzw€ˆŽµ‡¡—ƒuz…T#!=~ys}Œš‰“{€xv~…A€G…‚‹€‚‹–ƒŠ‚‡‚†[ €cCŠŒ‰‘•‘ƒ‡Š†8?¿.3~ƒˆ˜‘€€¯§–‡Œq„o)#<Žtˆ‡„¨Ž™¨†sƒL!!O‘ƒv~€”–„˜…}€Ž„A€ %Tˆs{~ƒ¡ƒ‹€yv‹s-2 )RŽyzˆŠ’†zx‰L@¿,>‹¡~®­›º‰Œˆt~0 €$DŽuw‘¤ˆ´|qsQ#bOŒ„txƒ’Йޅ‚ƒA+ZކŒƒ…Šˆ›…ˆ†Š‡‹~, )UŒ‡’ššŽ‡€‰„H @¿ 4€””’€—»‡€« |v‰‚' €GF•yw{zš•‘’}xyd!N—xy„‡‚ ˆ„ˆ{…‡ŒK`˜‡Œƒ‘˜”†Ž†! 2 %P’‰ƒ‚— ›˜‡…’‚d @¿&v¢ƒ•‹„’Œ‡}}—„ €.Šww„‡}–”ƒ…„|‡i D›€ƒƒ‡†—“ŠŠ‰“Ž>;Š•ˆ•›¤“Ž‘—t L–”…~›™›¥„„‹~—B@¿ %o–Œ…‚ƒŒ…ƒ¡l."jƒ‡ƒ–¤’“‘˜9(…”ˆŽŽˆ£¤‰‹Ÿœ™‹€ˆ’”‹†”–ž¤’‚™”›H€K”„’”˜¥Š€ˆ ‰ @ÀK¥•‰~ƒˆ•¢ž‹…’•¡0O©Ž‘ƒŒŸ›–Š…‹   Pœ…¡“}”žŸ‹ˆ™„¨O€GC’¥“ƒˆ—Œ‰Š¢’ˆ /•š…Š•”šžŠ… U@¿zªŠŠ”™’–Œ…™^€€£„…†~—‚Œ…¨;€ ‡‡„Š–‰‹‚˜‘ €Ll¤Š„€z•šŠˆ‹¥DWŸ–}}…•ŒŒ¢z @¿ ‘•‹“¢™ƒ›™—šw –Œ“ˆ‚Œ™“••“d ‚+ †•‘ƒ‡˜‹¢‘—/ ‚Ÿ}’‡Š•Ÿ¤˜s …/ x¢…Š˜”‡¨˜‚?¿ p“—‹Ž ¦¦x‚ u©œ ŸŒ¦¾ \ … u«©¶—‰Åˆ$‚ o’°›rW|ŽG ‚ R{¨€I1iQ‚@¿€  )Zu‰`m”P ƒ ƒ…›™‡‹…f€ ‰†—‹„˜Š‹‹ˆƒ~“–„€–‰—Fƒ P𔉉ˆ~˜”b €™“Œ‘ªm  7?¿^”Œœ™‚ˆx{†D•‘ˆ‹…•‹ŒŒ‚L€!”Š“†œ•’u €€ z“”„‘™šŠ+ / N™›ŒŽ‘†–”9 @ÀxŽ’‰€Œ¢—‚ކ‡“A h“~…Œƒ˜‘†•‚ŽYƒ )†|‹•‡„˜€u‚™‹‰‘ˆ€‘“K /K‘“œ}žmA¿""nyy…ˆ„••ƒ…‚˜a l‡{“‚„š“~‹…ƒc€ G’†wˆ™zކŒ% ƒ cŒ~}…“ˆ}Š•N „/W™~‹Š…ƒ‘p@¿),s{~€…‰‰}q‹`€kˆ}€‘Šv‰€R€€A|†‚ІŠ…( b‰Š{Ž‹‘…Œ™@ €‚-Jzy‹‡¢Q?¿"{‡…}z†˜„{ƒ‚‡Z„ Y{vu{‡“{xyˆl„€xvxn„‰y€wu €Ot~|p‡~‰m  ‚€- nƒwy‹‰ƒŠ,@¿[|Šˆq‚{ŽŽ|’>‚.8Šzˆ†‡ˆ„d  w†…~‡‚{l ‚ B…z„~…ƒ… ƒ g…ƒ}_‡… €@¿™†}w‡ˆzƒ”~І…Œ‘1  K~Œ…“•…‘Y…„z‹etž™o  €/ bš†wV˜T @¿-Š‚{“‘‹¡•“ª4 ƒ(ˆ‚‹zŒ–©a ‚ w‰WW~–f €(UŽ‚x,1‚[ dI  €@¿ 1x––A©ž®t O–¨lK¨“n ƒ (}—y"0G7 €„ CTD‰/  @¿ `zT_uE‚4vv8 $€‚  +$ €€   ‚„   ƒ@¿   †  €‚   ‚„ €@¿ €ƒ€ ‡ „ €„?¿ …€€€‚€€‚†€€† @¿‚ƒ€€€‚Œ@¿€ ŠŽŒ”Š@À‚€€‚‰È@¿÷@È$‡!"!"Š!€"€! "!!"!"!"!!"Ì!$X×Va__``€_``^`a`__€`€_ `__`__`_a``_`_‚`_a`_`‡_``_``_€`__`__a†_``__`€_`€_`„_`_`__`ac`_a`__`_`€_aV‡¿…“ ’ˆ@À  … € €ƒ €†-   A¿‡‚€€ ƒ€€ €€@¿  €„„‚  …. @¿  … ƒ‚   €ƒ ( €6@¿       €  ƒ  ƒ - €@¿    €G    $ * #    .  ‚€ 1€@À. ((‚,&(  2 #+*-'K 4/  2%+ '0@¿ !5$, /)9€-7-#5@%%.  -6:-$ ' -0$20>7 (+ €3(>& /D(#C¿1('/%:, (=$#I? €$3->3   ‚ 05  21-)C &g@ C¿ "2)N27  '2:) €(   ‚    %€*( QPXb A¿""7%3+ €€ 1#&2 ‚+  €   ‚  z9 ,4 ,1 €@¿ %     €€,  A. €179- @¿! '^U‚ AžB)“™%oÀ|*€€z\ ~jv,@À *“–"C B”ˆ|!3]*  K˜ˆ‰HnX#   #bœ‰Š”•“[€J[Œ‚ƒ˜«¸—!C¿ 1I]”rD>2    _y†…‡Ž„‡M  €-7k}…•±¨…P (Hkuo†’§£Ž> @Dms{‘›”Œ‘† €D¿  Gtux¤‚‡wN € 2hsu|€„ƒla€ Aot{}‚‚‰‰vd 1`dehq~„wzuu  ‚ _idkZ{‰}‡”d@¿€  Nknh–ÁvnkJ2flqw{}|hiQ‚ Vbjt{zƒtn}TƒG.fihaq~€kolR `cgiTp†wz€\@¿ 1eed[cpil&‚ Ydgjgnj_p<ƒ.?ebfmtyen…AYcshkzttwu7€- 0ghkpv}wqn, A¿3`h#lS'† -]gh.dl^G ƒ Lh_dWraoeƒ &_mlaimsxYƒFproott~qG€@¿*:  !„ #MP G  „€ @bVYa7 …#VmR2mcD ‡, IgkMTsa; @¿#+‚€  % €€, % €€+ † &*/@¿€   ‚" „€  %    ‚?¿  ƒ ‚‚  ‚‚ ƒƒ   @¿ „  ‚‚ € @¿€ ƒ    ‚€  …€  €?¿7N„ =8   * ‚ #ƒ  €@¿  FT „$€ "gP‚6. Cd$€€8&J[ƒ'%FA¿€ P[ 8 sb€€DqR 7„U [zI0‰9€€€ay,E@¿  ,‚, C/3& 3‡S(X.€€ Q0*  \‚€A¿ 1* 5ƒ+?1 , 6&-4€!  + ‚  €A¿(3 0(+  ‚1:)X*-€b $=* 0Q5-2F ;2,?<  $+(@¿7/3,lL.€€/;H%  B€^3€;3\7  Hqt:€H%<(9!a}j85AE  YX$ A¿ 0=c~o ;dG  9VwmC. 9YuY € Br‡H!>ZuZ €I 2AryV HVnX,>‹\IWa5 @¿#NŠ{s&Rfzq- €3ysyf4  #Oitx@ € "`€hg9 'Xfgq? 2p‡lW(\oqh%0,oxu@1_ƒƒxJ @¿Vpwt:-„xhx= €S€oŠ< N|uj~R  ;qzn~q N}xer> G{nt€V+<1"[~}‚‚c& A¿ !$.‚m"\8+u}knC Ngo’Ž&:^TNŠruJ Aivz”v.N=V‡…mzeO~k„”‡bigm–}ktr'qކ€™…¦v‰¡…r‰K C¿, /?{‚…u'1T>  ";>H9/d„y‚nWPZhk"5kutbjƒ€v{x}€mp}.€]vr†qrwo~‰isy&€+pvvˆŽy„~~–”€‡ƒ]D¿ 6™|yy†@+' 5! /`zw„{R90 4[@J{ˆ|€‡~‹„`]\Qliy‚‘{…„–›ˆktx' krm€ŒŠ‰ƒ…˜œŽyƒuB¿D—†~¨ŒŸˆ9 'PŽ”‡­ ˜†[  41Š~‘–­ŸƒŠuYO0 &H@z‹‹Š”£¢‘™ƒuzv&,Yr€›‘žªŸ“‘ƒx†k"B¿8‡€p—¥‡¦…_o8!$" € Ai7~l ‚/ Qn“†"Fˆ… 'pk¤x"Kš{/ €ICvˆ“uTPu§‚w'AÀ FS>uV##'8r‹`jx€‰‘ˆ>€,rŽzƒ„ƒ‘’: U”€wu~‰•u’‹,$ƒŒ}„‘ƒ™‡™n?¿K[hq–vƒ™žl8-86j|lŒ•€|ŒŠ›h+=;††xp„uox’V €|8U–{p‚‘…•Šv‹šG@¿->+E %DI\Žƒo]A+?;jƒtbJ\te|›‡S<$ E=‹•viŠˆx~‘‘X24Y–‚†nww–j"‚b.{ƒ†{tœ›ƒv‡„‹Y@¿-9 $^?4{?r¢~$/ F7c™u?TjWvœ—•+'2Q+eŒ—ƒ[pyƒœ ŒF#/€+'?;‰–ŽqvuІ’œ”\!d“œ”xtsžŒš”ƒ>€|@¿ :%Sya"] }¯ª0FPˆ­…<2M^o—Ÿ£k8 &Av¦Ÿ…a[az†Ž›ˆy.35/%€œ—„ƒ^l} ™†8&++‚–Šƒ…c~˜–Šf €2@¿%|Ž‹šJH–••6(-¦“Ÿ“N8`œ™˜I(€0#h¤ž•sQLycZu›˜5. ;Sžm`ž³ij~ž’‹0+€24A•• ‚w‡ªžzyŽ˜…ŒD@¿ 4‚‹‹fHP=P‡—†u€#S–—…`?dQH`˜šŠ„2 6ƒˆ—™X9vÃkDg›—d";‡—žQZ¾ÄsVx›“‹ -#,=™–z`†€‰…vФ‹Ž<'@¿#[ƒ‰‹Œ‹i„hN‡˜Ž'`ŽŸ˜ƒet³„h]‘ †/€&“©„Ru¥»”we™–Œ‡09P‘Žš{^‰¥¬’vyš•€E (*Xšˆ›€m’‹’†Ž•›T"B¿ #r™“z]bcjpx‡Š›awŒƒq“ƒ‡}‘“z™D|?„¤{‡™¸”‰{œ—…ˆ@ 4t•”ž‹}Š¥°”†ˆž„|w'$)r§“–…‘„‹”‡Ž‘¡Z$C¿tŽ”ˆu‰•‹ƒ€“™z pšŽ~~„‰•Ÿ˜ˆ{|{l€E‘~|Ž­•²“ƒƒ…Œ[€(r‘‰”‰}•¢‹°–‡•‘šF$*|–“ŸŠ~žŒš±Ž˜š•w'C¿|•Ž‚¡œ›ªª‹¥­‰”˜x$Ž£ˆ¥”†{šµž}m">’”ˆ¡¦{oˆ²‡„‡—a.aˆ…€§œ€w˜”‘™ŠD4tˆ‰‚«¯Šˆ›•–•‚2B¿ "s„‚”…·½š—ºˆ†—t!9—–«›––œ³…‰•P!H˜†“›“n|„›˜„ŒŒJa,PŸš…–œˆnW†rŒ‹ŠŽ=+f–†Œ¨€ts~zŽŠŠ„~,B¿#T~ˆ‡ƒ¡­—–—…—F'u’~…¡——•’‰ƒˆ‰3€.";Љ“›ƒ”“¨¥‰–”t(&?›‘“Œ€–”e›£“ˆ•”t€%N ‘”‡€•‰€š”Š•˜Ÿb A¿‡”…w}zp“„ƒ|ƒ{ 7›‹sšŽiu›‹zv‡{  `¨…{…›n”›”…„’g $vœ‘…—šŽ¢š¤‹”œD€H&‚›Š–˜žŸ›Ÿ—Š™£'A¿4Œtˆ…y‹¦‰}¥> X•|€¸ƒ„Ž‘ˆ|‡œ.‚*‚•}{•ˆŒ†…'•…’~}†‰•‡“~ €55¢…’ƒ‹„’—™^?¿TŒ}„ˆŽ˜’Š~‹V € y™w’ˆ–}˜D€!…‡u‰‡|“‰|†š5€P<˜ €z„„‹ŽŽ– B§‰zƒŠœ£x @¿  f™€u‡z†€6€ n‘‚„x”•‘+„pŽŠˆzˆ’’l%o„ŽŠw‰ž’U ƒ- 1Ž”s‘ŽK @¿>„•‚5}‹( €‚ 1‚›v>ƒz& €€€  Pˆ–X=xa „FuA>k4„0H€Y2BE@¿ B$ € ;€ #  ƒ   €@¿ ‚ „  €€ €†€   ‚?¿€ƒƒƒ… €@¿€  €    ‚ ƒ €*@¿     †   ƒ    €@¿ &Pf_,e€a$ … $R|NB>‚€Pv,,OQ' ƒ7G?+„+ 18D  @¿ QŠ‚ƒ†Ž’“Q€„ Z‰ˆŠ€H‚Ev”Ž••‘= … Qƒ’‹˜˜jH  HmŽŒ€# A¿1…”Ÿ‹}‘‘ŠA 5Œƒ{‘˜w‹t!‚A’„{|ƒ|†ˆB†!o‘‚—‹}‡–O +^–ˆ‚‘€€‹‰#A¿ *r†ˆ¢¢œ‹…w‚)ƒ/mˆŽ‚Š›œ„|T rˆƒ‡¢Œ‚†ˆq€ u‰‹ƒ„™™w…@€€I b’‰Žƒ ”}ƒ•} A¿Gyx}ƒ–ª ƒzuw‡P@~€ƒŽ¥¬§€z}i€,:ƒ|~†¡±  ˆ~‡_0ˆ|‚™š”‚…„“$‚0 %‚Œ–…‚œ™€…’ŒE@¿0|nŒˆ—„Š›‰wtY!H„su††²‘‰‚{‚„;€€ !_ˆ}…‘ž«Ÿ‡|~} € LŽ‚‡‡œ§–š€|xW€ E‚ƒ˜€“’|€Š†…€L@¿ @qŽˆ™¡‚–¤ƒyn|u #[€wzƒ™™Ÿ‘”~ƒ‰‘Zl‰†‡”¬ŠˆŒŒ—8 € iŠ}†Ÿž˜…„Š n€ƒŸ¤˜†‚‡šA@¿ gŠ~”Š€¦Ê¹Œ‰|y‰|D(2uŒxs‘Ÿ“~~‰x, yŒ‚~~ ¡„€‡e J '“Жއ†“¤‰ŽŽˆ5 *™š„“ž¡”…”™l@¿+o‚‹ž‘—ÔÅˆŠ…r}f"€/8zzw€ˆŽµ‡¡—ƒuz…T#!=~ys}Œš‰“{€xv~…A€G…‚‹€‚‹–ƒŠ‚‡‚†[ €cCŠŒ‰‘•‘ƒ‡Š†8?¿.3~ƒˆ˜‘€€¯§–‡Œq„o)#<Žtˆ‡„¨Ž™¨†sƒL!!O‘ƒv~€”–„˜…}€Ž„A€ %Tˆs{~ƒ¡ƒ‹€yv‹s-2 )RŽyzˆŠ’†zx‰L@¿,>‹¡~®­›º‰Œˆt~0 €$DŽuw‘¤ˆ´|qsQ#bOŒ„txƒ’Йޅ‚ƒA+ZކŒƒ…Šˆ›…ˆ†Š‡‹~, )UŒ‡’ššŽ‡€‰„H @¿ 4€””’€—»‡€« |v‰‚' €GF•yw{zš•‘’}xyd!N—xy„‡‚ ˆ„ˆ{…‡ŒK`˜‡Œƒ‘˜”†Ž†! 2 %P’‰ƒ‚— ›˜‡…’‚d @¿&v¢ƒ•‹„’Œ‡}}—„ €.Šww„‡}–”ƒ…„|‡i D›€ƒƒ‡†—“ŠŠ‰“Ž>;Š•ˆ•›¤“Ž‘—t L–”…~›™›¥„„‹~—B@¿ %o–Œ…‚ƒŒ…ƒ¡l."jƒ‡ƒ–¤’“‘˜9(…”ˆŽŽˆ£¤‰‹Ÿœ™‹€ˆ’”‹†”–ž¤’‚™”›H€K”„’”˜¥Š€ˆ ‰ @ÀK¥•‰~ƒˆ•¢ž‹…’•¡0O©Ž‘ƒŒŸ›–Š…‹   Pœ…¡“}”žŸ‹ˆ™„¨O€GC’¥“ƒˆ—Œ‰Š¢’ˆ /•š…Š•”šžŠ… U@¿zªŠŠ”™’–Œ…™^€€£„…†~—‚Œ…¨;€ ‡‡„Š–‰‹‚˜‘ €Ll¤Š„€z•šŠˆ‹¥DWŸ–}}…•ŒŒ¢z @¿ ‘•‹“¢™ƒ›™—šw –Œ“ˆ‚Œ™“••“d ‚+ †•‘ƒ‡˜‹¢‘—/ ‚Ÿ}’‡Š•Ÿ¤˜s …/ x¢…Š˜”‡¨˜‚?¿ p“—‹Ž ¦¦x‚ u©œ ŸŒ¦¾ \ … u«©¶—‰Åˆ$‚ o’°›rW|ŽG ‚ R{¨€I1iQ‚@¿€  )Zu‰`m”P ƒ ƒ…›™‡‹…f€ ‰†—‹„˜Š‹‹ˆƒ~“–„€–‰—Fƒ P𔉉ˆ~˜”b €™“Œ‘ªm  7?¿^”Œœ™‚ˆx{†D•‘ˆ‹…•‹ŒŒ‚L€!”Š“†œ•’u €€ z“”„‘™šŠ+ / N™›ŒŽ‘†–”9 @ÀxŽ’‰€Œ¢—‚ކ‡“A h“~…Œƒ˜‘†•‚ŽYƒ )†|‹•‡„˜€u‚™‹‰‘ˆ€‘“K /K‘“œ}žmA¿""nyy…ˆ„••ƒ…‚˜a l‡{“‚„š“~‹…ƒc€ G’†wˆ™zކŒ% ƒ cŒ~}…“ˆ}Š•N „/W™~‹Š…ƒ‘p@¿),s{~€…‰‰}q‹`€kˆ}€‘Šv‰€R€€A|†‚ІŠ…( b‰Š{Ž‹‘…Œ™@ €‚-Jzy‹‡¢Q?¿"{‡…}z†˜„{ƒ‚‡Z„ Y{vu{‡“{xyˆl„€xvxn„‰y€wu €Ot~|p‡~‰m  ‚€- nƒwy‹‰ƒŠ,@¿[|Šˆq‚{ŽŽ|’>‚.8Šzˆ†‡ˆ„d  w†…~‡‚{l ‚ B…z„~…ƒ… ƒ g…ƒ}_‡… €@¿™†}w‡ˆzƒ”~І…Œ‘1  K~Œ…“•…‘Y…„z‹etž™o  €/ bš†wV˜T @¿-Š‚{“‘‹¡•“ª4 ƒ(ˆ‚‹zŒ–©a ‚ w‰WW~–f €(UŽ‚x,1‚[ dI  €@¿ 1x––A©ž®t O–¨lK¨“n ƒ (}—y"0G7 €„ CTD‰/  @¿ `zT_uE‚4vv8 $€‚  +$ €€   ‚„   ƒ@¿   †  €‚   ‚„ €@¿ €ƒ€ ‡ „ €„?¿ …€€€‚€€‚†€€† @¿‚ƒ€€€‚Œ@¿€ ŠŽŒ”Š@À‚€€‚‰È@¿÷@È$‡!"!"Š!€"€! "!!"!"!"!!"Ì!$X×Va__``€_``^`a`__€`€_ `__`__`_a``_`_‚`_a`_`‡_``_``_€`__`__a†_``__`€_`€_`„_`_`__`ac`_a`__`_`€_aV‡¿…“ ’ˆ@À  … € €ƒ €†-   A¿‡‚€€ ƒ€€ €€@¿  €„„‚  …. @¿  … ƒ‚   €ƒ ( €6@¿       €  ƒ  ƒ - €@¿    €G    $ * #    .  ‚€ 1€@À. ((‚,&(  2 #+*-'K 4/  2%+ '0@¿ !5$, /)9€-7-#5@%%.  -6:-$ ' -0$20>7 (+ €3(>& /D(#C¿1('/%:, (=$#I? €$3->3   ‚ 05  21-)C &g@ C¿ "2)N27  '2:) €(   ‚    %€*( QPXb A¿""7%3+ €€ 1#&2 ‚+  €   ‚  z9 ,4 ,1 €@¿ %     €€,  A. €179- @¿! '^U‚ AžB)“™%oÀ|*€€z\ ~jv,@À *“–"C B”ˆ|!3]*  K˜ˆ‰HnX#   #bœ‰Š”•“[€J[Œ‚ƒ˜«¸—!C¿ 1I]”rD>2    _y†…‡Ž„‡M  €-7k}…•±¨…P (Hkuo†’§£Ž> @Dms{‘›”Œ‘† €D¿  Gtux¤‚‡wN € 2hsu|€„ƒla€ Aot{}‚‚‰‰vd 1`dehq~„wzuu  ‚ _idkZ{‰}‡”d@¿€  Nknh–ÁvnkJ2flqw{}|hiQ‚ Vbjt{zƒtn}TƒG.fihaq~€kolR `cgiTp†wz€\@¿ 1eed[cpil&‚ Ydgjgnj_p<ƒ.?ebfmtyen…AYcshkzttwu7€- 0ghkpv}wqn, A¿3`h#lS'† -]gh.dl^G ƒ Lh_dWraoeƒ &_mlaimsxYƒFproott~qG€@¿*:  !„ #MP G  „€ @bVYa7 …#VmR2mcD ‡, IgkMTsa; @¿#+‚€  % €€, % €€+ † &*/@¿€   ‚" „€  %    ‚?¿  ƒ ‚‚  ‚‚ ƒƒ   @¿ „  ‚‚ € @¿€ ƒ    ‚€  …€  €?¿7N„ =8   * ‚ #ƒ  €@¿  FT „$€ "gP‚6. Cd$€€8&J[ƒ'%FA¿€ P[ 8 sb€€DqR 7„U [zI0‰9€€€ay,E@¿  ,‚, C/3& 3‡S(X.€€ Q0*  \‚€A¿ 1* 5ƒ+?1 , 6&-4€!  + ‚  €A¿(3 0(+  ‚1:)X*-€b $=* 0Q5-2F ;2,?<  $+(@¿7/3,lL.€€/;H%  B€^3€;3\7  Hqt:€H%<(9!a}j85AE  YX$ A¿ 0=c~o ;dG  9VwmC. 9YuY € Br‡H!>ZuZ €I 2AryV HVnX,>‹\IWa5 @¿#NŠ{s&Rfzq- €3ysyf4  #Oitx@ € "`€hg9 'Xfgq? 2p‡lW(\oqh%0,oxu@1_ƒƒxJ @¿Vpwt:-„xhx= €S€oŠ< N|uj~R  ;qzn~q N}xer> G{nt€V+<1"[~}‚‚c& A¿ !$.‚m"\8+u}knC Ngo’Ž&:^TNŠruJ Aivz”v.N=V‡…mzeO~k„”‡bigm–}ktr'qކ€™…¦v‰¡…r‰K C¿, /?{‚…u'1T>  ";>H9/d„y‚nWPZhk"5kutbjƒ€v{x}€mp}.€]vr†qrwo~‰isy&€+pvvˆŽy„~~–”€‡ƒ]D¿ 6™|yy†@+' 5! /`zw„{R90 4[@J{ˆ|€‡~‹„`]\Qliy‚‘{…„–›ˆktx' krm€ŒŠ‰ƒ…˜œŽyƒuB¿D—†~¨ŒŸˆ9 'PŽ”‡­ ˜†[  41Š~‘–­ŸƒŠuYO0 &H@z‹‹Š”£¢‘™ƒuzv&,Yr€›‘žªŸ“‘ƒx†k"B¿8‡€p—¥‡¦…_o8!$" € Ai7~l ‚/ Qn“†"Fˆ… 'pk¤x"Kš{/ €ICvˆ“uTPu§‚w'AÀ FS>uV##'8r‹`jx€‰‘ˆ>€,rŽzƒ„ƒ‘’: U”€wu~‰•u’‹,$ƒŒ}„‘ƒ™‡™n?¿K[hq–vƒ™žl8-86j|lŒ•€|ŒŠ›h+=;††xp„uox’V €|8U–{p‚‘…•Šv‹šG@¿->+E %DI\Žƒo]A+?;jƒtbJ\te|›‡S<$ E=‹•viŠˆx~‘‘X24Y–‚†nww–j"‚b.{ƒ†{tœ›ƒv‡„‹Y@¿-9 $^?4{?r¢~$/ F7c™u?TjWvœ—•+'2Q+eŒ—ƒ[pyƒœ ŒF#/€+'?;‰–ŽqvuІ’œ”\!d“œ”xtsžŒš”ƒ>€|@¿ :%Sya"] }¯ª0FPˆ­…<2M^o—Ÿ£k8 &Av¦Ÿ…a[az†Ž›ˆy.35/%€œ—„ƒ^l} ™†8&++‚–Šƒ…c~˜–Šf €2@¿%|Ž‹šJH–••6(-¦“Ÿ“N8`œ™˜I(€0#h¤ž•sQLycZu›˜5. ;Sžm`ž³ij~ž’‹0+€24A•• ‚w‡ªžzyŽ˜…ŒD@¿ 4‚‹‹fHP=P‡—†u€#S–—…`?dQH`˜šŠ„2 6ƒˆ—™X9vÃkDg›—d";‡—žQZ¾ÄsVx›“‹ -#,=™–z`†€‰…vФ‹Ž<'@¿#[ƒ‰‹Œ‹i„hN‡˜Ž'`ŽŸ˜ƒet³„h]‘ †/€&“©„Ru¥»”we™–Œ‡09P‘Žš{^‰¥¬’vyš•€E (*Xšˆ›€m’‹’†Ž•›T"B¿ #r™“z]bcjpx‡Š›awŒƒq“ƒ‡}‘“z™D|?„¤{‡™¸”‰{œ—…ˆ@ 4t•”ž‹}Š¥°”†ˆž„|w'$)r§“–…‘„‹”‡Ž‘¡Z$C¿tŽ”ˆu‰•‹ƒ€“™z pšŽ~~„‰•Ÿ˜ˆ{|{l€E‘~|Ž­•²“ƒƒ…Œ[€(r‘‰”‰}•¢‹°–‡•‘šF$*|–“ŸŠ~žŒš±Ž˜š•w'C¿|•Ž‚¡œ›ªª‹¥­‰”˜x$Ž£ˆ¥”†{šµž}m">’”ˆ¡¦{oˆ²‡„‡—a.aˆ…€§œ€w˜”‘™ŠD4tˆ‰‚«¯Šˆ›•–•‚2B¿ "s„‚”…·½š—ºˆ†—t!9—–«›––œ³…‰•P!H˜†“›“n|„›˜„ŒŒJa,PŸš…–œˆnW†rŒ‹ŠŽ=+f–†Œ¨€ts~zŽŠŠ„~,B¿#T~ˆ‡ƒ¡­—–—…—F'u’~…¡——•’‰ƒˆ‰3€.";Љ“›ƒ”“¨¥‰–”t(&?›‘“Œ€–”e›£“ˆ•”t€%N ‘”‡€•‰€š”Š•˜Ÿb A¿‡”…w}zp“„ƒ|ƒ{ 7›‹sšŽiu›‹zv‡{  `¨…{…›n”›”…„’g $vœ‘…—šŽ¢š¤‹”œD€H&‚›Š–˜žŸ›Ÿ—Š™£'A¿4Œtˆ…y‹¦‰}¥> X•|€¸ƒ„Ž‘ˆ|‡œ.‚*‚•}{•ˆŒ†…'•…’~}†‰•‡“~ €55¢…’ƒ‹„’—™^?¿TŒ}„ˆŽ˜’Š~‹V € y™w’ˆ–}˜D€!…‡u‰‡|“‰|†š5€P<˜ €z„„‹ŽŽ– B§‰zƒŠœ£x @¿  f™€u‡z†€6€ n‘‚„x”•‘+„pŽŠˆzˆ’’l%o„ŽŠw‰ž’U ƒ- 1Ž”s‘ŽK @¿>„•‚5}‹( €‚ 1‚›v>ƒz& €€€  Pˆ–X=xa „FuA>k4„0H€Y2BE@¿ B$ € ;€ #  ƒ   €@¿ ‚ „  €€ €†€   ‚?¿€ƒƒƒ… €@¿€  €    ‚ ƒ €*@¿     †   ƒ    €@¿ &Pf_,e€a$ … $R|NB>‚€Pv,,OQ' ƒ7G?+„+ 18D  @¿ QŠ‚ƒ†Ž’“Q€„ Z‰ˆŠ€H‚Ev”Ž••‘= … Qƒ’‹˜˜jH  HmŽŒ€# A¿1…”Ÿ‹}‘‘ŠA 5Œƒ{‘˜w‹t!‚A’„{|ƒ|†ˆB†!o‘‚—‹}‡–O +^–ˆ‚‘€€‹‰#A¿ *r†ˆ¢¢œ‹…w‚)ƒ/mˆŽ‚Š›œ„|T rˆƒ‡¢Œ‚†ˆq€ u‰‹ƒ„™™w…@€€I b’‰Žƒ ”}ƒ•} A¿Gyx}ƒ–ª ƒzuw‡P@~€ƒŽ¥¬§€z}i€,:ƒ|~†¡±  ˆ~‡_0ˆ|‚™š”‚…„“$‚0 %‚Œ–…‚œ™€…’ŒE@¿0|nŒˆ—„Š›‰wtY!H„su††²‘‰‚{‚„;€€ !_ˆ}…‘ž«Ÿ‡|~} € LŽ‚‡‡œ§–š€|xW€ E‚ƒ˜€“’|€Š†…€L@¿ @qŽˆ™¡‚–¤ƒyn|u #[€wzƒ™™Ÿ‘”~ƒ‰‘Zl‰†‡”¬ŠˆŒŒ—8 € iŠ}†Ÿž˜…„Š n€ƒŸ¤˜†‚‡šA@¿ gŠ~”Š€¦Ê¹Œ‰|y‰|D(2uŒxs‘Ÿ“~~‰x, yŒ‚~~ ¡„€‡e J '“Жއ†“¤‰ŽŽˆ5 *™š„“ž¡”…”™l@¿+o‚‹ž‘—ÔÅˆŠ…r}f"€/8zzw€ˆŽµ‡¡—ƒuz…T#!=~ys}Œš‰“{€xv~…A€G…‚‹€‚‹–ƒŠ‚‡‚†[ €cCŠŒ‰‘•‘ƒ‡Š†8?¿.3~ƒˆ˜‘€€¯§–‡Œq„o)#<Žtˆ‡„¨Ž™¨†sƒL!!O‘ƒv~€”–„˜…}€Ž„A€ %Tˆs{~ƒ¡ƒ‹€yv‹s-2 )RŽyzˆŠ’†zx‰L@¿,>‹¡~®­›º‰Œˆt~0 €$DŽuw‘¤ˆ´|qsQ#bOŒ„txƒ’Йޅ‚ƒA+ZކŒƒ…Šˆ›…ˆ†Š‡‹~, )UŒ‡’ššŽ‡€‰„H @¿ 4€””’€—»‡€« |v‰‚' €GF•yw{zš•‘’}xyd!N—xy„‡‚ ˆ„ˆ{…‡ŒK`˜‡Œƒ‘˜”†Ž†! 2 %P’‰ƒ‚— ›˜‡…’‚d @¿&v¢ƒ•‹„’Œ‡}}—„ €.Šww„‡}–”ƒ…„|‡i D›€ƒƒ‡†—“ŠŠ‰“Ž>;Š•ˆ•›¤“Ž‘—t L–”…~›™›¥„„‹~—B@¿ %o–Œ…‚ƒŒ…ƒ¡l."jƒ‡ƒ–¤’“‘˜9(…”ˆŽŽˆ£¤‰‹Ÿœ™‹€ˆ’”‹†”–ž¤’‚™”›H€K”„’”˜¥Š€ˆ ‰ @ÀK¥•‰~ƒˆ•¢ž‹…’•¡0O©Ž‘ƒŒŸ›–Š…‹   Pœ…¡“}”žŸ‹ˆ™„¨O€GC’¥“ƒˆ—Œ‰Š¢’ˆ /•š…Š•”šžŠ… U@¿zªŠŠ”™’–Œ…™^€€£„…†~—‚Œ…¨;€ ‡‡„Š–‰‹‚˜‘ €Ll¤Š„€z•šŠˆ‹¥DWŸ–}}…•ŒŒ¢z @¿ ‘•‹“¢™ƒ›™—šw –Œ“ˆ‚Œ™“••“d ‚+ †•‘ƒ‡˜‹¢‘—/ ‚Ÿ}’‡Š•Ÿ¤˜s …/ x¢…Š˜”‡¨˜‚?¿ p“—‹Ž ¦¦x‚ u©œ ŸŒ¦¾ \ … u«©¶—‰Åˆ$‚ o’°›rW|ŽG ‚ R{¨€I1iQ‚@¿€  )Zu‰`m”P ƒ ƒ…›™‡‹…f€ ‰†—‹„˜Š‹‹ˆƒ~“–„€–‰—Fƒ P𔉉ˆ~˜”b €™“Œ‘ªm  7?¿^”Œœ™‚ˆx{†D•‘ˆ‹…•‹ŒŒ‚L€!”Š“†œ•’u €€ z“”„‘™šŠ+ / N™›ŒŽ‘†–”9 @ÀxŽ’‰€Œ¢—‚ކ‡“A h“~…Œƒ˜‘†•‚ŽYƒ )†|‹•‡„˜€u‚™‹‰‘ˆ€‘“K /K‘“œ}žmA¿""nyy…ˆ„••ƒ…‚˜a l‡{“‚„š“~‹…ƒc€ G’†wˆ™zކŒ% ƒ cŒ~}…“ˆ}Š•N „/W™~‹Š…ƒ‘p@¿),s{~€…‰‰}q‹`€kˆ}€‘Šv‰€R€€A|†‚ІŠ…( b‰Š{Ž‹‘…Œ™@ €‚-Jzy‹‡¢Q?¿"{‡…}z†˜„{ƒ‚‡Z„ Y{vu{‡“{xyˆl„€xvxn„‰y€wu €Ot~|p‡~‰m  ‚€- nƒwy‹‰ƒŠ,@¿[|Šˆq‚{ŽŽ|’>‚.8Šzˆ†‡ˆ„d  w†…~‡‚{l ‚ B…z„~…ƒ… ƒ g…ƒ}_‡… €@¿™†}w‡ˆzƒ”~І…Œ‘1  K~Œ…“•…‘Y…„z‹etž™o  €/ bš†wV˜T @¿-Š‚{“‘‹¡•“ª4 ƒ(ˆ‚‹zŒ–©a ‚ w‰WW~–f €(UŽ‚x,1‚[ dI  €@¿ 1x––A©ž®t O–¨lK¨“n ƒ (}—y"0G7 €„ CTD‰/  @¿ `zT_uE‚4vv8 $€‚  +$ €€   ‚„   ƒ@¿   †  €‚   ‚„ €@¿ €ƒ€ ‡ „ €„?¿ …€€€‚€€‚†€€† @¿‚ƒ€€€‚Œ@¿€ ŠŽŒ”Š@À‚€€‚‰È@¿÷@È$‡!"!"Š!€"€! "!!"!"!"!!"Ì!$Xt8mk@(¨ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ¨w@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿?ÿúýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýúÿ¾@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿?ÿûþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþûÿ¿@ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¿7éÚÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÚé¦ic08ç jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ Œúÿ“ÏÁO>Ò0˜«¼n4ðÓ^º+®Žöt³é7ç³6ÿ^ëJ)c„Ë£×/C}vþ*‡Rr×DM&ce¶NùÇýd€€ÏÀÀ{Ÿ8:¼ ˆõò:’‚8ô¡Œ;~ Ø”£¹êz/bÌÝ`')ÎtˆY- ¦æ¯õÇà‚$?P@XˆBß BLÖ0(Þì0 ¦ì‘J°æ¡í4]"½òýRÿúZ’Ö ¥ãƒèËg Þ&˯˜Tžû‘Ϻ|øß³›ôŸQ((¼´(PÿLEÓšö›¤Ÿ—]í?Þî]òôG…£o³;Ï*—:ød…îÿuøµ[ÝÎﺺÆk %9Þ0bú{©oAc… Y©'îѶm ¤'ŽsÀ¬o\=p!~[D¬{ç9Žh”·jø˜p£éÛ$×’½ÿ^H$ÖX÷:;~ð€€ÁõÀùÃ@`•:`†>œò-Í}0Çá{GávCð½ÀŒP ÛòÔD¨w !˵ë'¬£S2šëƒÿ;ÌBÐZq;“QÅ?xãYm.&qsp(™±€éGú¶q ï úÔ·-ÅÀ­æ¥,²€°Åç°UÿO ¿y¶÷6Eá¯ì¤P„/ª°¤ ·hì0IÕ "ŽU{!vQ*&ˆx£V¾b¡hqÛìÙÜ¡_·0’ù-ðÁ¬K“>áÔQr¶y9/,ÇÂ3œáÑëQ›ö‹‘& üCfèìž0Yú(XHó¬mé;¹­(†r‡ó,½9[ÉûܰûÝá˜OP²§^¸”ا½ Ác­|:ÿZÑg¢èæ]¼Ÿ÷¾OÐŽQ†$jœMçý– wнEÊí³y¥ÖI’™Ù‡9W…JFܳ‘¹Y¶E)‹ðå-©bZ)Øô™Ž•ôïÝFt¢O2]bç@›@¢ß{Þ›8 § ~Öëª6Õ]i˜u4ýõÅötðSšÂi´bÅÛž¾ãlàsoê¬`¿r¸%ö¶E°IP“PíÔ<¤“{6ß–¬ÊáŒ:¬lö¶{/ ½ÂÎó0yKiÇáe#t 1¹:ÈJÙMÊ,ù¼Ír“)ö@€L)kÍ‚þ²¨RJ.:œLUÜkµ½.Iêó±vt!òŽXôH•áiE%ÕVðʹHDbú/ŸŽ6o:šp¥ßþh×[x\•ÒL:ø´=שCò_ |ÞÍÊÑK# ×.Cíï¿z:m ½b´\m®_³!gøFº¯N5Fªsøu]À 0Ú’ÑŒ tXî1én¸Œ±´…Pnë%h€ZFvŽ2 ›Txe”êge_I ¿ÅÉ! §¬9Ûd­Uo×,Ü~W(ŽBMØV=]¡Õȱ=`Çw§ù¯nèž]—%KßD!`¼T‰„AÇÿ\}ÕPLäŸo±±}F˜hõÏ´ÍkVPgÄáÊâ5± ë]aá\A`¡ýã½´€€Ãí ƒê €|€ÀÈ+üL¥hÅs)_!¨v‚wgˆ+UnÃíìòobü;@j*ß¹\µ^Z9†‰7D¿A¸†êG1i\l¯Ñʤr·B¨‚YÀCãY®S ÿ-@˜vì…¸¨7C>…(ð—V?ñ²=EðåÊ"šÆÁªoZ·I×J'/‡¤ÈE5ïÑjm£Ý§|êú€˜=“–r¡ðº!ÏQ 2¦UbòZ£@«BÙ&SéWNåþD± ÁÂiv§ŠöÎÙµq(w’ò-U:oú¹Ì_.q°¤owÜwV°&¾ps»HkrbB]a7ݦCLR‡o0Ä+49å_ê ù+¶(W/xh sÑ÷ýz÷¸l> æ„WgÂ2n¬&Q vz*<§—0zW¿8¥ ƒ,ràü:ƒžÖɲë~GA0ÙÉüSÚ¾×ýÈ/.D‹í‰øxД2˜³Ë»e¥Úb “”Å{!=ÜÅ@Éž‰Ã¹GÒsNl‚‚ßc¾”ÚóúÙ"b0ç©â2o8>BÓ¿¿ ª|N÷½™s\Ü þ“e^óÄ1ÒÇØ´ô€´È_´8wwbzQã¯þh“Át~u¼¯èªþ¶Ùÿsí¼u¢Œsò°Ú¿À™2z×ÄÅŸà õV¯)bÍ:f3UËãÇÊÓ”Û¸"\ÅPâÀH 'J-z‰™ãÀ:›^;]£Âúo¯ð}£Üuïj|8»©“ÐɈ˜ •\dkƃ±p,¬ßs¤µ×YêZºÃÊØËáŠC1šƹ¨¸ŸÂ÷÷²30ôžÊ÷‹rºwvÀ?óè”Ó®³ûâúÏ­KÇôüçrZo\ÝfRaqR‚õ±Û÷ 7ÆÀîã…ÌsÆË9.ÂW×÷®†`u [Fj FÜÐC²¶ÅDäáw3¨¿@1=ü–Åè§KCÈàlE?MHœ°)’·¢vÉèÏv"ãÈŽÁEìpST¶¥…»ŽøÇÏužlZëšèçËÓX_ñ‘²PJÚŠ0ëìóq‘w<þ)[ŒƒUkþµòŠähXnV÷+‡cæ#-¹Äø¸‰6—nêàgv°ñ Ÿ)ŒÄ­Aß+cT'çŒb‚ Ï{‰˜µÒ ²êEÈÆ¤‚úÆÝDÐGLP³çŽã÷U¢ßàPàƒòwòEÅ¡±"×½#'hÅ–UŽQQ›pQãñÏBi¸`™7ú\*ïÝ2}ëVtï,Lz!žÐQšTýüøzÏ4{•5öŒZ˜A~¨Ñ›DD4êUÚ0ÕU©*#yPÓýd*j×Ú¼4 ÚõÍ’<Æ›g›¤aŒXì§VÃn¥Ã1;á%axrPÔPÊ(qôˆ­kƒƒ'Z_LN„´¨ÍÙÔ͇…‡(唎W3™ÖmÉüÐÒ~)ž”ÌõÑ< BµU“I9nf1œtŒ.‡¡Õd“±§Âñ°eÑdúɉüWД@¶\³òæÑŸ8¡åHΉU»sË{ ¼‘ ªáh'f‚,A F—ýsÇaJÑG3H}­Ì !zÓ0iŸA‡ay–ñ» þžTùùÇ*n]g±AÀ—[þϼPà½9wbëÔ—‰XÖöží4¨cLD9ý6¼ sOˆe‚&@@ÓŃ·µ7LÐË›T"iPwÁÉTn4‘ÀAQc{‚äè»ø*û€ŽãÄóxAOàÝ)-òÄa&ò Ûä0®TQà貪óá¸Ísº‡pÀ›².l‚hÙµêi®õ6ÔôÞa>[ ±Qù {T:x7*O¯){^àqƲY,зðêÂËYÍ©/ºtE# ÓÿJÑâÇî!µŸÞÉ©¶4ór+7÷QÑgŽ7¾4f” â5 > ÔŽEºzæ`ãËž)§EZûv1Ö.8y‹&?ëç!*åNnc*¿h ý¶Y‰ÙšJ¿å–RŸ›•ä°å0+2ÿštÇÌî ê«>IOJÒÝW€²yø²a?ÝD‰DÍ6w„¯…&ÉUBÕ¼P,%p}˜5§É“Yó«V»Þ ß'(5•edôbãÁ… V©€¾Ôà—˜–òïD›à°¶C°a¥ŸÔ"<äúưÝh€*éîË•Hڇϑ%lj´Ãx%-ðÝÒ^ô»îÐ@&Ç.k%Ó"=PäTårÝ* qÖ–>qÈ%÷Þ²b_ßQΡµGZW ‡< ü*…¥¨ä¨ÎRç3.ê®ÁÞŸMEPGúD0_ªŠÓ#ŠõAñc -̰FbæáýP#Ñ].¯ÏSP¼ËåX—ܱÆdÕ¼ê+Êã$1Çý·›ÊÊ- 5h¥lÚ˲¾Ì<ŒÖ¶ˆ¸ºúÉÔ%WSâ‚äðŒ·«Ùv\dvdv '-H0”~ͳ‡Û;ÀÉ›¿*rLè.ZŠó Ìx¾Û-âs™«xÏ(‚M°S”µ±ùuù9¹îÝ´Û(úJ´Dpàí Ñ·—Ë¥”Õw#A•ƒ,ê€Ke9á°;LˆF–¤p¥5ÍÀ(Š~«aG/~¾¡oë$.%gFSðª:öÑ-ô“çÔÙ·½} Æï[r{yÎ@xò„ŒèL±OXjÓÌëûFæ^Þþö~ŽËë˸qQúäùôžÖ‰Oh¬@‹ *ù¯}a…}NÝà¨ÂŲ—xõîø³­±yùAçç ²¶¾)ú ±â‡ÀËæƒ]_cÿõ å‘6(UQþ¨÷úÆ[ƒ¼õÃTAú‹µ|«Žs3ÿ*CäªÍµŠ¼ T\{°o¤‹IhdÓ2E¿g1¡©?¹O'ôeö§&!SýØAùºÌ½ÒîÚOˆmÚ˜7'ˆÄ5 û¬*]²‚å_ÊN¤h¤áÊ×XÖ·cŸ{(yR˜>yK Ï@ˆ÷E’y”Ê ¡X®&]QpIÂ]Ý-¨AÛD8³"þ†» ØëFç´¸NrÆõ2½™/æ„Êæcšÿâ«»4ãt8þ²’¿&oeÄ â« bèÿhR‹¿J. z‡uÍê½›{sÿG)KØ%ÜC«¯ŒMý-ZÉ@©ùó ­lïo?{ÃÎ4ÎPO°»›9î¡ÁC¹Võ‡)ÊŠÊqst m€€Ãíƒê€ùÅ<ýèÞ*?¶Z ~€"D’”>Âÿz/Z@öܑۀÂBAK‹­ð!„}÷G¶âð†æŒÇáõmÇáôûÇáõM€ Á«äHýßY`ð\Ôûì#]žzxƒõö˶‘ÊÊÒÞÆg‰·SV‘…¡È;rK zk”ïù™Ñ9n‹_­v/‡Íír ][¥M™p¨WFdn"·—«¤C«.4½¼HÃÎÇØ¤4Š´¶¨´èÒR¢ÊU¸>;´ó;÷¦‚„^0âDúíÀúb™…Û¦4ÈEŠÙu_k‘NÁƒïÞµ D¯‚›,ÐÆõ€-.ð–K,BUMˆH+É‹ºÏRjú\jFzG!ìC1¿aP1%£Wß7ú›íè÷>®Z/ßÃ%°>u~~î½5ð¸ÙpÖ#¨_3OŒÃÍIÑT›jý6d~t‰ÞèWñY°>F5ÐÎŽ¥Ã,뷗تl¦0÷±FBÙî·a“ FïÖ¥uõØ è4²œ‡?äê#ðî‚F€hòãiA.J¨ 0'õZK¤:‹ïáóõ¶P/±î$¥CßtÂÿA|›° LöéÝÐDmòìB0Y ê“~ššÄ)Ѷç:”úô½Ü$æ!«h(yvS5Eßì+tD–ÊVÖ{'ý‚A ø&*ˆæÎßb-ÎGƒãNh›®ßu¾Mö¯T ‘ÚüŸ%_Ö ²¾‰IÏ÷4{6˜Õ“asøÖUís3ŽÖII0jÇ ØžtkÄÄÿTr S~›{ÿÒ;Ø[¨2ùÛÜi}…¨¥äÞò)MoD dE%¶»r|`Ê’a9_*@ÿ<^%®)¦;S²³­Â¾”|1nÙ4‡5~ï²í«àNfñúJú7“Ðêåá-HK5l¯HâG2k†í…6Ha2Á 3.|f®æî)`¥§†+À¼µÃ9-dÜ`¾…¸ÊÄå2¨œ|`Å—€µ¹foÚAvZïSWÜÏ[Î;ˆ¯ž“Ë`z²¥Øˆ|`r¢Ã‡Ê>jÚRg‰j Öë ZsÜ9•‘ò!ƒåNsÛl;!íÀÛ“1Õ¬ˆ?Vü©QX-Ù7'.÷Í—²«2ÔMÂÖ/a¥žÆ×Ÿ!±açÑÁ@,ªr[¿bc ‹ …8hä æ•~¨Z…=õ>†„ÖÙÿ]ŠdrÉzQOóåÛ ºôÍÅ]øÔ^˜³£ôKÐn` ž ¯e žÂ_~  ©Oò»²ÎrÂÍ“G³&*!ÏÿX±ˆZ).xùɉ4åÖ~ÆÝåxÀ]ßÊ n#Bv$k·èÚH­±þ  +àe¡ @"4Ïö™üí°jÕq¿2&æy·öD:rýX(®¬¬’Œ£= º]Ç„¨ "V?¤‚rîσ¶A6«€ôEÙ&I€¶œ“èï`ËéÍ^’ÂydÏ»B× Û1ƒ‰ƒwóV³æÏ*˜,ÿtÖ…!ËdÆË ØÕûé¶~§3S×ú"$‚ã q9W„Yi hæ(hL6ú“Ì~¢©\sÄ„xadŠÝ “{Z± Id* à§2+˜™È*kYR Æ;Þu*å[Iùø-c c¼*]f±Hs? õŸ„HjO÷™O¹ $L›K¨–†xkâ¯\ìÜÙë Eà,#€á¡±Ÿöb2#M?ÕˆÂcwUBžx °Wa_ujbÓ‚£±¼ÚÀHly)ŠŠQ¢“²ì‚2µZ.=jL æqEú'ÿPæ'©á*ÜŸI²¡/Ü—9¶õï>¦h«œýÊÙš:ëXfgû¬Ìøg+Ìv 0[ÒŠ;†ßP Ææ¦:hñ»Œ°¡ŒcvMþev ¥Íµo>UÞ0c|…@]\\g –=D¡vó6|æA‘”ó•×/ô‡±c6¶`t,糘±öÌ&ñU„„ÚIRYK AÉèöóõ:gaˆñeqÞƒ=ðë5P½ ÝVý=}ë<í~”zZ p"ºHëÄ]G–™AKtÕËÛ'u9¶aXØ«¢<®»ŒêÁc{¹¾öN­bêc‚9C«:qËþ“e*#Ìéù|çŸî‡ðó¶&†¦Ù~VᎶHéáXãétã†ï£³ ¶4¾ihcRåü]¬+ùàØãi)f@e#\ëqï#ÞWü|û·¶½ÓARÕ—Öwß­%!xRêÖ~ccTd¯ƒ-ßiG äB4=^—¬[¹Hð'Ó‚°hR• DûU9Úv1k¹S‡põ^΂Nf|î)o¾C¦Ø9ßywÖáh¸Â—ñʼÍb¿0!yM õ,‘û½…&ÿq*Ì·]D1¾éF…s\¥VÖ_ðXâÚ±æÅuÕ~ªð‘DH …€sæ2ȶ" Ͳ)IØì¦f•ˆ°/1²è¬°iß*j:&JD¥0±µtZ¼L¢Á/%â<†ÙÉæM‰ìžËŠ÷§Vé­ ŽÓ§ %£ªeì,ßZö÷ÃoY®”è€Óûbd›A(|Â1—{­ù öx•X¨ñª …9{a‡ßYmUŸ ´ˆ¶lK‹´î6ŒLš­ê°§õ¨ÇsÒg¿[Ñf¨椲;•š˜±C£´v¦X"¢@·lò®tg¡((ÔH+0Œdó­blÅÓè£g¥Ÿ«û´Qcô“tJ l7+¯¿3Üø?Š\`ÏÎ2'Yi[ÅÅÏBŽržÞÐüç‰}(¿O»I/à ”iKDPäùC‹ äBw§ó4SöÐçL(¶ƒGUJ¯}wÍ B¨¨OëS=sN"/Í%G¹_žù_Mûð/òŠÿ5]Ì=øç¿#bóÆß˜F56I“ÇWrŒùéÙÿH“Øõ6¥ïÌ~<mcÕ­.ÿ5ÌüM åmÔÍJòŒ´]uA·¿z0¤D;7üèŽÛÉeCÔá„t¦ ¦UÄ2ÇêL÷‚ 0F>‘9Q ;Tþç5ýIçbf²‘߇Ü]“º™ Àv;/Öïòƒþj6Ë&ŒæÂß*#)'9_Øõ;ef¢iù¦…±–ÆuÖ±ŽîHú7ðY’'1¥?O”gÿ…ƒ±ˆ3{üZ¥Œozå_íôñ†Ií¬¨öÚwœNħ]Çþ‹r0þÅéƒçMaÔ—£Í§Ê9Éêùd];ú¡q“¹fIJÀªtp¼øÈ™#S @Y²,º%<@(sg8§@É2mcä2ɲìÉÆL³Y€†ª*Ž ²/9”y˵ÙEcÏ«ªª˜ê“¦ægÊ98zEZ©šPµã4¼Ù… qÙFã¾è:tÄÃgàPâìÈ?—¥etÙ•Ý3‰ %šÿJ ýS‘¥É]t@Ä»ª6‰#¢f AJ@œW@!ÿ`P÷ ȯªV¬*9ϳIÆÝ¿0PÝÊC-Ã×YB›ƒØHÿa2"FD´]$Ø(êVœ~ìþ÷¸ î n~sÕ²C5(Ò?Ï6}(:–ç*ýE1c^…¾h¨RÍGBEh¯™.f:¬ ÞxOA|‡ûÿ§ê"B±ÿ"ŸÔ?ÿÙgaC ¸ö±—u{h9qb™É´ÿ€²–ÌiV?éšC BÖ_cyñöÖªò¥”¤9t‚±š‘¸\?˜W”1±Et3P‰ÀÔ‘8ñG-MˆЉQÅú‡Ü†”tÒFÇäį‰º›Æéà»Aû87É´\ÆûHs¸Ó” u£æj4­jˆÃ™t‡©ê€øî^¦Ÿ”#…Z$*§WÓÉvyt>ž¾ÇŽÆødÖ¡‚]@T@£îA*ò«°.ö›&÷PG°z¿š^fJYJt^A¶ÐxC±Tƒ¡› ”¥¾Obwcx SM(!llçžN‰èWäq­Š/%b,eXšÅVÓƽ9Ìýكʻè0…4Ýö*E„ï—ù?Ï8S.FÐìÔcBcÄT! ?Þ?ãcçä´Äu,üÑü+W²ÏÚë:ú²»Š…{ÔBnb)•›¬AD{ZµÙa]Ü­.1©æX ÉP+dáÈ“L¼çÀ‚qxé4Õqêê\¾„¨ÛÒE~¢p×bû£Š st&¡ÿyIï2F`®>€ê³‡ ëÔØ9öʆ‹¸éñöqUÂe=ÍÃãÞ—‘â0±¹|µ›¿šþtÍ ¾+TÊñÜÉýÆ ÜæD¬L5·^?ž¦+ãÂÉWnÑeƒNÐö4nöý8^xÑŸQ PÆ<îßûñD7F… Ü݇S!¬(Öft›Ÿ‡xi~^1:Á.§zJÍk Ù©öleðþÆ0Öåu æ$>¾í·!ɯª‹ÌÜî#x†T€&Ç>©\…:QMãÚå±Ñ³(B ØBUxûEæpÚß­í©&eTN>oj3“W$žèeÖø?C­:àÀ@ˆ±ºÐ÷ú{xø¼"ªŒJ õ]a<‚Ù-­¨ÁO‹©­Ĺ3Ù`3 ?gšlš*þ šö£xu7ò_ý>)Dt1ëv]pÓÆß,!?3ªÚÜøRR^A $¡HÐ>o§¡¥1Ž¢Ÿ•ù#ä!%niÍqQÙiÒ×cP3PÏÁU¿o¨b“MŠ~?ò íW2Çchá`+Ü/Œçªoïh Gщ?ÆR‹jîmbÔ<Æ„sªA´¶õ±…zV[3ÀTcÈ1‘Á¦8©ƒÎë–² ÷‹Ÿ ëza.l#ò¯èŽCi}5/z0õU)Õ_¼'vÖJ|~ä|a¦½j“Kw6ml£y^¼Ú;¬(| ÀwŠx¤5çDÐâþÆw-X#ÿþü„Yð–Hþ“ˆˆ€o8gLÇS î_•1X$y´Å+‚E¦Ÿ|ãeó¢mlLN.~¿Ëì%?Û;èú]†î~˜Γú?î²…?lé{xÅy)[̽‚"öÕËIy¹øttq´²Æ‰@x˜*QôT ©| ¬f¢ lÓmˆOˆÊßCÉ£6^°múÐ[[*™Oyª¬uÍt?Ÿÿ+¨D&=Q;ŠUóc”+{ç(ç7Àe‹®(à3ÿ p«t£«Øs‹¼ZÆ« E§?µ:ÆM¼iõ+i\ÍÈãF\PúÚ‰}—¤Ía.Ü>•¶B¿«c„x¾>§……do•.{cz§­ÆÊñ¼¦·–®¤ïãm':cÂxb%}Ñœ ÁhÑ€¿MšØ¸c½˜á)¾‰F÷9ÊÐb‘ÁFŽ(r“d9Õâãò Ü8£·n-˜ÄÞÝ䟥 jð *Eÿu ÑiÕ c’Xûȃfp,¯ÎòÎÙ±B–M´¢Õ€¬hì¯A.¹ »c«ÃqŠ`lV™ý 2¿Ý]X½dÓ¾µl0ÇÏÙÖ´†Ñx6þ·kŠóp$– ²ëS a0(IIÉ×z‘HòÛýïþ{ ¯j1«æ†÷³pÚÍ’{ ’~p¡¿R–·`-Òø®Ú¬«Õ‚J >ÅT†çûõ?³é\0bêVÂÓ¡3EàúLKî‹õ8ó Ž?Z¦?³°4x¼¥UKX ò¨MÕSøYÂÖ§“üRèySAŽ·%݆tॄ¤øF²Nôí,>€˜ÈØÉ/SL¤G:–©N%lhŸxø¥¡•ÿwr{BG6öRÔ/BlHCód¦õ,›´T˜¬sw/º4¿û´8Ê0SViØŒæ¦ú)†¼ç!kW1ï§­vÚÇÍc‰,¶òrO6"NÞ—TE¹Ã¸×4¤lzO–¸Kå ŒC ÄX-”óé?ãD“¢h u}%w°‘aÀ²á;=U/z›)ÖÉ©’0-ÃKu’ê:É® Ø‚ˆôK $ªÙ€Ö\†ß[èìÔ&þuHE4³’7›<¿Twû’Ì©À¡ëò« ÅcÄmõä9û÷i™Þa4Ö¶Ðï¥òÑ0Î$½Ð5õ’-ÚnÅK7¹g‘·™9+ôàT”fgÔ$;€}#w:öÄæëï÷]£†à"žå\Pd­u½Fª¸ö¿‡Œ¾bÉqH¤÷-2ßžM°šÃ÷ÕŒ[Õ8£gk¾Ž!Ë^HC\µ¹ ´¾î´ó`Ûî‘f¯ VfM« êÝJ²² W,èÚ+ËíÆQÃT"0µ)å¿/ú­ži’XˆÀzø“°‚Çðßå•ð¢˜VÁWâuðI9 àŠ0õ)1>Sè…Ð…[FìV…‡F¶§åöÝeÚ–Þ7ÔÂÏŸK¯Ë¨c`Õ­P§IZ7ž…ÌÞËERîÿYj4‰oç(›'XDïþ“OÓ&:YÑgðö1ò#S?1˸4ó-uhn!<|åËtò8'´#²ÁQÒq3+_ hbóÌb½{Öoœ0xÇëË-'ÕJÞÏÃ"×MïŽ#@é¦ù^jmÏŒ·»u™U¯;”½ŒC°q-퉢ðÍW™ÑmI§"dDØy=ôÿc±g°á ý*ùO¾u Í!Ob3¼'‡abÓ]%û’^Ï»ªž¸'xRC¿vG$3]'±SáñÚÆ. ¸eÑõwOrmÜlTëñs,±$`Èç˜w |%t {¦Ë€)Ë|+ gbQÛÍ(IŒ{Ìg²G‘‚ÙË!vmV³–cÔ¬¼>f(Ðîšœ ³سÑë±4¥¯Ã0Ö(ø½b}w/4š QñÃv’®–ó6 UÉöƒ IyÌ2ø¥LÒ¥ vÚL’hw® M°-›Ò{–P Lˆ2MoKÚàëW!íëà-uÔ‰Y{Fj›,½‰úÝJ2­æ¥Ü­#A7’]_Ÿ˜Ôª‘úö‡ÝH4]¢ã0±¥÷WžÔË¿ÙÞJà æÝÔ­A?m …Pj;%5ªc€e R•¿!Ò*¹ú^—ÒØ „£¡òµ ³úó_Ñ; ‡×0)u]…“ïÌ[¸T–TÂaN–'ÀÈ —/8¤­VBß“_çÊ5Ó§ä'ÄÚ5®5êG²LÀçV÷žgÇù’Õ3ƒZøD®³F Ê®„ä71¤ž²…žÉžñžsi¯Ç•žŒ¬ø ¯^¤@&TaE‹(÷÷רÇ3)-Gn¹ÀXLÀ¹ýkÚL'Sm„Ìœøã¶)"“ú ÷dYüùbX-ž2gÑZçÃy?"K•S-±K$¶B‡àûáÞ‡¹ Œyîž»Ìý[wHGiÌé+™7úkÔ+#’{ /bEÀÊ ‡¯4†ö1j´úãÓ·Žê­¡Û¿",&K2^FCå·ˆI¢Š(á-æÅ¶¾à…;@òÕç•ëîå«s††UCãLšÝTq?¼ë”ÉÓ¿Á¹ý x¯À/|´>ƒ5al¡+h§¢RŸëBÛ¾¯šŽ$FW×½±jójûÄ$Ä9‰YÕˆSèÏÊ \CJoèÎZËš\ë³–ù4s±>Hü,™#uå²çð‡LrfI`:}¯Ž|”…[-ŸrÈ@Û|Ý]G=4mäZ|@§ØøÍŽ-\ÒÝwÐ<¹ð¸=Z¯ŒÚ˜m­¨b¸'*ÑUaD¬™¿›ÉC˜K7‚ܿޣ•ÁäôÑ|2Ãr·ÄäÈ^wõã¾ßè•j£Ú_a¿Ç4ù^Ìä ½#f3Žm>—E›ÅÀ·‘/£4ÅLaçnÛI¸µ©Û'fqæ6ðïXªí”¼QuPæ‚ ‰Õ­§Hj›³#&&ßláŸÓê;ŠiPß§ùçxŽš«T—ÕjâÌmj…áÎʽù ‡>¬†æI{>tU—î‹Ë‘yUÁ‘ Ãmœê«ÃÒíÏ[©«!â–Ï»±i ËІ9"éŠj·•ëïº o!{Ôvþ\SW'‰î ̤ï‘4öƒÞé™w÷c<±¨0wGkøà”M+–ÕUâ4,{ßë{ŸLJ6=Ì*!Cwü6úk–®æ®Z{J¼rø«e·|\Áå‚À6L9>:ÚžëP2Ð,ؘإ4}»FÞD¹ßlT ©"ÚXI°“¬\*!wbVÉÑøÏ·—¿‡ž½ò ,ñ31wT9íB}áuC(°¤¥+ÝH_ ¤mšpø¶1¬bSíÇ—#:@¸d±þ-©É6CДöçHƒ‡R9–‹Ü‡kÕ…@þ…aƒÆYõ¼½²€CŽíý´œÕ.ú›/¸ƒ±hÁß:tÄÇè0÷ôhó¥{ë‡ýŸ×/ôÜ–;— ß&èê„x8£¶xjâ&ÐÚ·®rÇ+YöxI?Ù´†ÜpB†‘`gýruß)€Sé 1kõ'Ý<Ær ñ%˜ˆúx@ 8“—õ)¨`übí°³£+”Öµ`lâ,Ù†“ÜÚ²ÒÇ.íoë;’½“÷þ6ÿ[²¹w¬}$ðV F¤ÖvE–0‘•JÂ2+ÚuBYÑ& „­¥ÜKãç°ûpPøkÖLüÅcb•ª ´½!©2!“¾@P¯»¤rA7aÒhz­°(_ÍTò‘ÌqAÌØ¬ð²d hÊ+[›.ê<@„™~0¢Ó³X[á·$À…x4ËÜ*›ÕxB^z-P™QR“b{Ž`7I­Û¨¹,;’Ëd¶wÎÅþ« Þ†mDGì­×°Lš”¼3U­)ü„°/o …nÆèSj€g¤Çd:¼W©ÜO‚Ù¦à]EXCÒ:²â5RšŠ©Ríôgˆ˜Õ“U !7ÙXÜæ;Pi‰íXQXr:âáP×–_‰©•ep7˜šöàæ‚æ¶þ¬ 2…»q ÿ.á¶§)Zcäxø‹mƒ–žÒˆTú¨h TCwÏ#ˆÆTñb2…4v³ò-hìßýß8%’Ó…€sÎ~Æ‚. ±e<•“3ñ™ƒGJ´ góä 䟞W/m£ݚ ÌSšK€€Çà7´ÞÎ4È+ÿtu¬|žž¦ˆ¾µ"ýãÉ3¤yHÕ¦›ä 'Ãü?ÿKòÁûÏÈîI  sŸý« @0Ž4änö¬î0íNSë  ÂBIýA³UFïW-¥HëðúJÿOèï¿£Zü=òòû}ðo·ßø{Ìßo¶&ÕïGû}ç?oºŸíö‚ —øÄÖíÃÞ×Y)ÚQ FaßúqÌdÂHœ=;Ú„ä™z6ŒòC[Æ—’# (uÖ¦x@]’!(dÍMDa]ÒFczÙ9ÞP½|»ERPobȳFæïx=In:¤2Ù%M°`"¯q—¡ü¹@KîѪ p)…åùÄûcÕ–™Sï.oüÃÑm¡¦ýê)–¶#ž£–¡c¡G»*i °/·M%n)SP°U„,mÅ7GÌtœ¡v$Q'åfäå[ê…gÃóD3 ›‹ø5`œ»5 žà¨Õ›:Â\³ÜrâŒÖç馀†«ÀTƒ–#>O¸Äˆ·°i=LƱ\þ¹"‹âÕ“»ÌÍ/x"ƒy¥ªÕ¥¯¼y³m\>9ŸqÀ6ù¥¬iÿ4ÙI7ŽA¥•Õ÷ë:4fSr½k‡E6Žkzky´zÉÜ„¨ޱ;ÏLŸ…‘E+-_ÌÞnÚÑŽW ÓxÛ ÛWá4tˆF¾ÕdÚ"`Jʼ¦,¥­™àÍøb§@ò-éÎJXx{{ÖZ¢màÑ UÞ¸¤Ù!\ê.ü²êî<®ùô¾…€ßƒðT® ØOŒTÛ. "IìŸõ‘wZ»LZÁÓÖ ¿0±"\U§UN¬;aJÞ†u>° 8_,¬»8Íqâåž§É–“®MpÁPPµ?ܘÁæ¢W‘μ41¢Œ¼¬üïäÂÔ¨hP~$¨Åôi(Э²;Ú§åZå ©²ÖîïЂ{’|$þ¸É§ÂšO¢_²Î(?‘NÉ…FV¦=æy>¶n–´MêÝŽñ-}ñ*yÜp’6´B¼[¼«=žµμbÕ2ÃÿGÜ- ÌmýÃ?µÐ¦! "+Íífåq;¡}ÙYàBPuŸÂÏ´M¹—+*ôò‚ñ!Ã.rZI:v•fèÇ®q è ½8'ÎÇÃ, ??›ÝFü‡ÅÜPËÕÏ{‘W`àzüÓéò3pÏ.då²€:Hï×ì>¯#n(Þ…‚iÙHƒÂÑ}ÛÂÿTrÒØéSs1®ÚB‹çë‰À¹øÁ ”`¯Ø{4å„mÅò©cXòáCÔ'¤ƒ(`=«4Ä{wJþPÄnµ¥vóÿ5¾“"Ê<ÒÉ+ݸ&iA@óIqÔ ò^È {‚S‹òÑ<ƹ¤¶Â Ò_Cê4)zd¢qüš²œžËŽ…%ûZ$Éšѵ†¥]EÈ¢¯ Èø縔ŽÁÇ+|³ÒÎDõÒz‘×±´îòÒëD”ßÜ_f«)¡ž¢ê.XÀ¹ï ï<ç¾³cûUÝ‹a½LE<~âLr †0›)¯‹¥õ\‚U¿ëñ\CáÌkn½)GD3Ú:[ =ÑvŠãÅнm¨½»œT4’”ÙéK}’ŠÌŠæêO­€x¤a_ìú°…ÉÃøôzÌf]äa Ë*<)W˜Bõ)Ƹ-·¤5EUÆüÅ *¯``x³gÛÄžb†cÁ’Æ-µ4¥÷ñ®§LÕƒ·pI] á…uëBDuµû—è–”ïݤ$ËH—ëU"ˆ\ìŸvV®Ù¿Ú£öló[ãV>¦ê8%<ì¹'¨tæ}(Ÿr¡`ÐF‡P”៧¿²J÷6ŽR·þ\W- ý8<ý©ÖËЖ£l6ýe4¡K8/¹íb¹ãç§d|êÜzØ$83K3{¡½4ÐÛ ^öõc1³—$zí6©_‘‚ŽZye[b¶GŒŽFv«ž½ÇºZ'[1KaŸ$»€Ltæ5ß(iø¼ToóC‡—µ)r“ ÂC«zq#Ï4© «2Ø~¿Ù›0y“µ:¸Ì€Z…É|Oè‚7Ü7áº]8tÊZü¯ ª½š²u.ä$cºŽ P`ÂÔ6â^ÊÃ˻¢ËP…¡xÏ @+€ˆÖ1só`~ ìºÅÁx{@4Ìù|G(>@¶jú¢Î[%¢º­‰É³Kk|©Ï ò÷Ødã@`ŸnSOPz›x ¬7 Øjú!äíú¾Mµ@F'òÈu3ª„ßÀ… ›t8§‡N¨ì†ÆC4Öég¿Ã”yêv ||fÈiê§=ܹ/úPÓkâi f†Š¸cÂ¥w8Þ!ȼpH—ŸÝg\-µb´@þtê8êã…Šâ¶ó×&ï9vYøŒM«`5ÉÞY®z ؼùMJ•© tIæå׉?e…XœSkíÊŸÀ=gŽŠ ïn+çè2Â$….“rLÐÛ~6M)¬û­ñKú4´@¥‚ú,š®®Í$¹É31‚mÑîÃoêÜÿUÒTÈ€J†ù·BwÈ{•Ý>!:!ecªÄvâï>m¿€öŸ¸ aKó×ôtfì7RGÃÛÞc:Boº ”Ø@Mæðj¶¹ïé¥ ™ûj…R>[w̦‚*‹k ë»` úÞÎZ}§O£†.su¾}@/Æ#¤¸àŸ/(÷ž‡oàKQ`y½øÅæp¤Ë%Õ:B6mý^)Ð-•ùq„ãR¢ÉM§ŠAMš;Õ½ÔK'ê!ôÃ^¢u[S„óM—<~|dß³vßb4)¤K_à·áJ3áþç~ Î]Žï9³46Fxÿ|L _/`¹†Ï!^d~[ßLfIó'ãaþù'­t.gQ¸™õr­>fȤî‚(d”6Qü[ñÏ—iÿ9R‚ç‰Ô˜H.Øý@ÜÕ60åeH­¾Ç„-ô—«rq¦&‰‡j–liMR;ËIA›þÂ7 Þø»Uq©4ˆ]q»ë/ wv{"«¯|fý3¾D¥ €9©©uù¡h(Ë÷ ÄûéËšüÎLwXœïœóoülU0jêÅa€Œqõõ9’Ì{A¶s25:ÈkVrÐÕ:trÆ0ÒÃÏ÷° Kîv/ž].¾ é¡S +ê?4´‹’öeëÞ«I×ÎËc²Š’yôµú—Æ<­~œ2‹x{÷‘#Ô»w‹ÂuAµËc×ó¾:0ö¶¹ð´ðÍÎ^ÒÌ­wÀ+Â!}>ЛçÆîžwžfWdc°ä5W&°õ8McZÌíd²6Aðsö`m¾«\™-¥ØÃ ÛÛ¬z` ÉÌ’çž:XJÀ%ö¶T~ý­xÅÿ¡<1_@Hµ\õ5™äË`ù òt´JÉ’øF½•.ëÉM3÷™Vm:Ó`UÚۙо‚#XþšLü%ê"håï'0å>ÚxÝ*‚OSy¹[M¦I–íA…7N+Õ a t7<ÿ[…o¸w%Hÿ ÊöEÁWCèŽÅ¦çãbï'<~3öË<^®ç,økù"ýwM° X•O ˜õLê"&²OÂ/GÝlEný–¸ìÀà<ÈsrºÎ´I¾sµO»VÎ`çÞ¡wTvk¥ïÍ'$Ùþ±ðk"!È!'}pµƒ¼ =DùKêxùë+uÅìÔÔ qiïÌÀ± ìBÅÈ¡©8Ÿ„h‘ÿ‚0˜!· „³Ò¹ˆbŸœ¸ðf0 §_åÝLÐġ룉f¿Tš%Ì K„:²yÝ_†æÓå¦[1\2Ùê…yeAdÕ¤ëµ0÷°Ú¾"°‡ŸY‘®Ñ¦ëóW ïP«<„Áó;ø–Hœ$T:Hý,m©°‚ÒÚr†;y[\þt]¼ŠÎ™Ö-ÒG<‰› ý•ÆUIî—}‡µ!›(Þ>0¯Ñfs€˜Gµ_BM¶T¤›å=E¹'þ™?ß” ÅÌðPq>ºÍvéåe‡n°éñÏzjòg:ž{\0|*à2©)f},›áond.“/¼’)c v}šÅ±¸¢‹Œ–;ÎaoXz(l<ðí)V·2‹‘€ù¥j9 †­UZ8©õAœ‰Xùš„‘Ä©ÜYmþYžšlG{\ÕSñ¼å}_ÛMÿëž¶û/“ú6ì,•ª[ø–¶±õÞuÛ½†VÀÑ(EÚ˜_W——¡r_‰M”p>Qšõ@k߸X, –Ö3~O½9ïñ˜ \ Ž­ÛXû2°¾êè*­ü-g§‹é%Ÿ‡a´Q‘G‡Ã—G/d;p2r ÒÒÎÍ'¼¡'»®]gnNbGÍžÎf#Þ}¢ÌaHṖL)}moF)ûUGÄ6ŠÔo—íœAŠÒé0yÎ4µTqôh 5]oÇquåK®n ÎvÞ¸$]ªZ¯/ýáÚW]r¦\1z`¦.hbX(*Sv±Þ‚ÇL`µçáÍ!Tsš¶áLÕëf:0½¡þî è‘nIaIA¢Ž2¿ jV^þ–%MWÂ ì …56d-ëë8´™ÊzÔú}(CÚB _r;®r•Éšl”Ï,èÒûn§¡ÓœFp–¡¦ÃÏ‹ªÓŒ‰ñ÷©¦.¿ÎÂøY¬‘ÿIcéY°õ÷_6bå{°@*¸oî1{L³ôèÏÒ{M“ªÏŸ$pî‘”±¨OÑÚ“_ë²ßM([=…Ä1ö$7,„™×d£·×ŒkL+3Úý˜ð-…Ù4Ì÷Ÿ”ïj¸Bª:ÏAùMÉehoÞ{+ŒŠDèá]zåSž¯RºX„ÔP‚²HQdRà;®°Á§}_ß çùRã‘ßjB½ÊÍw á¯ø1\¨Þ#‚ÁÓfÔ'-3´C¾¨­ßíØÝõ<žw5]|öZ­mI€‡Üðfï|ÑSj¯‘ý7Ç)®#SÕ ÚåpŒ&#i6¦{ª.Å ÷ž–ªÝ]cûf½ã6'Zž÷bÿ}´Ï‹3üä€-W¼lâÑj˜S~ødÂŽqqӸ僒¨·L1Àô|ìá ú|tdñRdçJ"YfB}õÑâ¬y` _Xͪ' Ÿœˆ-&v>6ÕÛ;úø±©ÍwnxçºZÏ’]åýã ºÁz=¶'TFQ,ÓØ ^ "9í´4k̓ ¦„â>md¾Kðsáð*ˆ¥.¾@q+²+{ƒužìSH(”3òwƒ¼tZNUÝV3¹.ª!ãÉBAju|íTE‹ðßm[™«Ò>bGÐp3µ‡&2ºò4AûN.'»?ħJ0Ç_Ž_¡·„oY÷=­ÍÕŠÙâÛï.÷Ÿ¡\:h¬­¸ë¢CÓ R Á}¿lŽe²¾ýE@cóKÕ¤©(ò"tçà%1s!¡àøÑv»-AäÇßn#@ì7H²qF@ŒÝÅv鈳:Ô¯3å{ãxª{·®æÞŸB„×–œâs½vG«vW`Ò9š’´¼p“UÉΞ?_9÷¥âx!Ù2Dç¶îb„ýŽ8½™tKêÌ[¼ppàÀùµFK·»âsò žÜÍfñŠŽEÓÔ2Õs;%ÓkÝùW›&»y3Új2-Ù#ª#C¹_X/…î>¥ÄИ4Jci…ðiçË4»üý¹ð=­wzè´³ Ÿ•\«ñUÕP“ø½R*”7;^»½ßü?û¥ãz%ÿ/‡–MU Ç0î‘­f `/BÁEÙ1@rqÄ~œaÛ*™`NÙŽîç0¶þBZ3)®k0»híSk$‚݃u;eÎ'³îªÆ»Ã}2]1“ºS:ŠY<ìý oJf‚õÏn-1XAs¨ZÀsafK‚St³äANËzžpÐb>ŸÅ;°gª!G¶*è}ØHVÖóÏA~' —îͦ²ør ­G Îí×"„úÙÑoÓqêI(A0µ®q{*3ÃrãnÖÚ[f=*{¦M#>{9JÔqœŽ³­+ðúMKzGwˆIÃ8¡•–;ex»«­¦R.H7Ø÷bö›Eàu}Ð-j²·Õ‡©¯à(DoAýÓ‡«Òˆ'Ã4ü'Šã×dë ¾ËňbžDPºÊõ³™R«õÑ)BQg¶¢­vC¥ìÕ 3[¢ûÆá~—‚PB6Ö?iûD¢çÑCÛÅ>Ñ_Cù¥ÃÁñš?«“(%Š»²ƒz¼¦?’áÙˆ ‡$>t­jç‡BŠ%° äæÑ±™¡ “ÿƒBí„SÔØËKˆŠá0{× qÊJЋØ]ªY‚dîÁ훉¦°“£Ò™äs…ÈçR`jˆ'äß-&¶)…ã=ÏQŸ™EWØÔ{ónÄœãžæx:ý¿fЧ…Kk—&5åéöÉ /C'r^ø´çóót ZŽæÝ¨,À9¸dÙ¥éüeMâ¡#ß$2œY¼« {Ç«Vû„‡t¶ª0Eâu~;ÜàåJÆ£û@¶æï™?¨<öŒ¬æ0j%{ÊÞsËÍ~ÊÜæ,漆맖–í÷: H’u–º¡L)œ¤[‚õ3ÈfNÎ÷¾Õ®Ð‚Vö’/³UIV8s<‰²Ä±‘á†ù #x}~úhÌ*Ϩh'ï¼Ðì¤êȯ i"™믲1L{^öŠñª$Ij…ÉæVqTz²ò`)p‘â(§-ˉ™ BËÙb« Æb;éñÀ¦k’I~SgG³1†fÈA£UnƒÊ•~o ¸3Wäg_ðòSk|¢¡!B0a¥º¯}s«èŦ4a#nÏ6— Ha…Ý5J¤ ¶EHÏøc‘µƒh 쌹Ôbð¶oêd+‘?Òrõ°/÷RHÀ7'`mA«}òŒB³}ÎE(;ãÃpkEšÅŠùn§Àkd¶õäY«*G7ã ÷ኅÃ6%™YMÍ£a]•+©šáÀ­ùcL\hçÓØ³¸D¤¦8iâRÍÔÓ̾¦HÉ»£Pèad¬T¦=q×,®ÜvW1ù¿±?÷BPùö{ ò7¾ƒ'G‚]Ùá"Ú µÃq'w¯zÁa­'iBqö¿3ÇÎJ½‹Pøxzzî ‡±ïϲá²ÈÆií²‘6ú!<5š’4º6XÉyÈÿlÖâ½xJÔÿ Ê A ?úE´É’’W`¨…¥ñxe*ÝHòi›éª¹¾2¢ßdÒÛ'ÌÁH­TÚD¾€Q0!l<3s}Éûl7Äz”„ý<”xFCþ¤ÁúË MaŠWÑŸð¨›;{›´tú$Š= Ž,˜·îãb)#Û*­ˆY/²ÈÓUpcº¯|œk‡>Ü‘,ŠáËnÑä­’_M¼Ñ×£t"¹¤sÖA)Í #ÆB‰ ²9Ã-*b‰#AðûN¨Íì)(:‘ ”>œO¹ºY…g2òãh¦Ÿ1ïÿ(; Ø^{ø6 Èñ6»ì8Œß™Ä#ÀU¸â+¹¶$ þÁÑýú)Çð§·’Î ÃZ7ÝP±a‰)©gû­¾êÆÕ äŽUØ>§x°·ú¦Äº=«üêtvšn¯Qj|\Ф.%‡c#ù÷ßøIVÚ ãät¨÷¦zÜK z"A©@Õ¯Ï*?óŽn-x‚>ޱa4gž£O&Òù/퀸x®—ï~Â#š…¯¾ê$Gþ/n4­P‚ˈB°û;A|»9ÏW¹§ì!áìjEuƒu4xžùÖ¼ÑTä%º>«Ú0zßvóOèXìW˜Ü—ÓÇž`s¢OÅK=¦àÔ£JßÝPóbDIÝw_Mú >¶nÀ<¢Ž¤äÙFéHeXOmâw‹ƒ¯4Ðð/"Êh[v©1D_–^TF☱ÁË¥¡Kö´Íä>Õn6UÆ®¡hl–¹ži+rFs+ìߦ„£—¸ÞvƒRØŒa,D˜Ÿ8Eã ‘ÞÄw;ƒV΋…3ÖKüëÉ$tiã‡-¦ô@ûˆÇŽ9'Gò¢âAÀ‘œI¼ÙEl…G0<Þf„x0{Z0sX̉Â&„5NoH®\ùÎk9Xû™Oá;²ž±Íî° ÈÉ‹r°ÜÆÆµ.Ïc³%ŸìèÎêî®”Iv]% “ö3Óµ) "/.aöÑUÂA\ޕܳá&n[“êm×94òͦ}TEº© ™÷Ac2;HX²ã w¦AºæJ‘b"pÙõ·wlš`KSa->ã†x j&4è“„éT¼¶uönØ îb =¡'¿#qÊVïCV ­r¿×Ëø°`¢ƒ5—®H4óLþ¤¨qäö3ó×Ó… T<mcEÓ›¼¿ŸÜLQÒúQ~‰» H6Ù¶Ÿbb5ª{^Ó¹‡[Fý^ ÄæQn%!bH‚ üoÂÀñ O§Š&X§Âü\ó®d¼iÉJdQ3 „sÛ½i ŽSŸÝ®}m¿WáKR¶Š…´YCäeeÄhD°6XäBRåÂÝÙSˆu½15UXQ'±—U bKóŽŒ cÁ¾÷uƾ$Ê5€‹¹…å‘& ‚lå!2]õ™N¾¢J1ïÒGÕäâ.~:0ŠßÌ¡þ‚´Îw"?P+€Âf}á•HwP ²±ÓXU+ñ}îܹÅzðe¨Ù9RiCö®}X#î3Tª,0þ·í9v=^ (w+x 1à ‹ò~×оÓË…­Ü HÏ“&6Ãß;â9¤çÎÄIºŽTÊ6Éé8ðqƒD"<ö €Bä´zÎÙé;t² ¸ð„!ð}„eoí·NÝoÆëSqì==™‡ÃJËɘ3Jµ—!içfVl¥ù¶càÙyÕšš‡#Ä|OfÕ‰º±ÿ 0A%ªJ|}yˉÓüxO•þ[¦Ü‘Žš÷ˆjÉA«åï"€z|j Ýv9V½^ŒÎÛtƱ½•³š,›†Ø3©Ëø…Ú±ÚK*!Ë#ðK¬©i|ߨØ%ê€ó×ΫiZ!B{$àý† í0nsb>6Õ",Ú½Ñu»‡š G•f, 3§O­×3Ý,Qsæð]cyX,±|lXµ·Ìì'ð@ÕÌâ®oë䜔”×k. FŸð¡ÿ5¯eЫwö²œÂýÎ9š–”JÎioუ/r/눱÷£à‡Û³/X‘rÙ£TP‚7wÚüRt‰ŒÓ³˜êÞÅ/¨'Â$¬<ž‹)<¾5’òîÏ:Õ–/—m‹Z8öÆ"ÌÀ0fâRòd û€Ÿø«òJnX Zò&™;®ÕRxht¶–î8ÜH ó*Ð7ŒE)nÖWL:±m¯Âüû¼©%úÞ<šïSO*,V­ï<íX R*î=×ö£Òí£â9QÍA\盈ã5Û‘ÙE |Û;‹)n0á_{cKš …œÈñž"½JHoVS¾ÔR `{[ÃJq—|˜P¡U1UO†€j³"•ÇËqÝJÓnuyÁðd“Bç‡7®†`4ž' fÞ<¼Ÿà™[)«JÖ€ØR×ë*k”´¿bi:¯<„CÚîRXb2DYÖÄò©§ûŽUà›ªîKË©‰Yš TbÆ-òÈ£~'ö¿”=Ózí òFXä¬XùÔCòÝÂçG—@3~hX!›ƒï¹d˜'pdr°."52ó%i´—b¨?†{Õ¼Á Šä’’"à±uëî×$/ X=·%·åZú'÷´=··P dxoHÿ[SÞwoÃÚ#À~s½ÞnrÆ3ÐçsµT&Õn¢¦üd5Ít|‹ç$ Õ©–´ic~;Èmö(c¢€`¾ÐËwšrš¥èïÇŠPx[w3›¯…$‡Qx;V04m*™áË©Œ¡žn áÂ#>Ã_‚á'+”·0ò '* L/‰lýà6Y˜L@}? N•XLm-Ô·L½gSô¬Ô[Ì629ØŒDKÍL&±ç(y¬<;QØ‘D(D:¥ÇSýª"xÐn~qÆL~Ô¼HÑ"ºÉ m:œ„Õ¨ÎgK£uîg6ù½i~[.y*¿MÊš‚æ 1Ëe¹Æ,¸#Ï݈ƒÌo¤Iàê¥ ™?\‹gfq¤ì´ÉY#M €äyt?-\Fq¤©Q‰”ØUât•_¸Le¬X… ,(5 VëŒ ™í‰·¾ÝA!íÚrX)Aý°.òü´J ñ{w°²û-9F8Föä¦=îÁI“ç?Þæmé7Ãj@kbçDÃØdm¤“¤7EÌú(Ø töú±*ì$ÿ.] «% ;×CÒv(låu‰öÀ“ôm©Ë“¾¬ÇŒ_¹Ö¸ãçÿî©ïÇBcQbè±BÖÓ`œ%÷ùOC…ŠàCpGŸ€Ýà²l{Öbö½ºçC]ÞÌ>‚IŠWRÑ07½‹Òbw¬æïÉG솂©qà’€c{øÔ 3hEÙ×ó3a¼n¬¢Zp HÓùLumå„CfÜÃß@M¿¥,~/~)¾- í]mäÔ;Õµžã `˜@ºÚµÐâûëD3‘{F1/q»$Äí YøÏWŠ}éHJm§Ì~)óÎgÆ…Dü:…Mö¯Å4¿ùì2;x—cç%\©¡êx{L·H÷g“ ,<ïäý±²Œð–Ë…°6š»Vs…¬L?ÕHrì%Räq\.·güëéù”Ì^’/M[þ ì¶’ÚVÌ‹qaÈÜ\1\`7ùî¤xvÌÅ0šELÓC—¨xªÃ7’càJ%­  J…@€Es߸áßh«¹7Ú›ñi'æS²Žqæ±ù–•HÃ'ecÜoƒemñlø³”µÎ}uB¶EÓhíþ»Ô2”m¼I߄Н’·hDâ\ÞÆ[BZhà/bˆs[ ‡†GZÇýéËêpg„ûe–_CPÜOâ#4èẑ˜\;ˆ UZiÚ¯ü„kµ­¢Ñ]Ì~]ëø-(˜'$S9Çr Tý-„g[¶RýÒñàõ•íUY„²“È‹—©YoÌD'—ˆhôȰ™˜”bUËâéŽ%ƒ$íE£òw‘­'Ù¼¥pS嘿M¦U¤=¾òê4ÿtÜ0Ïmjž1fL_!ƒH’*„–•´Èûú"jf˜è©È¹q{’ÞSÙ%wªömbèu`Ž÷©ìÈÂî÷{PÅ4UÁ:¤êÅÍæB˜;§€ÏE)WŸ-ˆqæÝýU ÚÌDµwwž–‹,=ºå¶+O+¨Ê§R#Ò¾›ðSƒñà±w ÷K»*-AnŒs~ nk.^S=çºoßQz¨C¹G®Ýs.åGy°b§ j¿ø7×wºo³9´Y:f”™õúÌY6^y>¦ÍçVGÁ’_(¸£Š+ÔJUX“¼çæMàßýH<ì ²‰.”9¹^4û2:ëª4ð¸\ÛÛ1«Ë’±4íU =G²q›Ý„e§Ý>Ð ¾Óôv\¯žSDoùgnFpmùïYŽðÁ¦AOž 8utR¤ÆyŠ*‡XÊnãG±Ž(S¬'ôÿ/ÀžÍø‘SPi'ƒ Æ|ÿ8SvUè´+Öä=÷/zØj•·Ê|‚l”L—¡Íò×Ì:ãŽçŽWOûâ8ÜKLž—«ü"¯Š“,Ž0EÛ°B‹®Ë¤èNDó}£V€ Ak÷nùùIè£ h=ßsÙ.¡´‰–žùA¢åÏcL3%ÃRÝÓ@I: V3ˆ¢ghÚÉ®ðv<"I^ÄɰÊ{ÿ ó¢Àp¤ó-±ð¨å 4/$¦{” ª5..…(5µ †µªß¿Òü/Ü¥9&ß’#±Q(HÌóò ‘Uºé+› Ó¹Ll0´qA`'òTÎþ©Kf…âaö̉©ò ¶]*ZÊ Áay)¹nG+hÂ8‚|ý=ªºW)âp `†øtßækë çyý°ãMý:­]Er†Êf|>§µZÄM+ XZ©ªi~çÒZ©Á¿ýÌ}¢ùôá6µôÍmBXÈ‘#Z)­[¯Çƒ¥Gø¸èïCt¯‡ÿzGÌðõÆó5x­ˆmŸá-—†ërtSEÊú àò wµÐE#·_¿ ¿ÚIöÕl:m)§ ,htßÛÇAl1³,ƽ؈¬®•$¥]XJÃÞŠK)­Mñc±EMc~E·¢uk¾ž?ç»Mm™¹c*ggøå/5ˆ”¦>¾DèÏ– °Ú¤ø-[õù_—†wäölV&;³8-¦ÜªÐÛ<êÂS¡}-—Ï[fÈÙXÏópüQÉ ‚øH*÷,5™>0oÙÃï‰ZîPdž WЯ>:[C€¿UðP‘¶“èÌ$Q¹Š*Þß\ߢR¥Ža¦¸2>ŠÑó±Åv YêPäé§”0ât£ÕØhi1«KEg·š\ÐwáN3«ÊýΕ½üñfïшùí5† ©J›&Öâ–@«!Ù½sÙîøŒ.W 6Û¢­?‹÷,`›T–4™ †u¨P4Aëç^Ž¢â*ÅàDÂ6®hÑ&'žä³n6Sö¢ülÔ9”¤¨õ¡ ¤3œ5RÓ9Hl½ àî¦t’mï'x_‰|Bf plBE! IäIgÀäö/c¥R.Îzt½HN‰[àì㯵r‡š:k mÆŸ+F•Íp3¤fè§½ëò(ÜÖ_ÖóÆqv§ìRð¥§ÇkO÷Éåo'¥SR¿l¹G~gÊ;¯ìíAÉfºÀ‘J¿zÄíºþ¸Ì» ÇÓuE² ࿨Έ«^Iv¦ë]¡¾sì­F£QÁîÿ?Cë4¾ÔT OŒd÷þµ! ŸLh2H(©žÔ¾ ²é¹³…¬Û®;Þ`?ÊÛSj¢Waz}`ªU4.ìŽ1?YÏ&˜LÆ ÁÂ7Z³š4\È蘥ù®,ƒË*Žœ«¨L`”:^õ ‘ù`B$ɧü«pý•æÒÞFQ­õGlº˜4¼¿Qº_ë§Â7A¸¶ú÷ƒ<ŽËMûëYŒbך>Ck¹ëdÚJÐj{¬!{à d©|¨n¦oÆïRyû7uù—ìX“Ï]°bbÃÓ…-ÚœDë ;Šì_ ñšfÚ>Deñ«,FØ‘•¬Ãˆ`´ A‰°ÙÐòÑ›GÚÉ=ÅY"}ckû‘c˜Ž%[þa×rÄà®ÎçYîïí˸øëuóClîÈy |§ác9–·4ôk¡<{B‰zì²ßFŸãý¬¢±bá4b>N£¼/\–¬Aíîe@²½.LŽõØ>¼eSÙUw§[ë';ÜÀd>«‹?|¨t‰Þ ˆT»0Ò†)úxåZ7j5ž·{Çéa’ÝY_|„0«'kzVßEö©YúœÁYTk”Ò§te]Õú=*7 è–Bþ~ÜÊ´ÜÝÿ’y+˜ùuãáìp)ßnÅ™üï¯yÜ\ºÍºYšW±.ízKd¦ž‹Ø,žq;öAŸLe.Î߉Ç-¦š!|›$ è¨?Žû›2­ÑwI[‰››JëæNÎñ.Î"Kn0<4¡ÓŸ44 ŒÊ &K¨i˜"-~ÿ.¨x~á{ˆ Ð4ƒ8Øù ºíÖ+‡”+¦ÄúÁ“¡Ok%¬½Åx¼Ë’¬(,Á`f´o }˜f ¡¾íªzÄ¢¤ã^ iäú.ƒ‡£3vÆvù…ï/P„äPgӞȚk°$ÿ)½W(ϧ…k㯃ú7ˆº=7¦À†à©wßpY-­xæ±…àÁ`3ÔŒ—¨TÐÀÑ_M í]š^ëk£Dã{©0eÎÏñ@뫎_aZìEùµºÍ*¤6q½'™K’\ÀJܳc”j'#Çɤi_7m@©JxÀµ±íØœøQ¨ÎPŠgð²R¸€^ó¨ÏEàªÔÙ´ÎÍñq,4¾Ý›û²!DDªbuO"ȜᆂïŸôñ¿ Ããçú(ýebÊûŽ ÙW‡3i9¿)´sL„žàU6ܪÈ4ágÇŸ Ö Ì@Ï·Zôd¢d]à‹³g¦œjHߨ£U8«"½_ÿhÿ@ g'—F€fh¶º±þ-ÿ=K/ùiøQh_ŽÏFælŸWв v÷ôII¦¸ÂBR›Û>ÂŒSYF'hnƒ²ÙÍÃ"Ë.`¯Éc‰»:ÿ ƒ¸ÌÿWÐe+Ô ×ª Õ"\ÇQÜÔnÃËqæà­}—c@ôÒ69ÃßÍYÂGsƒ®îX+Lö’.χãÝ}â{è³ç‡1¨†ð+b8kùßgrvålõ¤Eá3Òé{ ¨½»d÷óE µ1nöR/°Â~â?ðMCUÄhþz_ êßbq&V׳‹ŒÒÂ~éƒ/á=UÛB/çÂD4Q"w[Þñ?r’2ÙiÄŒ2+ëAêSÏÃ!”£×¨>â"±¿H4Ñ^ôî;uÙ©·MÐS·ŽVzEõW¨}Û:Ê%ñ¡­q7O—‰Óª!¡¶P “mÙà¨TØhx~e¯w2ï ÜÚ‡eI\“Oy¡ôí3Àl³Ž+Ê–Û,xÅìd™È›Âÿ~÷¥Êªñô»†,R ˜pñ6_¿) ƺ"£ªžlÍÑÉ6à­Ö@JÃ?æ¶Ò"Ø÷÷¥V8 AD¿±kÔDþÂé÷•§‚ÚbáM“ϳ”;¼US²ü(¿Øi@kèþÀl\Œzsñ]r}L¸ãTd ëù˜F>ä¡å|û³²2ŽóëèóFÝÜS•*<£éH˜6„‘^Œò0¶­Ya¼,=×aØ EWA%›þñ`a¸éQwRÁÜ­îN?Â}ãþ?¢õÀ\ÐN9º¡â/ë˜ÂÈS®|­<Ëû*m0C•‡=îþm¨›ÃV ûªËÖ»Vý0D¼‹CÈ@4åa#3Nc®Érv‹ù»ÞÙ9@Üš>D¶@_I¾šÆ¹˜uѬ®«.GcüâØé—vžx‰âýƒ­®‹=-ÿ25áâ RŸÂݾ¨.ž§¹y"6º ûÿûô¬|ö¯ñg‡õåL•ú³¢¯ ‡Þ…ö춤…ðÝ$?&WÞÅÄú}o…TÄGóÏBðL—.º1jùßç»òuÛ\GD3åN„è!Ô cCL}J) ò‚ ‚ÚbeNc mÔ+ŽÂ9B[|(ö㾯*g©çH‰°§ØŒA ´mÑy4+]Ïâ½/¿ÒáÝs÷BÇò‚6|Šíl–àîáë‘¶rç1ò ›o®ÇRjäÇ.…–!CÀîæmÔ$÷ˆN¶¶YAØ¡–.ô\?±‚²¾H6ØÆHd¦gæO ñ0S §Œ.3éÇ?¢{†‡ îB•jÏ.K}3` Và®=¸/·Å;sÓ@üÜÛ75eC|Zߪ71>Aî‘dqCcÝ©aáNvÉ»W.÷ÇŠ„¡i«u[R\CV±Ÿ;ü= ^²å[ 0EÝ?ÐX¸Q7b·vQ(´Šèç³¢Õ6#«êt“Ü­ØBMSñ±€Êë= ”Ëœ&`¾"¾#J£_H4`ù[cÓŸ³Äa@·ù×KÛg,¹œ##šÝ{2ðƒè”mqc¹X®?#† hù€þکФH38™ I:?<éGÎõ½ÅÃìáَƘ©Ä# »—\¨1ÜÁ@P¸Â­"Ò£}Þ‘·¾Ó³ÍÃ*}R^HF¦U{Þ½ãø^Ž®#“-¿k´/b3ž¸øÆð=4|{RžÒJÂجÀߊê^™[y÷ B/óåï·×C @®ƒ®Ò¦Ó±O4 ôeh­d¨È¸¢räqj½B2 ™ JÌcƒsêJ1 2ü`°ÖY¤­B&|6Zz¯h(m_·Ãq¥y±é´\ñ8ðóÆõ†ã¿ σ!<(€áè]w)7mñä¾dü”ñ4=ìhƒ£Ûpßú¸Õ¦ÃÂ)àGDÝzÙwy"ýhi1ë*‰‘Ö‡1X϶ €nG—Ѿ,Ç|ñ™bGcÖn¹sfy>_O/„™õ`b¯º®>Ôn&ö×Èl·ÙšNk±SÓŽ]ÊöîX¨˜U¤ìˆÓòQµ?ðtó’ÓÉ™Ç:ûŠ2x!÷¼ 1,f㹈n¥}œ2$b=o4“ðСÄûÏ0S¥“Y®È׈!'Ûa¨l |föøcúCNo††gÎ_eœ5ÎD7Hž\Gm•Byx¥]ž×£¶m_  ÷¥Òèl¢#è[w6½ÊŽ“;š¯Ž.q$‘utEÊèÿU>]ØN§z4£Å¯Úg "ÇŒoD+¢¾3a »Cà³Fð\»±•Z¬ )·+­•z•¾ªï3ÂGÏ•’ÍzËe—›'´ÝÜûm@iV Ÿ§þßÜøÚ.c×unÈut“Ã8©l1gÿK±©¬ƒâ79DÈì´yý‹Ís׿¶±dVÖïx8Ý9\˜Bus¿ü„¥ ãxWD(*VàÖ©Ðû2¸0…³Â¯'Yw6Dº“iX8‹u2zdüªÏ‡~Í¥‡›&;øP@*Ž`jQÁàï÷óʑѢòS….ck©»ùµæ}±.çѾ؋,Z[‰OôÔviÏ5t¯¥¦ú,úRüÔ2s“'ÂÆ /GãŽ;¦IGBËé`"vªÊ,›AÙüõé Ó#'¡È‹Pá5Ü]|¾ÝZßúÒ=Ÿfísö@³À|À†…º‚˜è]ÞákU­øPãdÜJëâ~Áäv!`N¼”¿(·G,@hø tˆ‚!æé±[[ìuǤ祀c*?=Q*8÷ÓaôÜ\¹ÁM³f.á.`ÏQK›AÛÖ•#kiD€ÆáÕ·-a4çö[5iU¶¦í'¢ÊÈy¥û²~ ŽLM·Ð&‡ŒBð«7·É~&+¡[hOY·Ä.ßhÞé^Îîtá|nçl«|çô ã`ÞO/t“jè°d'ž3L,·ìo£0.®RUΟeŠHþ£¾»?¿¯DzË®ºµ KL•\ÃØ­ ¥X _*/·[U9ëHfÃgEJ‡ý¿C4È7wÂàeõ,yÃ1BݵW_GDÎÔdx/j4 ë2ò6-›±µF¨B÷K©»œåÌÉHåŽC(²$†ÝKÁ·FµÁ·¢¢xgUò–Eš{‹…B¨‰yJ}’&íW ú¤•/nŸIJ“¨Lò_ÉpêLYíˆ4shÄ2ŠüY¯›G†9yHwÖî=‡mz]&Ä"Š7´®çfî·#L;q¾#¹™ntpmÔ¥† ί "îSñåLÍ<ë¼æÏ½Á´+¨²mSR.¿‚¥Pø¡˜Î^—çŽ&Z»ÿrm†szŒ> ÏEÝ@M(Ÿ4ÙË ÕU‘2—„s\Ûuú)]¢S¤ïG‡È¯ ?&¡èÒqã?‡2!xЯ;ñjª„Î+]RCѬÞ%ZªØ’gã-Õr¡Â3ìmúZÕÑ@©p¶<ÃvŠÍŒuÒð °?Ôw(3Ø2Eaœ5ÍÑÀ}Fž'bqâ"+F‘ÕI›¼‰<¬K^?‡ó-€È{ê»ÂBŠÕ½:ÅÑæÔšÅAdläŒïtÎÜ¥\Àâ$ƒR.”¼€¬XûFËÐÙj~m3»^Áj™þ~_ÍÜë&äïkAyÝnššR5/cQÙ¸ÝߦpNÍЪÍëô^‘ýLU¸ãÓlŸì™3µŒÃÖùÔw:,Öп~mýër„±¬Lé˜õh=6UcÎÁ­žª¡ï§Ë®¤ATÞ`LaOË UjOÒ òÊC¬²[Ÿ `²M!rØæõ"ò—Užnß €PLoµù¢9!D·d슛\]Ò…àúr÷2ʾ&’ΙarwÖ“c»õRÈ^“ÓªÚÓŠ»›eþ_•­¢Ä£Aö„Ú ¢L~:Ù+Ѫ Þ€;8CîkÖÕÛôÿÉl[…‹ºBS2';Q7 Óõ`ÍOá"R©koø]~JâºÃq,í;÷€û~ZÄà<üMʾðeH¾÷%¬ä«Fj ¬I=c‡ Ç”nËÁ$e|r7ésÕnw÷ãÓǰöŽkO3YdxªA­ÿoÚšR, !š3w·o¨!2sú[Vø ­h¡Œß: ‰‘Ř'ÙÄl/4’ø_]ê¹îÉ—¦0¡]D³iT4³jÎ!vËWo¬ùŒö¯Þîá9Ö¿ ø}«Z‡†=Ç!F±`Þ¹¹sZ¤é¯ø†!oàÙÃ2„T’Þ¼šó'ÌŒ]¨þc¼#íH•ÝmH~„CÙ£¨1U¯½1,ÿ·"¡¹%ðË}H3Žd¦Ú»ãÌf Ý\!68ÀµGPPèµów éJ1ˆƒ[þåvòóœÑKÐ xÄå­B{Å?J;ÀÚ‰Œäô“¨-ëSDB¥¡é-±ØL%bX§z¥§4gºûP½Æ±—¸Æ¢í>œ2(£±Ýæ+'@‚à13G¸Y]¤~~¤ pÌÁˆñ|r¶%^)°“7Þ\àÊau ú”À[ÏÈvQbkב{Fm“H’eÄŸ<Úר¾æá™¶+›7ì¯d@pÇX‡ +§bh&„Ò‹VøD É oùñZº­@Ô*…rNôàbåøâÃ.£*w,FuËÖ_n‹JÏ7ŽJ>?Fþ:è= ñ–Ú9Ž™Þ€{#€<`¾‹X®”BR©««Ì Ç«Z?榅T¥ŸfcÎÑk‘íÓ rþrN¬¶%5´ÄIÈÏè02V\l)÷Zµ“¸Ó¾b¤ûß(–šÆEÙ´üHÛàj*´è³ŽrÖˆôm‘Uæßµˆÿ%ý|j7Õ*5Òþ~ùfXýHZ5!©dð ŠÎW ˆ¡J(Ï»öÂ!ˆ½Ä²Ýmíà°†ÓÉ\‰ãêáûå"˜’4ðé¢é;”7õvÊ&ê+Æ2„œ¶BhŸ=iÔ¾>¾œ2W:W&Ñ÷o:–µ0çž ĨʧDN•!30‘~=t។uDCÿ€ 3;_è¨wUEŠLo‡ÌÅPü)wFU1&GZÿx¦ŒÚW9ŸA¤{µÛñ½1~ƉîLhs•òW‹*‚ÅvÊ¢_“Ãèæã¡˜P=G¥Ç!ÉÌB=B“T~Ì`Ô™3¥‚ôOÑÀKô.¢ZÇ×~6Ø[l«ÃNQåyò%‰‰l QºÈQzÍŸeúÓþÿbûZsî5×qºÒ‰‚14of‰NéÒ5¾ri¤ÓŒ?b{ÀQh)lDÀd»¨?ägP€Ð¦$ý…š,%©€×b’‚QÊßÞÆ¥-N¯N÷—÷^<æ&lbe­--F”$½›£“P\C6?.ID¤ƒåèRòë¬wªe› &߃ê:ŽJF©Ox¦Æðd™ò ™ÛEÒìAnßÓQ<šdZ óßë´Ð>’GÆEzÒÑQKX"ÈÕ?Ñe ê5µé>ůɮÛ`ü×¾©ò¥|ê2‹h "3 šRÇnœžíô ësjâî¯#ÄäÆÛçW›+Ñ}Í„ô ­ùIoØ™)bß6$(ZÎ?^Á’gôU2"ðÎ?é?”§­Ñùâ¹Æ§¤s`Òñ•Ô'é©UÎáA_e½<°Ð«Ús÷pw.{çjèá-A’J»f™’t¤RfŸ:Cù_Nãgú÷ÊÐc,÷®z0âjLrY'¡^à ÈÉpsĘ©l4aÝÈñV4Æ·»VŸöe!õ~ÎO[Àg4{Ã0VM—ÓBó›#Ô¿ê^¤Öx˜uÊ«e¿@B+v™Ùát"­‰†Rñ±l-£?¯Á™Hì ™P£I=ÐÞr õŽŠÒÿ ¹›¶•ÙëȰçFÞàgmßîOÆæø˜€¼ÊºÃÉ™—ZP‹¤ö+ª¼á¿ÓUô£W¤WrB@Ë­!§‡(·sfð¹‡ÇÀQ³u9ØN;—6¶~+¨´“9ì dYCÊ¡¥k)*÷ Ž¥±TB½Ý-µt&oKF(³Êîe—ñç W0V'tþ'KÈ]Ý)!Òm ‹3•µ…»™ì_†BŠ-s0±©ê`OµÿbC·JÙ\éõoçç­­œæ– ±>Ö‰‚¾¬¶Õ6@ $C%«Pç©„^‡%¾Cσ딧rf~ éC§0rë²=z¨qo²s$ nýøð¨+<úº•Äر!ÎÓd¥b¸ï…Þ Ëg› lGÿ ÷ Ã`´TÀxµ÷‡þ#„’1##_ݳªç8yspq)ùÃ0¾¤V$ï¦gi#E¯öÛõ|õ)‰¡xxZµO$c­ËÝ=i¦w^kÚ´ÈÌf" ©ÏüÄÛWøábY£.£@³Ý‰[hC•–BE[!±2 )ŒœÒõ™- –3Ò»ÍB(ánLì}ýÀ=϶ ›!Ák ÝF;ýþê…X¹ ¿“5$mœýù¥ÔòÙ˃Y+ТíUG®°9ìgèêgª\ˆºŽ–³ròtbUˆKÒ¢ä³ÎÑ¡°¦¤¿ˆRÕ¶ êKûøßƒá¶án'õMݬd×)/U¾ÈÌ !&4:÷ãÑrÐØ&†Vêq®…òŽÉ¡!w—ì‰Á™²3X60jŸ•z}Ï ecðóàèJlÒo»ÔÙd˜'!5¶¥  GqGƒÓmˆâ‚u(¤*߯—™ã$P_e»:GÜq_àÂâ]ñ¬dQÐ}Éqò š¨t×¹t8ãFíx ¼fˆHK‡ð\ÆÞvD‘ŸFá’`aç;®±R'|Ëù:€vï0דôÜŠRFÉNNˆÚµŠé2åºÑ3MA\ ÷ÌôîÄ \…C_HÈWÒY„êßðNRÈ©dñXcWOP, ûj—8=k4Ù´ðÑ töSe¨woâ¬1 :ÐE(½Œ9K›I4 Ñ6ùÄsšyü,¯R10w]Ü|Oe­‡{°$ŽvÖ§ŽŸµ¥˜³Ù¤l]x†O3ø„ðœS¸øÇÑæFieÇ»–1¾´f~z¯ÔïÔøl$äƒ& Üð´ðè·:±ÝžÌÆ<GzX˜¾sL°Ü÷]ZÞO…õ—]3³jÖÌÈ‹[dŒ:„•“´Ê»vD²~áñÁT ®a"jÚl–†¾¡pŒjs9˜¼m¤ü ÷VŒ5é¯ÄW¼sö¹~¯ Í9’‹5ú] ið GÏEO—J}±nxohzGô¯¹.úƒã,öÇ÷½/öÿ9«'^æôò¸a&Ꟶ[ð€kþu;^Ð'†ÿ3#öÃ2Phñÿ@ z]¨à Æ\No™*õ=µÚ)W~æ÷LqK—æX0–Fn|¸ú x £ôÓ!ëfW»jh&nwŠˆDå«{ÚvùD y`¯äoÀ ôX|gÎùÁŸ‡§}-ê½SúFÞ ¹¿GIELr£eâÓ›Y æ·X[]—:E&ÒÒn_<Õ°Ë”ÌxÉÒòÌÅ¥ÎH´*ŠR îM“—-)Q)]è²eãTq>A>ÕËöíˆcnEAB¶÷÷Hø“ÑXæ";}û:¤^§#ß½úcö Øæâ_o*'êÙvzÐV ShÔi¬í8 ‹ü[ÑÊd?Z  sxžC¸, ü:oÜ{ý°9¨&xŠ®°{pÛìRT*•aÝŸ#7½£r«oXt g[EÐ ¼dP¶z6Ý$?ÉÕñFjúl‡ç’‚4Cšœ­x~Ó ÇŒæP#Cm~½Ü Ùê[ÔU$2¡`[PŧX4ÐyCr-ûûÈ¿^¾õå½ÅÖ`/C:ÅÈ0üHC|nm†-ÑÁRbg‰.îVŒHm<ì«>Ò÷œ°ÿv=æñ2Ä[èš¶(,ÿZ«¿ñÿ'}«¹†ñÛoÕÀ8X ¹ØÁ8¿HÑ\¼Äu(ª=™B’?d`¬.Å[¨Yoª™ÜrVÇ@íFj ì·ÒsÔüM†:ŠÉõß… [£yu3î$1[9ß–U…æI*¤z+˜M› -¥aöú0[²å±d]ºýihæJ~ôsÌKš¨‰RVÿJ޶kœ|6À°A4¥l Í}ä:ÒõG“*8! <ûñ$¯Á¸cH‰Î¼ çq°:šU«ã¯ë·ÅÃH¬ì©È‘匞<Þ/rùLÙkVm)œ”DZ3K×ˉÑÏô2¹x,´êæïçZ‰7”Ò?`ëTPçÉ ¶Ö»|B#Ó´×¥¹BVŽ+ìz E†›n ÑÇ_=¥2ó Ï$‹}_\^Áž>Ÿà§Wü50†ÖÿN¡;>=GˆŒ‚.$x¸ê.bcß—‡Šù½ñøDõ¢ €òc#”áwfÁ‘¬M£æyÛÔ Äú!ÏÖÀa‡˜'†‰I'<y&'þ’pAwEŒèMsH_¹Daƒm<ûŠR™—âÒP^l1VÄV4 Ï0ÆaµgÊUŽ–öí¶“dÖFæ!TlÈAÖ€¶Ücζµß½RÉÊi:æý·3’Jþ¼ÁQš]§—ïÖ9|¹82»)Áù™:ÛóL×Bx‹<£øé^þû–úzÄãG|Wíg¼Ü> (â±ÍNebM !²|Êõ1SÝá7GÝ£ÚÓm†•(ó!D23n10Ÿ1&\e8_WÍ:œ¨é¢Ê¨/!)£êâÇ^ÔÖki9C§Bf‡™ÐµQDåf}<á¾üÛÛ.–Ó_Ýy¡@8Ù†ü×Òj?0­>Ñi;%—„Ÿ2î¼IòýÄ„6“Hb\ìlñ榙¡J,ž‘XÁJ¨h¥…6jR/“âýYçVãsŠ–Ÿû•+ër®U'àÕ­Ø&Ͱ½ÈûŸúšÍ]…0"Þ PftxIÓwUÌÌ] 'ˆÂ·&2#¦ÍmÖ [èʇ–W`“jäÆc›î'ËÝg>h!ë1$5ÉËš*KDYÿa:r‰(IÈMPše#†âå}×°Ö¾Òm±:óFä¶g @{‰aŒª#Ú’?š a·€z•"uéî[ýfºBKóÊr¸-wÝs>ôh Y èÒ8YK  õH‹/&¦‰Iœv# 4gAXeTM~Û¸÷>05pùêÑ}5zèØœá¹â°ÏæÝís 2äëvÛÞîèVÈb§öY|—µj†íÁäuV—a|£K¸…˜;Û-­P-_„¤›,ö`á!wÈk}d¶ßÆÖ?,‘a>\†;–M±xþ†·_†™€Ç‹jÔ®íGçë/>3œȯU^o[ .3×Qù¼®êÜᘠ’³rìFÆÈD DÜò•ZÓ&èµ›‰¿åÖÌT¾ÎöØEçý¤¶l¨'§,Ïx Å(&\Z;rrgvMXw\Ù‰9÷² 4 Tt‡úµÇ×k¾ø¨™|Yà¼E3œ_6Ûï'B êûÂ3$qN”ßa¼ípôzQʆ¼ºÕ¤ºÈ¡·)ªcH%hK­©ð}ØvGRÒ)î+«Ù`lB'lRžõÐäkVü*OIhê’UâÿIfOõ&±=Í‹äî¼Ø—F¢‚aÚ…h3ó;:¡ð¤Ó¨•‡ø°wè‹2*föÚÝ.Á*UýýÕ~3h/jО²+æÑ‰Áw^nôÆ,#Ò‰×p‹3%sù<´Iþô p|eÞƒH©h"Ï܇ÁÏÄ qK}d±à:át 3¬uËF'íòÊ‹ÍbPØà°ÿ@5?Ü”i̶ ¾èbø™Ÿ$Ó½fs¦PèÿF|´Q—´Cë¦Sïiãê¹!gÕ{0Ù~‰’buØî¬6¦;f|ÊvYhÔ‚5Iüƒ~®8?©ýõb„D%~¸¨ž%ð“'*=Œ-N KBàÞŽµ©@‰ÿAkPB[w ]ö¬Æ€c½<ñ^C,5Œ%tÊC#Ф<óÔØÝ2ì!«" ·*ìK‚µ[Oüf/ ÑÎÕRæ±)Ç’¸@ù¶Â%Sh°½ißÕJÂú)‰Œ°X=äõ /›{vëF)îæÎù¡`ÆûoÍšê“l‹ E'ì×P2‚O<Æ“½ÿ §Â>DØ™Pýñ(û`íÀQõ½ s‚c«Ö>§ Ú½Rh!E†ë¹`©¼å"ÌÕë¿gx†Â¯:å/MÚT°#,Äuœ‹S!©€Ö§1ᙪçx†ÈÌKpÝfWn P]m¡t÷ε=b¢³»“·Î¿f[[ù,DbªkZû{&Qć_5¯ƒ ´Û ÓáxXcaOF¾ÖQbü׃ÉKÖª.`±iQÏ' P>F:¬WŽ?”~É Ï±æåà9öT‘Õ ˆ±w».‡]LËEmñ¸îM¥9"Üö£6 sHHë|# GxÏ—ß Ý@RP#…¹„„¿_Ác‡:f‰‚MÇòÝÜ7<œÁÀª˜¶ÇÀZV¹£—¼Å-[3Q9MK kB{âZˆñ¥±Q’’NÇ õEÒ&T!]Ë\DܔЫ®5~jdc;4ià3Ðz÷^žfà²ñßøóL_DØ6‹é}-˜éâàXôcÃI(&eúlÌH©éŽÂ­Ø6ðSs}Sº˜7eÑűQš4é úïûœ‡ð I“QûQf›øFQQöKœ_:Ž€mEëYiaòòͬ[€\Ÿ4ôFnV¾ÜÈËVŽkîV|/¸ÏÕ[êmò‘T“$¢éYaO>׿… òª=ª…d§è~«Ç —œaˆTàçÿ(©U0CÆõ£èÄŸë‘!J®nGÇã‘Â!ZKû¯³˜JÏËäU]~šñÓ©tø™ Ò´L›©–¨rL ôÞ?‡+n/ [ü%z4þ|&‘××3Ãp Œ™½âé3bJ‘‚+Ð<2‡Á¡¥‡À¿ ÜgÄŸÈŽÕù žë‚u~,ªÇhe` z\µoìó.qü¡O‰Š(<Ì«õ Cj.´œ,æ$Ü |”Ïä‘;q+SytÓb›†‹g°Àf8€4w»1Iôs×Ùðq †1#¸êÿ1“üâkøbϺ…ˆj¬×Õå/Z;ÚUéÔú4ï8n¬Òu › ºEñjò¢îñ<`÷¡£lÓéM˜@V‚}ôßË¿T”ÍžÍ!üåÛ‘[i0pqâÛ4¹Éã¨ÇØP¡Dv%.óßëà¶FXJŒ‘º#®â)lè#Â&ʃçt²?„¾p¦Ìiö‚t…àü³‚ '>Ëb«ê„Ü‹ñŠï°'Ê5Èö|•Ž5ÃbØ'l `µv†j²Œ*éiþ}¢¡ÈõvÑ1”hßc[˜ÅmQ´J÷iŒæNØ[q_#ÈÉÐ×ߤó1kgwóK*“Á;ÄÎ]wg‘z”‰ª-Ô+Óˆ€¸ cm+@y,ë2ä>–¶ÚŸºGøÇI·×2Í9;ˆhf>½øl_kMx-Dj„|h¶ïN*TÕU§ž]=IªŽuÒ¤/_àM•õÍúÏ” *gp ÊE_²e°è[Dìµ–xÌVž7|È Fâ—];Þ#ܧŸûoòu}W3d}õ ‹r´¸ÍÅ”²‡ˆÇ®ñ-&g -2Ò(Ñù~3¥rrg«b¶µ9ð sdº5Y^˜¶©&SÆž2E7Kú½X¶ÈU2»lÍiëˆPMI¤v.ŒWYfkAÉ?ÞÆm¬]ö\Ç–˜=‚)b›êÒ±Éô„œå òÁ®´AÇÁ1ùŽÖ¦·tÝÃI7˩˹[üÆfŸæ?ü]ªãèö]ÈPY2ÜÛóÝà÷?å1e¸žbîMªÌG‡ò—"Û/5ÊXn-wfÅ8~;i aFÐÿlÅÙ8Àly°ÞbC .QÛ@ϧ¡È]š„àê‘ÎIÞÆ׳¿­R ™ñ:ßw$‡ c°ø pb¸Gn×eèzx¹¾€¡5ùLéÞv©E¿0‰_[¤Iû…¾_4l]kf5;%AŸ›Øƒf BiNh+t>Ãqµ-27ÒG‰Ž»ë FFjÊ=¥¾)h%i(^AVE@©“ð¸"J¦y0qØ&ÅŸÓ4´Ù2ê¤صûä>ÒÛɘØ8äHaàx µp„ÂÅÃ\tá&HQZ“ˆÍÞóFä©â0ó¦­ÒšøˆaOï²íZ_’1Ï2Ðe‚Tª*ÉãÅ =ä>jÉÇd¯}<êÔÛy÷¹d Ü€¦·‚å?PX»0•ÓS­ÿykg37À?η RÙ«æ3z7 Åój]óèoáô:|Œ†Ÿc÷E¢´“¹_ߪЙKIi«s çµtö~K=R”« +ðöÅ?8ëxýÚ“ÍItº—é]õ¯°@ô€‚ô+ªh‰DV,"š¼ˆ=Iý& Ðn(KŸ=ª‚WÀ¨õ™QÖgéè£üýµ6Ìc7BgÓm­ž`d§»E{ߊ"ý†9§¹µ¤èË&±¬'²»H«rû¼Qèñœ&Ôm*âO˜À!örâ Gg3Îf²2$HÜ Š!ìv«E½ ÷8éž¾Å,Åðõ‹éÒÙJTq[ùhöøÛÙL‘\ÁZyh<8º%™Æ7ì5„‘®“  w±‚.u†ÎÕòõÀB“©ÁÑÛ™¶p]jÍï\x"JuUñ3w Î%d“ËšGPuËÇí‚y xòÛö›‚VŒ™í?ÖJ”Ï“ö“v]RµŸ‰²}.å­K6ØÛ½ÏV3$Úâ¶ Íç}3sQ¿Gulc¾Ñ|ƒú[üS~2›×qÇ´½·æ%í“Ál1·Ú³öw:YJñW@¿!+-g†c…šá¾ÈÐɳ)Š(ÝXTüôîOxøP<&ÁDÖoéÌú6Ž+ç Gmûoêªö„ÐãÜ fžñ‹Ü[“¦…÷­Uæ øã Ó”9B~" Ô°À—¢³ƒYaH¨2°uǾ½ › )¨õ ª$³±ýL qµ¹Ö^¤¸ê@õ†pp¤€€ëð þb·à#~Y}£—Ú7ü€–'Ô } ×Ú ü@È+ÿ÷KøKŒy¬é}Í(ÿBŸ)ØÐJDaÅûf6VŽæ<ÿgǼ³ÓëÑvcδD»­G?×àÿ} l!¨¿õVŒæ:-.oP QÄùÿp¹>Á°ÈûcöÄq[U:>¥QLçïøQRªHÿgü¾YH·qŒ.þ% LIøP*ªI ¸Ö«ê[ ”2JÿFþ(­\€´ùÆøP0×ø™&Ø8ÿÙicnV Bðmriconvert/Converter.cpp0000640000175000000620000001236212542632317014734 0ustar stevestaff/// Converter.cpp /** */ #include #include #include #include #include #include "StringConvert.h" #include "DicomFile.h" #include "SeriesHandler.h" #include "HandlerFactory.h" #include "OutputFactory.h" #include "Converter.h" #include "OutputterBase.h" using namespace jcs; /// /** */ template struct GetFirst : std::unary_function { typename T::first_type operator()(const T& t) const { return t.first; } }; /// /** */ static void DeleteHandler (std::pair mPair) { delete mPair.second; } /// /** */ Converter::Converter(int type) { mpOutputter = OutputFactory::CreateNewOutputter(type); } /// /** */ Converter::~Converter() { HandlerMap::iterator it = mHandlerMap.begin(); HandlerMap::iterator it_end = mHandlerMap.end(); for (;it != it_end; ++it) { delete it->second; } delete mpOutputter; } /// /** */ void Converter::SetOutput(int type) { delete mpOutputter; mpOutputter = OutputFactory::CreateNewOutputter(type); UpdateAllOutput(); } /// /** Adds a file to the list of files to be processed. \param path Path to file to add. \param match String to match within a file's SeriesDescription. \return 1. */ int Converter::AddFile(const wxString& path, const wxString& match) { Message fileMessage; wxString message; if (!mAddFile(path, match, message)) { fileMessage.push_back(path); fileMessage.push_back(_T("Not added")); fileMessage.push_back(message); } if (fileMessage.size() > 0) { messages.push_back(fileMessage); } return 1; } /// /** Adds a file to the set to be processed. Creates a handler for each series. \param path Path to file. \param match String to match within a file's SeriesDescription. \param message Holds messages about this process. \return True if file successfully added, false otherwise. */ bool Converter::mAddFile(const wxString& path, const wxString& match, wxString& message) { wxString name; wxString ext; wxFileName::SplitPath(path, NULL, &name, &ext); if (name == _T("DICOMDIR")) { message = _T("We don't convert DICOMDIR files."); return false; } // std::cout << "Converter::mAddFile, path: " << path << std::endl; DicomFile input(path); if (!input.IsOk()) { message = wxString(input.ErrorMessage(), wxConvLocal); return false; } if (!match.empty()) { std::string series_description; input.Find("SeriesDescription", series_description); if (series_description.find(match.mb_str(wxConvLocal)) == std::string::npos) { message = _T("Series description doesn't match "); message.append(match); return false; } } std::string series_uid; //input.Find("SeriesInstanceUid", series_uid); input.Find("SeriesInstanceUID", series_uid); // Fix problems with termination std::string temp(series_uid.c_str()); series_uid.clear(); series_uid = temp; mSeriesToUpdate.insert(series_uid); if (!mHandlerMap.count(series_uid)) { //mHandlerMap[series_uid] = HandlerFactory::CreateHandler(path.mb_str(wxConvLocal)); mHandlerMap[series_uid] = HandlerFactory::CreateHandler(path); } //if (!mHandlerMap[series_uid]->AddFile(path.mb_str(wxConvLocal))) { if (!mHandlerMap[series_uid]->AddFile(path)) { message = _T("File already in list."); return false; } return true; } /// /** */ void Converter::UpdateOutput() { std::set::iterator it = mSeriesToUpdate.begin(); std::set::iterator it_end = mSeriesToUpdate.end(); for (; it != it_end; ++it) { mpOutputter->UpdateOutputForSeries(mHandlerMap[*it]); } mSeriesToUpdate.clear(); } /// /** */ void Converter::UpdateAllOutput() { HandlerMap::iterator it = mHandlerMap.begin(); HandlerMap::iterator it_end = mHandlerMap.end(); for (; it != it_end; ++it) { mpOutputter->UpdateOutputForSeries(it->second); } } /// /** */ void Converter::UpdateOutput(const std::string& seriesUid) { mpOutputter->UpdateOutputForSeries(mHandlerMap[seriesUid]); } /// /** */ void Converter::RemoveSeries(const std::string& seriesUid) { delete mHandlerMap[seriesUid]; mHandlerMap.erase(seriesUid); mpOutputter->RemoveSeries(seriesUid); } /// /** */ const std::vector Converter::GetStringInfo(const std::string& s) const { return (*mHandlerMap.find(s)).second->GetStringInfo(); } /// /** Returns list of series names (SeriesUID) \return An immutable vector of strings. */ const std::vector Converter::GetSeriesList() { HandlerMap::iterator it = mHandlerMap.begin(); HandlerMap::iterator it_end = mHandlerMap.end(); std::vector v; for (; it != it_end; ++it) { v.push_back(it->first); } return v; } /// /** */ void Converter::ConvertAll() { mCancel = false; HandlerMap::iterator it = mHandlerMap.begin(); HandlerMap::iterator it_end = mHandlerMap.end(); for (; it != it_end; ++it) { if (mCancel) { break; } mpOutputter->ConvertSeries(it->second); } } mriconvert/OverrideDlg.cpp0000640000175000000620000000200312542632311015154 0ustar stevestaff/// OverrideDlg.cpp /** */ #include #include #include #include "OverrideDlg.h" using namespace jcs; OverrideDlg::OverrideDlg() : wxDialog(NULL, -1, wxString(_("Override defaults"))) { wxBoxSizer* dlgSizer = new wxBoxSizer(wxVERTICAL); dimCheck = new wxCheckBox(this, -1, _("Save this series as 4d")); dlgSizer->Add(dimCheck, 0, wxALL, 10); dlgSizer->Add(new wxStaticText(this, -1, _("Skip volumes for multivolume series:")), 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); skipSpin = new wxSpinCtrl(this); dlgSizer->Add(skipSpin, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxButton* okayButton = new wxButton(this, wxID_OK, _("Okay")); buttonSizer->Add(okayButton, 0, wxRIGHT, 10); buttonSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel"))); okayButton->SetDefault(); dlgSizer->Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 10); SetSizer(dlgSizer); dlgSizer->Fit(this); } mriconvert/SyngoMosaicHandler.cpp0000640000175000000620000003027512542632314016516 0ustar stevestaff/// SyngoMosaicHandler.cpp /** */ #include "SyngoMosaicHandler.h" using namespace jcs; /// /** */ SyngoMosaicHandler::SyngoMosaicHandler(const std::string& seriesUid) : SyngoHandler(seriesUid) { } /// /** */ SeriesHandler::VolListType SyngoMosaicHandler::ReadVolIds(DicomFile& file) { VolListType v = SyngoHandler::ReadVolIds(file); std::string description; file.Find("SeriesDescription", description); if ((description.find("EvaSeries") != std::string::npos) || (description.find("Superimposed Data") != std::string::npos)) { std::string str; int in; file.Find("InstanceNumber", in); int width = 4; str = itos(in, width); v.front().ids.push_back(str); } return v; } /// /** */ int SyngoMosaicHandler::GetRows() { std::string pe_direction; //Find("haseEncodingDirection", pe_direction); Find("InPlanePhaseEncodingDirection", pe_direction); double fov_rows; if (pe_direction == "ROW") { fov_rows = GetRoFov(); } else { fov_rows = GetPhaseFov(); } double pixel_size_y = GetVoxelSize()[1]; return static_cast(floor(fov_rows/pixel_size_y + 0.5)); } /// /** */ int SyngoMosaicHandler::GetColumns() { std::string pe_direction; //Find("PhaseEncodingDirection", pe_direction); Find("InPlanePhaseEncodingDirection", pe_direction); double fov_cols; if (pe_direction == "COL") { fov_cols = GetRoFov(); } else { fov_cols = GetPhaseFov(); } double pixel_size_x = GetVoxelSize()[0]; return static_cast(floor(fov_cols/pixel_size_x + 0.5)); } /// /** */ double SyngoMosaicHandler::GetPhaseFov() const { double phase_fov = 256; std::string protocol; int err = ReadCSASeriesHeader("MrProtocol", protocol); if (err == -1) { err = ReadCSASeriesHeader("MrPhoenixProtocol", protocol); } if (err > 0) { std::string::size_type pos = protocol.find("sSliceArray.asSlice[0].dPhaseFOV"); std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> phase_fov; } return phase_fov; } /// /** */ double SyngoMosaicHandler::GetRoFov() const { double ro_fov = 256; std::string protocol; int err = ReadCSASeriesHeader("MrProtocol", protocol); if (err == -1) { err = ReadCSASeriesHeader("MrPhoenixProtocol", protocol); } if (err > 0) { std::string::size_type pos = protocol.find("sSliceArray.asSlice[0].dReadoutFOV"); std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> ro_fov; } return ro_fov; } /// /** */ int SyngoMosaicHandler::GetNumberOfSlices() const { std::string slices; int n_slices = 1; int err = ReadCSAImageHeader("NumberOfImagesInMosaic", slices); if (err == 0) { wxLogError(_("Unable to find number of slices")); } else { if (err == -1) { wxLogError(_("Number of slices not provided")); } else { n_slices = stoi(slices); } } return n_slices; } /// /** */ std::vector SyngoMosaicHandler::GetStringInfo() { std::vector info = SyngoHandler::GetStringInfo(); info.push_back(std::string("Mosaic rows: ") + itos(GetRows())); info.push_back(std::string("Mosaic columns: ") + itos(GetColumns())); std::string a_order; switch (GetAcquisitionOrder()) { case ASCENDING : a_order = "Ascending"; break; case DESCENDING : a_order = "Descending"; break; case INTERLEAVED_ODD : a_order = "Interleaved Odd"; break; case INTERLEAVED_EVEN : a_order = "Interleaved Even"; break; case OTHER : a_order = "Other"; break; case UNKNOWN : default: a_order = "Unknown"; break; } info.push_back(std::string("Acquisition order: ") + a_order); // DicomFile dicomFile((*mFileMap.begin()).first.c_str()); // std::vector temp; // dicomFile.ReadCSAImageHeader("MosaicRefAcqTimes", temp); // info.insert(info.end(), temp.begin(), temp.end()); return info; } /// /** */ template void SyngoMosaicHandler::mGetVolumes(std::map >& v) { v.clear(); std::string uid = GetSeriesUid(); wxString message = _("Reading series ") + uid; //wxString(uid.c_str(), wxConvLocal); if (verbose) { wxLogStatus(message); } int image_columns, image_rows; //Find(DT_IMAGECOLUMNS, image_columns); Find("Columns", image_columns); //Find(DT_IMAGEROWS, image_rows); Find("Rows", image_rows); FileMapType::const_iterator it = mFileMap.begin(); FileMapType::const_iterator end = mFileMap.end(); int n_slices = GetNumberOfSlices(); int mosaic_rows = GetRows(); int mosaic_columns = GetColumns(); std::vector voxel_size = GetVoxelSize(); std::vector offset(2, 0); offset[0] = -0.5 * GetColumns() * voxel_size[0]; offset[1] = -0.5 * GetRows() * voxel_size[1]; std::map minDistMap; for (;it != end; it++) { v[it->second.front()] = Volume(mosaic_rows, mosaic_columns); std::vector data; DicomFile d_file(it->first.c_str()); double slope = 1; double intercept = 0; if (rescale) { GetRescaleSlopeAndIntercept(d_file, slope, intercept); } d_file.PixelData(data, image_rows * image_columns * sizeof(T), slope, intercept); std::vector rotation = GetRotationMatrix(it->second.front()); int number_of_columns = image_columns/mosaic_columns; std::string str; bool BottomUpMosaic = true; if (ReadCSAImageHeader("ProtocolSliceNumber", str)) { if (stoi(str) != 0) { // we'll assume top down and not some weird order BottomUpMosaic = false; } } std::string protocol; int err = ReadCSASeriesHeader("MrProtocol", protocol); if (err == -1) { err = ReadCSASeriesHeader("MrPhoenixProtocol", protocol); } if (err <= 0) { return; } double sPositionSag, sPositionCor, sPositionTra, sNormalSag, sNormalCor, sNormalTra, dDistFact; for (int tile = 0; tile < n_slices; ++tile) { int tile_column = tile % number_of_columns; int tile_row = tile / number_of_columns; typename std::vector::iterator tile_begin = data.begin() + tile_column * mosaic_columns + tile_row * mosaic_rows * image_columns; assert(tile_begin < data.end()); std::vector slice; slice.reserve(mosaic_rows * mosaic_columns); for (int row_no = 0; row_no < mosaic_rows; ++row_no) { typename std::vector::iterator row_begin = tile_begin + row_no * image_columns; typename std::vector::iterator row_end = row_begin + mosaic_columns; assert(row_end <= data.end()); slice.insert(slice.end(), row_begin, row_end); } // get slice distance std::string::size_type pos; int lSize = 0; pos = protocol.find("sSliceArray.lSize"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> lSize; } std::vector center(3,0); // ASL from Siemens apparently has only one sSliceArray.asSlice element. if (lSize == n_slices) { int slice_number = (BottomUpMosaic) ? tile : (n_slices - tile - 1); double value; wxString searchStr = wxString::Format(_T("sSliceArray.asSlice[%d].sPosition.dSag"), slice_number); pos = protocol.find(searchStr.mb_str(wxConvLocal)); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> value; center[0] = value; } searchStr = wxString::Format(_T("sSliceArray.asSlice[%d].sPosition.dCor"), slice_number); pos = protocol.find(searchStr.mb_str(wxConvLocal)); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> value; center[1] = value; } searchStr = wxString::Format(_T("sSliceArray.asSlice[%d].sPosition.dTra"), slice_number); pos = protocol.find(searchStr.mb_str(wxConvLocal)); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> value; center[2] = value; } } else { // Special case, some series do not have an element for each slice. Base slice spacing on the first element. if (tile == 0) { if (d_file.Find("SpacingBetweenSlices", dDistFact) == 0) { pos = protocol.find("sSliceArray.asSlice[0].dThickness"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> dDistFact; dDistFact /= n_slices; } } pos = protocol.find("sSliceArray.asSlice[0].sPosition.dSag"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> sPositionSag; } center[0] = sPositionSag; pos = protocol.find("sSliceArray.asSlice[0].sNormal.dSag"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> sNormalSag; } pos = protocol.find("sSliceArray.asSlice[0].sPosition.dCor"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> sPositionCor; } center[1] = sPositionCor; pos = protocol.find("sSliceArray.asSlice[0].sNormal.dCor"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> sNormalCor; } pos = protocol.find("sSliceArray.asSlice[0].sPosition.dTra"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> sPositionTra; } center[2] = sPositionTra; pos = protocol.find("sSliceArray.asSlice[0].sNormal.dTra"); if (pos != std::string::npos) { std::stringstream ss(protocol.substr(pos, 256)); ss.ignore(256, '='); ss >> sNormalTra; } } else { // We assume that center varies along the slice normal. center[0] = sPositionSag + sNormalSag * sNormalSag * dDistFact * tile; center[1] = sPositionCor + sNormalCor * sNormalCor * dDistFact * tile; center[2] = sPositionTra + sNormalTra * sNormalTra * dDistFact * tile; } } double dist = 0; for (int i = 0; i < 3; ++i) { dist += rotation[i+6] * center.at(i); } v[it->second.front()].AddSlice(dist, slice, it->first); if (minDistMap.find(it->second.front()) == minDistMap.end()) { // Convert center to ipp std::vector ipp(3,0); ipp[0] = center[0] + rotation[0] * offset[0] + rotation[3] * offset[1]; ipp[1] = center[1] + rotation[1] * offset[0] + rotation[4] * offset[1]; ipp[2] = center[2] + rotation[2] * offset[0] + rotation[5] * offset[1]; minDistMap[it->second.front()] = dist; position[it->second.front()] = ipp; } if (dist < minDistMap[it->second.front()]) { // Convert center to ipp std::vector ipp(3,0); ipp[0] = center[0] + rotation[0] * offset[0] + rotation[3] * offset[1]; ipp[1] = center[1] + rotation[1] * offset[0] + rotation[4] * offset[1]; ipp[2] = center[2] + rotation[2] * offset[0] + rotation[5] * offset[1]; minDistMap[it->second.front()] = dist; position[it->second.front()] = ipp; } } assert(v[it->second.front()].size() == n_slices); } } mriconvert/DicomTags.h0000640000175000000620000000733712542632312014305 0ustar stevestaff/// DicomTags.h /** Macros for various DICOM tags. */ #define DT_ACQUISITIONNUMBER DicomTag(0x0020, 0x0012) #define DT_ACQUISITIONTIME DicomTag(0x0008, 0x0032) #define DT_BITSALLOCATED DicomTag(0x0028, 0x0100) #define DT_CHARACTERSET DicomTag(0x0008, 0x0005) #define DT_CLINICALTRIALPROTOCOLNAME DicomTag(0x0012, 0x0021) #define DT_DIMENSIONINDEXSEQUENCE DicomTag(0x0020, 0x9222) #define DT_ECHONUMBER DicomTag(0x0018, 0x0086) #define DT_FLIPANGLE DicomTag(0x0018, 0x1314) #define DT_FRAMEACQUISITIONNUMBER DicomTag(0x0020, 0x9156) #define DT_FRAMEINCREMENTPOINTER DicomTag(0x0028, 0x0009) #define DT_IMAGECOLUMNS DicomTag(0x0028, 0x0011) #define DT_IMAGECOMMENTS DicomTag(0x0020, 0x4000) #define DT_IMAGEORIENTATIONPATIENT DicomTag(0x0020, 0x0037) #define DT_IMAGEPOSITIONPATIENT DicomTag(0x0020, 0x0032) #define DT_IMAGEROWS DicomTag(0x0028, 0x0010) #define DT_IMAGETYPE DicomTag(0x0008, 0x0008) #define DT_INSTANCENUMBER DicomTag(0x0020, 0x0013) #define DT_INVERSIONTIME DicomTag(0x0018, 0x0082) #define DT_LARGESTIMAGEPIXELVALUE DicomTag(0x0028, 0x0107) #define DT_MANUFACTURER DicomTag(0x0008, 0x0070) #define DT_MFGROUPLENGTH DicomTag(0x0002, 0x0000) #define DT_MFSOPCLASS DicomTag(0x0002, 0x0002) #define DT_MFSOPINSTANCE DicomTag(0x0002, 0x0003) #define DT_MFTRANSFERSYNTAX DicomTag(0x0002, 0x0010) #define DT_MODALITY DicomTag(0x0008, 0x0060) #define DT_MODELNAME DicomTag(0x0008, 0x1090) #define DT_MRACQUISITIONTYPE DicomTag(0x0018, 0x0023) #define DT_NUMBEROFAVERAGES DicomTag(0x0018, 0x0083) #define DT_NUMBEROFFRAMES DicomTag(0x0028, 0x0008) #define DT_NUMBEROFTEMPORALPOSITIONS DicomTag(0x0020, 0x0105) #define DT_OVERLAYBITSALLOCATED DicomTag(0x6000, 0x0100) #define DT_PATIENTID DicomTag(0x0010, 0x0020) #define DT_PATIENTNAME DicomTag(0x0010, 0x0010) #define DT_PATIENTBIRTHDATE DicomTag(0x0010, 0x0030) #define DT_PERFRAMEFUNCTIONALGROUPSSEQUENCE DicomTag(0x5200, 0x9230) #define DT_PHASEENCODINGDIRECTION DicomTag(0x0018, 0x1312) #define DT_PHOTOMETRICINTERPRETATION DicomTag(0x0028, 0x0004) #define DT_PIXELDATA DicomTag(0x7fe0, 0x0010) #define DT_PIXELREPRESENTATION DicomTag(0x0028, 0x0103) #define DT_PIXELSPACING DicomTag(0x0028, 0x0030) #define DT_PROTOCOLNAME DicomTag(0x0018, 0x1030) #define DT_PULSESEQUENCENAME DicomTag(0x0018, 0x9005) #define DT_RECEIVECOILMANUFACTURERNAME DicomTag(0x0018, 0x9041) #define DT_REPETITIONTIME DicomTag(0x0018, 0x0080) #define DT_RESCALEINTERCEPT DicomTag(0x0028, 0x1052) #define DT_RESCALESLOPE DicomTag(0x0028, 0x1053) #define DT_SAMPLESPERPIXEL DicomTag(0x0028, 0x0002) #define DT_SECONDARYCAPTUREDEVICESOFTWAREVERSION DicomTag(0x0018, 0x1019) #define DT_SEQUENCENAME DicomTag(0x0018, 0x0024) #define DT_SERIESDATE DicomTag(0x0008, 0x0021) #define DT_SERIESDESCRIPTION DicomTag(0x0008, 0x103E) #define DT_SERIESINSTANCEUID DicomTag(0x0020, 0x000E) #define DT_SERIESNUMBER DicomTag(0x0020, 0x0011) #define DT_SERIESTIME DicomTag(0x0008, 0x0031) #define DT_SHAREDFUNCTIONALGROUPSSEQUENCE DicomTag(0x5200, 0x9229) #define DT_SLICESPACING DicomTag(0x0018, 0x0088) #define DT_SLICETHICKNESS DicomTag(0x0018, 0x0050) #define DT_SOFTWAREVERSION DicomTag(0x0018, 0x1020) #define DT_SOPCLASS DicomTag(0x0008, 0x0016) #define DT_SOPINSTANCE DicomTag(0x0008, 0x0018) #define DT_STUDYDATE DicomTag(0x0008, 0x0020) #define DT_STUDYDESCRIPTION DicomTag(0x0008, 0x1030) #define DT_STUDYID DicomTag(0x0020, 0x0010) #define DT_STUDYINSTANCEUID DicomTag(0x0020, 0x000D) #define DT_STUDYTIME DicomTag(0x0008, 0x0030) #define DT_TEMPORALPOSITIONID DicomTag(0x0020, 0x0100) #define DT_TRANSMITCOILMANUFACTURERNAME DicomTag(0x0018, 0x9050) #define DT_VARIABLEFLIPANGLEFLAG DicomTag(0x0018, 0x1315) #define DT_WINDOWCENTERANDWIDTHEXPLANATION DicomTag(0x0028, 0x1055) #define DT_WINDOWCENTER DicomTag(0x0028, 0x1050) #define DT_WINDOWWIDTH DicomTag(0x0028, 0x1051) mriconvert/MetaHeader.cpp0000640000175000000620000000264012542632325014761 0ustar stevestaff/// MetaHeader.cpp /** */ #include "MetaHeader.h" using namespace jcs; bool MetaHeader::IsMetaHeaderElement(DicomElementInstance de) { bool retval = false; if (de.tag.group == 0x0002) { retval = true; } return retval; } /// /** Gets the transfer syntax for the main part of the file. */ wxUint8 MetaHeader::GetMainTransferSyntaxCode() { wxUint8 retval = LEI_CODE; // Default transfer syntax for DICOM. std::vector::iterator it = mhElements.begin(); std::vector::iterator it_end = mhElements.end(); for (; it < it_end; ++it) { if (it->tag == DT_MFTRANSFERSYNTAX) { if (it->myValue->first().Cmp(wxString::FromAscii(LEE_UID))) { retval = LEE_CODE; } if (it->myValue->first().Cmp(wxString::FromAscii(LEI_UID))) { retval = LEI_CODE; } if (it->myValue->first().Cmp(wxString::FromAscii(BEE_UID))) { retval = BEE_CODE; } break; } } return retval; } std::istream & jcs::operator>> (std::istream &in, MetaHeader &mh) { DicomElementInstance de; de.transferSyntaxCode = LEE_CODE; std::streampos save_position; while (true) { save_position = in.tellg(); in >> de; if (mh.IsMetaHeaderElement(de)) { mh.mhElements.push_back(de); } else { in.seekg(save_position); break; } } return in; } mriconvert/StringConvert.h0000640000175000000620000000200412542632332015226 0ustar stevestaff/// StringConvert.h /** */ #ifndef STRINGCONVERT_H_ #define STRINGCONVERT_H_ #include #include #include #include #include namespace jcs { // no, it doesn't make sense to put this here, but that's where it is for now. //extern bool verbose; float stof(const std::string& rString); float stof(const std::string& rString, int n); int stoi(const std::string& rString); int stoi(const std::string& rString, int n); std::string itos(const int i, int width = 0); std::string ftos(const float f); std::string Date(const std::string& date); std::vector ParseDicomString(const std::string& str); template struct member_of : std::binary_function , bool> { bool operator()(const T& c, const std::basic_string& s) const { return (s.find(c) != std::basic_string::npos); } }; std::string RemoveInvalidChars(const std::string& name); } #endif mriconvert/HandlerFactory.cpp0000640000175000000620000001232112542632312015660 0ustar stevestaff/// HandlerFactory.cpp /** */ #include "HandlerFactory.h" #include #include "Dictionary.h" #include "SyngoHandler.h" #include "AchievaDtiHandler.h" #include "EnhancedMrHandler.h" #include "GeEpiHandler.h" #include "GeDti2Handler.h" #include "GeDtiRbHandler.h" #include "NumarisMosaicHandler.h" #include "SyngoMosaicHandler.h" using namespace jcs; enum { STANDARD, NUMARIS_VOLUME, NUMARIS_SLICE, NUMARIS_MOSAIC, SYNGO_VOLUME, SYNGO_SLICE, SYNGO_MOSAIC, GE_EPI, GE_DTI, GE_DTI2, ENHANCED_MR, ACHIEVA }; const char* EnhancedMrSopClass = "1.2.840.10008.5.1.4.1.1.4.1"; /// /** Creates and returns a handler appropriate for the given file. \param filename The name of a DICOM file. \return A pointer to a SeriesHandler instance. */ SeriesHandler* HandlerFactory::CreateHandler(const char* filename) { std::string series_uid; DicomFile dfile(filename); //dfile.Find("SeriesInstanceUid", series_uid); dfile.Find("SeriesInstanceUID", series_uid); // Fix problems with termination std::string temp(series_uid.c_str()); series_uid.clear(); series_uid = temp; SeriesHandler* handler; int series_type = GetSeriesType(dfile); switch (series_type) { case SYNGO_VOLUME : case SYNGO_SLICE : handler = new SyngoHandler(series_uid); break; case NUMARIS_MOSAIC : handler = new NumarisMosaicHandler(series_uid); break; case SYNGO_MOSAIC : handler = new SyngoMosaicHandler(series_uid); break; case GE_EPI : handler = new GeEpiHandler(series_uid); break; case GE_DTI : handler = new GeDtiRbHandler(series_uid); break; case GE_DTI2 : handler = new GeDti2Handler(series_uid); break; case ENHANCED_MR : handler = new EnhancedMrHandler(series_uid); break; case ACHIEVA : handler = new AchievaDtiHandler(series_uid); break; default : handler = new SeriesHandler(series_uid); } return handler; } /// /** Analyzes DicomFile instance to determine type of series. \param dfile A reference to a DicomFile instance. \return Series type code. */ int HandlerFactory::GetSeriesType(DicomFile& dfile) { int retval = STANDARD; std::string s; // All manufacturers are presumably equivalent if Enhanced MR // files are produced. //dfile.Find("SopClass", s); dfile.Find("SOPClassUID", s); if (s.find(EnhancedMrSopClass) != std::string::npos) { retval = ENHANCED_MR; return retval; } // Otherwise, branch on manufacturer to account for the // idiosyncracies of each. dfile.Find("Manufacturer", s); if (s.find("SIEMENS") != std::string::npos) { std::string software; //dfile.Find("SoftwareVersion", software); dfile.Find("SoftwareVersions", software); if (software.find("VA13") != std::string::npos) { Dictionary* Numaris = Numaris_Dictionary::Instance(); int x = 0; if (dfile.Find(Numaris->Lookup("BASE_RAW_MATRIX_SIZE"), x) && (x == 64)) { return NUMARIS_MOSAIC; } //dfile.Find("MrAcquisitionType", s); dfile.Find("MRAcquisitionType", s); if (s.find("3D") == std::string::npos) { return NUMARIS_SLICE; } else { return NUMARIS_VOLUME; } } else { if (software.find("syngo") != std::string::npos) { dfile.Find("ImageType", s); if ((s.find("MOSAIC") != std::string::npos) && (s.find("DUMMY IMAGE") == std::string::npos)) { return SYNGO_MOSAIC; } //dfile.Find("MrAcquisitionType", s); dfile.Find("MRAcquisitionType", s); if (s.find("3D") == std::string::npos) { return SYNGO_SLICE; } else { return SYNGO_VOLUME; } } else { return STANDARD; } } } if (s.find("GE") != std::string::npos) { std::string sequence; Dictionary* Excite = Excite_Dictionary::Instance(); dfile.Find(Excite->Lookup("Pulse_seq_Name"), sequence); if (sequence.find("dti_epi") != std::string::npos) { return GE_DTI; } if (sequence.find("epi2") != std::string::npos) { return GE_DTI2; } if (sequence.find("epi") != std::string::npos) { return GE_EPI; } std::string imageType; dfile.Find("ImageType", imageType); if (imageType.find("EPI") != std::string::npos) { return GE_EPI; } else { return STANDARD; } } if (s.find("Philips") != std::string::npos) { std::string description; dfile.Find("SeriesDescription", description); if (description.find("DTI") != std::string::npos) { return ACHIEVA; } dfile.Find("ProtocolName", description); if (description.find("DTI") != std::string::npos) { return ACHIEVA; } } return STANDARD; } //cdt /// //cdt /** Wrapper for GetSeriesType(DicomFile& dfile). //cdt \param filename Name of DICOM file to analyze. //cdt \return Series type code. //cdt */ //cdt int //cdt HandlerFactory::GetSeriesType(const char* filename) //cdt { //cdt DicomFile dfile(filename); //cdt return GetSeriesType(dfile); //cdt } mriconvert/AnalyzeVolume.cpp0000750000175000000620000001447412542632317015570 0ustar stevestaff/// AnalyzeVolume.cpp /** */ #if defined(__WXGTK__) || defined(__WXMOTIF__) #include #endif #include #include #include #include "AnalyzeVolume.h" #include "StringConvert.h" using namespace jcs; /// /** */ AnalyzeVolume::AnalyzeVolume(const char* filename, const char* he, const char* re) : BasicVolumeFormat(filename, he, re), mByteOrder(aLITTLE_ENDIAN) { mInitHeader(); } /// /** */ AnalyzeVolume::~AnalyzeVolume() { } /// /** */ void AnalyzeVolume::WriteHeader(Basic3DHeader* header) { AnalyzeHeader* spm_header = dynamic_cast(header); mHeader = *spm_header; if (mWriteHeaderFile() == 1) { if (verbose && !quiet) { std::cout << "Wrote " << mFileName.GetFullPath() << std::endl; } } } /// /** */ int AnalyzeVolume::mWriteHeaderFile() { if (!mOpenHeaderFile(std::ios::out|std::ios::binary)) { wxLogError(_T("Cannot create header file %s"), mFileName.GetFullName().c_str()); return 0; } mHeaderFile.write(reinterpret_cast (&mHeader.hk.sizeof_hdr), sizeof(mHeader.hk.sizeof_hdr)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.data_type), sizeof(mHeader.hk.data_type)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.db_name), sizeof(mHeader.hk.db_name)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.extents), sizeof(mHeader.hk.extents)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.session_error), sizeof(mHeader.hk.session_error)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.regular), sizeof(mHeader.hk.regular)); mHeaderFile.write(reinterpret_cast (&mHeader.hk.hkey_un0), sizeof(mHeader.hk.hkey_un0)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.dim), sizeof(mHeader.dime.dim)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused8), sizeof(mHeader.dime.unused8)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused9), sizeof(mHeader.dime.unused9)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused10), sizeof(mHeader.dime.unused10)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused11), sizeof(mHeader.dime.unused11)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused12), sizeof(mHeader.dime.unused12)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused13), sizeof(mHeader.dime.unused13)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.unused14), sizeof(mHeader.dime.unused14)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.datatype), sizeof(mHeader.dime.datatype)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.bitpix), sizeof(mHeader.dime.bitpix)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.dim_un0), sizeof(mHeader.dime.dim_un0)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.pixdim), sizeof(mHeader.dime.pixdim)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.vox_offset), sizeof(mHeader.dime.vox_offset)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.funused1), sizeof(mHeader.dime.funused1)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.funused2), sizeof(mHeader.dime.funused2)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.funused3), sizeof(mHeader.dime.funused3)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.cal_max), sizeof(mHeader.dime.cal_max)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.cal_min), sizeof(mHeader.dime.cal_min)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.compressed), sizeof(mHeader.dime.compressed)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.verified), sizeof(mHeader.dime.verified)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.glmax), sizeof(mHeader.dime.glmax)); mHeaderFile.write(reinterpret_cast (&mHeader.dime.glmin), sizeof(mHeader.dime.glmin)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.descrip), sizeof(mHeader.hist.descrip)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.aux_file), sizeof(mHeader.hist.aux_file)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.orient), sizeof(mHeader.hist.orient)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.originator), sizeof(mHeader.hist.originator)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.generated), sizeof(mHeader.hist.generated)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.scannum), sizeof(mHeader.hist.scannum)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.patient_id), sizeof(mHeader.hist.patient_id)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.exp_date), sizeof(mHeader.hist.exp_date)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.exp_time), sizeof(mHeader.hist.exp_time)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.hist_un0), sizeof(mHeader.hist.hist_un0)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.views), sizeof(mHeader.hist.views)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.vols_added), sizeof(mHeader.hist.vols_added)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.start_field), sizeof(mHeader.hist.start_field)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.field_skip), sizeof(mHeader.hist.field_skip)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.omax), sizeof(mHeader.hist.omax)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.omin), sizeof(mHeader.hist.omin)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.smax), sizeof(mHeader.hist.smax)); mHeaderFile.write(reinterpret_cast (&mHeader.hist.smin), sizeof(mHeader.hist.smin)); mCloseHeaderFile(); return 1; } /// /** */ void AnalyzeVolume::mInitHeader() { mHeader.InitHeader(); } /// /** */ void AnalyzeHeader::InitHeader() { memset(&hist, 0, sizeof(hist)); memset(&dime, 0, sizeof(dime)); memset(&hk, 0, sizeof(hk)); } mriconvert/Basic3DOutputter.cpp0000640000175000000620000002430212542632317016126 0ustar stevestaff/// Basic3DOutputter.cpp /** */ #include #include #include #include #include "OutputList.h" #include "Basic3DOutputter.h" #include "SeriesHandler.h" #include "HandlerFactory.h" #include "BasicVolumeFormat.h" using namespace jcs; /// /** \param SetOfVolIdVectors \return A vector of true/false values. */ std::vector GetValuesToUse(std::set SetOfVolIdVectors) { std::set< VolId >::iterator viv = SetOfVolIdVectors.begin(); std::set< VolId >::iterator viv_end = SetOfVolIdVectors.end(); typedef std::vector< std::set< std::string > > voviv; voviv VectorOfVolIdValues; for (unsigned int i = 0; i < viv->ids.size(); ++i) { VectorOfVolIdValues.push_back(std::set< std::string > ()); } VolId::IdType::const_iterator vid, vid_end; voviv::iterator insert_point; for (;viv != viv_end; ++viv) { vid = viv->ids.begin(); vid_end = viv->ids.end(); for (insert_point = VectorOfVolIdValues.begin(); vid != vid_end; ++vid, ++insert_point) { insert_point->insert(*vid); } } std::vector UseValue; voviv::iterator vit = VectorOfVolIdValues.begin(); voviv::iterator vit_end = VectorOfVolIdValues.end(); for (; vit != vit_end; ++vit) { UseValue.push_back(vit->size() > 1); } return UseValue; } /// Constructor /** Populate class variables from 'options'. */ Basic3DOutputter::Basic3DOutputter(const Options& options): OutputterBase(options) { dim_ = mOptions.intOptions["dim"]; headerExtension = mOptions.stringOptions["header"]; rawExtension = mOptions.stringOptions["raw"]; skip_ = mOptions.intOptions["skip"]; rescale = mOptions.boolOptions["rescale"]; bvecs_postfix = "_bvecs"; bvals_postfix = "_bvals"; moco_postfix = "_moco"; info_postfix = "_info"; txt_ext = "txt"; } /// The Destructor /** Retrieves Basic3DOutputter-specific option values for saving in user's config file. */ Basic3DOutputter::~Basic3DOutputter() { mOptions.intOptions["dim"] = dim_; mOptions.stringOptions["header"] = headerExtension; mOptions.stringOptions["raw"] = rawExtension; mOptions.intOptions["skip"] = skip_; mOptions.boolOptions["rescale"] = rescale; } /// /** Initialize options with program defaults and return Options object. \return An Options object. */ Options Basic3DOutputter::Get3DOptions() { Options options = GetBaseOptions(); // Dimensionality of output, 3D or 4D. options.intOptions["dim"] = 3; // Number of volumes to skip. options.intOptions["skip"] = 0; // Save format, hdr/img or nii. options.stringOptions["header"] = _T("hdr"); options.stringOptions["raw"] = _T("img"); // Apply rescale slope and intercept to data. options.boolOptions["rescale"] = false; return options; } /// /** Updates list of files to write, handles MoCo, DTI and multi-echo series. \param handler A pointer to a SeriesHandler object. */ void Basic3DOutputter::UpdateOutputForSeries(SeriesHandler* handler) { std::string series_uid(handler->GetSeriesUid()); RemoveSeries(series_uid); ImageFileName name; name.seriesUid = series_uid; name.SetPrefix(GenerateDefaultPrefix(handler)); FillInDefaultDirs(name, handler); //std::cout << "1 Basic3DOutputter::UpdateOutputForSeries: " << name.GetFullPath() << std::endl; int dimensionality = GetDimensionality(series_uid); if (dimensionality == 4) { name.SetExt(headerExtension.ToStdString()); mOutputList.fileNameList.insert(make_pair(series_uid, name)); if (rawExtension != _T("")) { name.SetExt(rawExtension.ToStdString()); mOutputList.fileNameList.insert(make_pair(series_uid, name)); } } else { // dimensionality == 3 std::set vol_ids = handler->GetVolIds(); std::vector use_id = GetValuesToUse(vol_ids); std::set::iterator it = vol_ids.begin(); int skip = GetSkip(series_uid); int skipVols = (static_cast(vol_ids.size()) > skip) ? skip : 0; for (int i = 0; i < skipVols; ++i, ++it); for (;it != vol_ids.end(); ++it) { std::string postfix; for (unsigned int i = 0; i < it->ids.size(); ++i) { if (use_id.at(i) && (!it->ids.at(i).empty())) { postfix.append("_" + it->ids.at(i)); } } name.SetPostfix(postfix); std::string output_file_uid = series_uid + postfix; volKeyMap[*it] = output_file_uid; name.SetExt(headerExtension.ToStdString()); mOutputList.fileNameList.insert(make_pair(output_file_uid, name)); if (rawExtension != _T("")) { name.SetExt(rawExtension.ToStdString()); mOutputList.fileNameList.insert(make_pair(output_file_uid, name)); } } } //std::cout << "2 Basic3DOutputter::UpdateOutputForSeries: " << name.GetFullPath() << std::endl; // Register MoCo files. if (handler->IsMoCo()) { RegisterOutputFile(series_uid, txt_ext, moco_postfix, handler); } // Register DTI files. if (handler->IsDti()) { RegisterOutputFile(series_uid, "", bvecs_postfix, handler); RegisterOutputFile(series_uid, "", bvals_postfix, handler); } std::vector stringInfo = handler->GetStringInfo(); RegisterOutputFile(series_uid, txt_ext, info_postfix, handler); } /// /** \param series_uid \param ext Extension for the file. \param postfix Postfix for file name. \param handler Pointer to SeriesHandler associated with this file. */ void Basic3DOutputter::RegisterOutputFile(std::string series_uid, std::string ext, std::string postfix, SeriesHandler* handler) { ImageFileName name; name.seriesUid = series_uid; name.SetPrefix(GenerateDefaultPrefix(handler)); FillInDefaultDirs(name, handler); name.SetExt(ext); name.SetPostfix(postfix); //std::cout << "Basic3DOutputter::RegisterOutputFile: " << name.GetFullPath() << std::endl; mOutputList.fileNameList.insert(make_pair(series_uid + name.GetPostfix(), name)); } /// /** \param seriesUid a reference to a SeriesUID std::string */ void Basic3DOutputter::RemoveSeries(const std::string& seriesUid) { std::set keys; OutputList::ListType::iterator it = mOutputList.fileNameList.begin(); OutputList::ListType::iterator it_end = mOutputList.fileNameList.end(); for (;it != it_end; ++it) { if (it->second.seriesUid == seriesUid) { keys.insert(it->first); } } std::set::iterator key_it = keys.begin(); std::set::iterator key_it_end = keys.end(); for (;key_it != key_it_end; ++key_it) { mOutputList.fileNameList.erase(*key_it); } } /// /** \param vol_id \return wxFileName */ wxFileName Basic3DOutputter::GetFileNameFromVolId(const VolId& vol_id) { // first element in vol id must be series uid! if (GetDimensionality(vol_id.ids.front()) == 4) { return GetFileName(vol_id.ids.front()); } std::string key = volKeyMap[vol_id]; OutputList::ListType::iterator pos; pos = mOutputList.fileNameList.find(key); if (pos == mOutputList.fileNameList.end()) { wxLogError(_T("Error finding output file name")); for (unsigned int i = 0; i < vol_id.ids.size(); ++i) { wxLogError(_T("vol_id.ids[%d]: %s"), i, vol_id.ids[i].c_str()); } wxLogError(_T("Key: %s\n"), key.c_str()); OutputList::ListType::iterator test_it = mOutputList.fileNameList.begin(); while (test_it != mOutputList.fileNameList.end() ) { wxLogMessage(_T("Output list: %s\t%s"), test_it->first.c_str(), test_it->second.GetFullName().c_str()); ++test_it; } return wxFileName(_T("error")); } wxFileName name(mOutputList.rootDir + wxFileName::GetPathSeparator() + pos->second.GetFullPath()); return name; } /// Returns the dimension of the given series. /** \param series_uid a reference to a SeriesUID std::string \return Value of dimensionality. */ int Basic3DOutputter::GetDimensionality(const std::string& series_uid) { int dimValue = dim_; // FindIntInOverrides replaces dimValue only if override value found. FindIntInOverrides(series_uid, "dim", dimValue); return dimValue; } /// Sets dimensionality override for 'series_uid'. /** \param series_uid \param dim */ void Basic3DOutputter::SetDimensionality(const std::string& series_uid, int dim) { overrides[series_uid].intOptions["dim"] = dim; } /// /** \param series_uid \return Value of skip option. */ int Basic3DOutputter::GetSkip(const std::string& series_uid) { int skipValue = skip_; FindIntInOverrides(series_uid, "skip", skipValue); return skipValue; } /// /** \param series_uid \param skip Integer value of slices to skip. */ void Basic3DOutputter::SetSkip(const std::string& series_uid, int skip) { overrides[series_uid].intOptions["skip"] = skip; } /// /** \param series_uid \return True/False value of 'rescale' option. */ bool Basic3DOutputter::GetRescale(const std::string& series_uid) { bool boolValue; if (FindBoolInOverrides(series_uid, "rescale", boolValue)) { return boolValue; } return mOptions.boolOptions["rescale"]; } /// /** \param series_uid Reference to a series UID std::string. \param value */ void Basic3DOutputter::SetRescale(const std::string& series_uid, bool value) { overrides[series_uid].boolOptions["rescale"] = value; } /// /** Sets an integer option. \param name The name of the option. \param value The new value for the option. */ void Basic3DOutputter::SetOption(const std::string& name, int value) { OutputterBase::SetOption(name, value); if (name.find("skip") != std::string::npos) { SetSkip(value); } if (name.find("dim") != std::string::npos) { SetDimensionality(value); } } /// /** Sets a boolean option. \param name The name of the option. \param value The new value of the option. */ void Basic3DOutputter::SetOption(const std::string& name, bool value) { OutputterBase::SetOption(name, value); if (name.find("rescale") != std::string::npos) { rescale = value; } } mriconvert/OverrideDlg.h0000640000175000000620000000045712542632312014635 0ustar stevestaff/// OverrideDlg.h /** */ #ifndef OVERRIDE_DLG_H_ #define OVERRIDE_DLG_H_ #include #include namespace jcs { class OverrideDlg : public wxDialog { public: OverrideDlg(); wxCheckBox* dimCheck; wxSpinCtrl* skipSpin; }; } #endif mriconvert/MetaOptionsDlg.h0000640000175000000620000000174312542632333015322 0ustar stevestaff/// MetaOptionsDlg.h /** */ #ifndef META_OPTIONS_DLG_H_ #define META_OPTIONS_DLG_H_ #include "BasicOptionsDlg.h" namespace jcs { class NewMetaOutputter; class MetaOptionsDlg : public BasicOptionsDlg { public: MetaOptionsDlg(NewMetaOutputter* outputter); void SetFields(std::vector fields); std::vector GetFields() const ; void OnOkay(wxCommandEvent& event); void OnClear(wxCommandEvent& event); bool NeedsRebuild() const { return mNeedsRebuild; } bool SaveHeaderOnly() const { return mpHeaderOnlyCheck->GetValue(); } protected: DECLARE_EVENT_TABLE() private: wxCheckBox* mpHeaderOnlyCheck; wxCheckListBox* mpCheckList; int mAddTag(const std::string tag); int mCheckItem(const std::string item); bool mNeedsRebuild; bool mSplit; int mDim; bool mHeaderOnly; int mSkip; NewMetaOutputter* mOutputter; }; } #endif mriconvert/jcsTree.h0000640000175000000620000000405112542632325014024 0ustar stevestaff/// jcsTree.h /** */ #ifndef JCS_TREE_H #define JCS_TREE_H #include #include #include class jcsTreeItemData : public wxTreeItemData { public: jcsTreeItemData(const std::string& uid, int itemType) : mUid(uid), mItemType(itemType) {} int GetItemType() const { return mItemType; } const std::string& GetUid() const { return mUid; } const std::string& GetSeriesUid() const { return mSeriesUid; } void SetSeriesUid(const std::string& uid) { mSeriesUid = uid; } const std::string& GetPrefix() const { return mPrefix; } void SetPrefix(const std::string& prefix) { mPrefix = prefix; } private: jcsTreeItemData() {} std::string mSeriesUid; // only used for output files std::string mPrefix; // also only for output files std::string mUid; int mItemType; }; class jcsTreeCtrl : public wxTreeCtrl { public: jcsTreeCtrl(wxWindow* parent, wxWindowID id, long style, const char* root); int GetItemType(const wxTreeItemId& item) const; int GetSelectionType() const; const std::string GetItemUid(const wxTreeItemId& item) const; wxString GetStringSelection() const; wxString GetStringSelection(const wxTreeItemId& item) const; std::string GetSelectionUid() const; wxTreeItemId GetTreeId(std::string uid) const; const std::string GetSeriesUid(const wxTreeItemId& item) const; const std::string GetPrefix(const wxTreeItemId& item) const; bool IsChild(const wxTreeItemId& item, const wxTreeItemId& parent) const; void Reset(); void RemoveBranch(wxTreeItemId branch); bool IsMultiple() const; int GetSelected(wxArrayTreeItemIds& selecteds) const; protected: //Maps unique id's to tree item id's typedef std::map jcsTreeMap; jcsTreeMap mTreeMap; private: bool HasVisibleRoot(); void mRemoveFromMap(wxTreeItemId branch); void CreateImageList(int size = 16); long mStyle; }; enum { dtROOT, dtSUBJECT, dtSTUDY, dtSERIES, dtFILE }; enum { folder_icon, open_folder_icon, file_icon }; #endif mriconvert/TextFileViewer.h0000750000175000000620000000057712542632312015342 0ustar stevestaff#ifndef TEXT_FILE_VIEWER_H #define TEXT_FILE_VIEWER_H #include class wxTextCtrl; //**** // This used to read and display text files, now it just // displays the contents provided by certain .h files. //**** class TextFileViewer: public wxFrame { public: TextFileViewer(wxWindow* parent, const wxChar* caption); private: wxTextCtrl* mTextCtrl; }; #endif