1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* cidriver.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* CID driver interface (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cidriver.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cidgload.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ciderrs.h" 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpostnm.h" 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svxf86nm.h" 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpsinfo.h" 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svcid.h" 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_ciddriver 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT NAME SERVICE 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const char* 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_get_postscript_name( CID_Face face ) 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* result = face->cid.cid_font_name; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( result && result[0] == '/' ) 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result++; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_PsFontNameRec cid_service_ps_name = 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_PsName_GetFunc) cid_get_postscript_name 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT INFO SERVICE 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_ps_get_font_info( FT_Face face, 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfoRec* afont_info ) 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *afont_info = ((CID_Face)face)->cid.font_info; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_ps_get_font_extra( FT_Face face, 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontExtraRec* afont_extra ) 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *afont_extra = ((CID_Face)face)->font_extra; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_PsInfoRec cid_service_ps_info = 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontInfoFunc) cid_ps_get_font_info, 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontExtraFunc) cid_ps_get_font_extra, 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontPrivateFunc)NULL, /* unsupported */ 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontValueFunc) NULL /* not implemented */ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CID INFO SERVICE 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_get_ros( CID_Face face, 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* *registry, 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* *ordering, 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int *supplement ) 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_FaceInfo cid = &face->cid; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( registry ) 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *registry = cid->registry; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ordering ) 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ordering = cid->ordering; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( supplement ) 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *supplement = cid->supplement; 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_get_is_cid( CID_Face face, 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool *is_cid ) 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( face ); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( is_cid ) 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *is_cid = 1; /* cid driver is only used for CID keyed fonts */ 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_get_cid_from_glyph_index( CID_Face face, 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt *cid ) 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( face ); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cid ) 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *cid = glyph_index; /* identity mapping */ 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_CIDRec cid_service_cid_info = 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros, 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid, 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SERVICE LIST 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_ServiceDescRec cid_services[] = 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_CID, &cid_service_cid_info }, 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { NULL, NULL } 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Module_Interface ) 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_get_interface( FT_Module module, 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* cid_interface ) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( module ); 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ft_service_list_lookup( cid_services, cid_interface ); 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_TABLE_DEF 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_Driver_ClassRec t1cid_driver_class = 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* first of all, the FT_Module_Class fields */ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_FONT_DRIVER | 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_SCALABLE | 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_HAS_HINTER, 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( FT_DriverRec ), 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "t1cid", /* module name */ 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x10000L, /* version 1.0 of driver */ 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x20000L, /* requires FreeType 2.0 */ 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_driver_init, 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_driver_done, 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_get_interface 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }, 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* then the other font drivers fields */ 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CID_FaceRec ), 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CID_SizeRec ), 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CID_GlyphSlotRec ), 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_face_init, 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_face_done, 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_init, 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_done, 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_slot_init, 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_slot_done, 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_slot_load_glyph, 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_GetKerningFunc */ 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_AttachFunc */ 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_GetAdvancesFunc */ 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_request, 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0 /* FT_Size_SelectFunc */ 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 237