# ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # !GUI忽略TEXTLINE_IN_READ_WHOLE_FILE_AT_ONCE_TEXTLINE_1、TEXTLINE_IN_READ_BOTTOM_UP_TEXTLINE_1 TEXTLINE_IN__ENCODING_TEXTLINE_1、SourceDataset_TEXTLINE_1 DestDataset_TEXTLINE_2, TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_2, TEXTLINE_OUT_ENCODING_TEXTLINE_2, TEXTLINE_OUT_END_OF_LINE_TEXTLINE_2, TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_2 DEFAULT_MACRO SourceDataset_TEXTLINE fme目录xml (FME_MF_DIR): 2美元平失败\ catalog_2.xml GUI多文件SourceDataset_TEXTLINE文本/ Compressed_Text_Files (* . txt; * .txt.gz) | * . txt; * .txt.gz | Text_Files (* . txt) | * . txt | Compressed_Text_Files (* .txt.gz) | * .txt.gz | All_files (* . *) | *。*源文本文件:包括[set encodedVal [FME_EncodeText {$(SourceDataset_TEXTLINE)}];设置“宏sourcedataset_textline_fmeencoded__ $encodedVal”;] DEFAULT_MACRO DestDataset_TEXTLINE $(FME_MF_DIR)fme catalog xml 2 flatten failure \textfileoutput.xml GUI文件名DestDataset_TEXTLINE Text/Compressed_Text_Files(*.txt;*.txt.gz)*目标文本文件文件:包括[set encodedVal [FME_EncodeText {$(DestDataset_TEXTLINE)}];设置“宏destdataset_textline_fmeencoded__ $encodedVal”;] DEFAULT_MACRO Destination_Directory $(FME_MF_DIR)有效的GUI DIRNAME Destination_Directory目标目录:包括[set encodedVal [FME_EncodeText {$(Destination_Directory)}];设置“宏destination_directory_fmeencoded__ $encodedVal”;[if {{$(SourceDataset_TEXTLINE)} == {}} {puts_real{参数'SourceDataset_TEXTLINE'必须有一个值。};退出1;};[如果{{$(DestDataset_TEXTLINE)} == {}} {puts_real{参数'DestDataset_TEXTLINE'必须被赋予一个值。};退出1;};[if {{$(Destination_Directory)} == {}} {puts_real{参数'Destination_Directory'必须有一个值。};退出1;};)# !START_HEADER # !WORKSPACE_VERSION 1 # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # #这个映射文件FME工作台是由:# 05/31/11 10:42:47 TEXTLINE之间的翻译和TEXTLINE FME建造12086 # #这个工作区生成:# #你可以编辑这个映射文件来定制其操作。注释被放置在各处以帮助您。# #修改历史:# #名称日期描述# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # # # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #以下行定义了标题向用户提供此#映射文件时通过FME GUI运行。如果需要一个更有意义的标题,您可以修改这个#。GUI标题TEXTLINE TEXTLINE翻译# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #以下行有用的统计信息的日志文件名称#将书面翻译。如果您希望保留这些统计数据,可以取消注释并进行#更新。# LOG_FILENAME translation.log # LOG_APPEND没有# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # FME记录以下行指示:任何特性不#进一步列出源特性的匹配任何模式在#这个文件。如果您正在修改这个映射文件,那么如果统计数据表明特性没有关联或分组,那么这对于准确描述您在转换过程中丢失的特性将是非常有用的。不相关的特性不匹配任何源规范,未分组的特性没有任何对应的_DEF行。# FME_DEBUG未归类不相关的# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #以下两行定义类型的读者和作家#用于这个翻译。如果您想将数据#转换回原始格式,可以复制该文件#并切换读写器类型。如果您重新运行FME,您将再次获得原始数据(以及您在此期间所做的任何修改)。注意,有几种格式不是#双向的(例如,GIF只能作为作者使用)#,所以反向翻译并不总是可能的。# !没有,READ_BOTTOM_UP,没有,FME_GEOMETRY_HANDLING,增强的WRITER_TYPE TEXTLINE WRITER_KEYWORD TEXTLINE_2 #!END_WB_HEADER # !宏WB_KEYWORD“TEXTLINE_1”#!END_WB_HEADER # !START_SOURCE_HEADER TEXTLINE TEXTLINE_1 DEFAULT_MACRO TEXTLINE_IN_READ_WHOLE_FILE_AT_ONCE_TEXTLINE_1 YES TEXTLINE_1_READ_WHOLE_FILE_AT_ONCE “$(TEXTLINE_IN_READ_WHOLE_FILE_AT_ONCE_TEXTLINE_1)” GUI ACTIVECHOICE TEXTLINE_IN_READ_WHOLE_FILE_AT_ONCE_TEXTLINE_1 YES,TEXTLINE_IN_READ_BOTTOM_UP%在一旦NO阅读整个文档:DEFAULT_MACRO TEXTLINE_IN_READ_BOTTOM_UP_TEXTLINE_1没有TEXTLINE_1_READ_BOTTOM_UP “$(TEXTLINE_IN_READ_BOTTOM_UP_TEXTLINE_1)” GUI CHOICE TEXTLINE_IN_READ_BOTTOM_UP_TEXTLINE_1是%否读取自下而上:#===================================================================== # Allows to force the encoding of source text file DEFAULT_MACRO TEXTLINE_IN__ENCODING_TEXTLINE_1 iso-8859-1 TEXTLINE_1__ENCODING "$(TEXTLINE_IN__ENCODING_TEXTLINE_1)" GUI OPTIONAL STRING_OR_ENCODING TEXTLINE_IN__ENCODING_TEXTLINE_1 UTF-8%UTF-16LE%UTF-16BE%ANSI%BIG5%SJIS%CP437%CP708%CP720%CP737%CP775%CP850%CP852%CP855%CP857%CP860%CP861%CP862%CP863%CP864%CP865%CP866%CP869%CP932%CP936%CP950%CP1250%CP1251%CP1252%CP1253%CP1254%CP1255%CP1256%CP1257%CP1258%ISO8859-1%ISO8859-2%ISO8859-3%ISO8859-4%ISO8859-5%ISO8859-6%ISO8859-7%ISO8859-8%ISO8859-9%ISO8859-13%ISO8859-15 Character Encoding (optional): # ===================================================================== # The following GUI line prompts for a file to be used as the source # TextLine file.用户输入被存储在宏,然后将其用于定义数据集#被读取。#从生成此映射文件的数据集:#!END_SOURCE_HEADER#!START_WB_HEADER DEFAULT_MACRO SourceDataset有[如果{{$(SourceDataset)}!= “”} {\ {放DEFAULT_MACRO SourceDataset_TEXTLINE_1 $(SourceDataset)} \}]#!END_WB_HEADER # !START_SOURCE_HEADER TEXTLINE TEXTLINE_1 DEFAULT_MACRO SourceDataset_TEXTLINE_1 $(SourceDataset_TEXTLINE)GUI的多文件SourceDataset_TEXTLINE_1文/ Compressed_Text_Files; | * .TXT(* TXT * txt.gz。); * txt.gz | TEXT_FILES(* TXT)| * .TXT | Compressed_Text_Files(* .txt.gz)| * .txt.gz | All_files(*。*)| *。*源文本文件(S):TEXTLINE_1_DATASET “$(SourceDataset_TEXTLINE_1)” #!END_SOURCE_HEADER#!START_WB_HEADER MACRO WB_KEYWORD “TEXTLINE_2” #!END_WB_HEADER # !START_DEST_HEADER TEXTLINE TEXTLINE_2#===================================================================== # The following GUI line prompts for a directory to be used as the # the destination for the TextLine files.所述用户输入存储在#宏,然后将其用于定义要写入的数据集。#用于生成此映射文件的数据集:#!END_DEST_HEADER#!START_WB_HEADER DEFAULT_MACRO DestDataset有[{IF “$(DestDataset)”!= “”} {\ {放DEFAULT_MACRO DestDataset_TEXTLINE_2 $(DestDataset)} \}]#!END_WB_HEADER # !START_DEST_HEADER TEXTLINE TEXTLINE_2 DEFAULT_MACRO DestDataset_TEXTLINE_2 $(DestDataset_TEXTLINE)GUI FILENAME DestDataset_TEXTLINE_2文/ Compressed_Text_Files; | * .TXT(* TXT * txt.gz。); * txt.gz | TEXT_FILES(* TXT)| * .TXT | Compressed_Text_Files(* .txt.gz)| * .txt.gz | All_files(*。*)| *。*目的地文本文件文件:#=====================================================================#的 following GUI line prompts for the overwrite flag.默认值为#YES。可能的值是YES或NO。比NO或#以外的任何值没有被解释为YES。DEFAULT_MACRO TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_2 YES TEXTLINE_2_OVERWRITE_FILE “$(TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_2)” GUI CHOICE TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_2 YES NO%覆盖现有文件:#=====================================================================#设置输出文件的编码类型 DEFAULT_MACRO TEXTLINE_OUT_ENCODING_TEXTLINE_2 utf-8 TEXTLINE_2_ENCODING "$(TEXTLINE_OUT_ENCODING_TEXTLINE_2)" GUI OPTIONAL STRING_OR_ENCODING TEXTLINE_OUT_ENCODING_TEXTLINE_2 UTF-8%UTF-16LE%UTF-16BE%ANSI%BIG5%SJIS%CP437%CP708%CP720%CP737%CP775%CP850%CP852%CP855%CP857%CP860%CP861%CP862%CP863%CP864%CP865%CP866%CP869%CP932%CP936%CP950%CP1250%CP1251%CP1252%CP1253%CP1254%CP1255%CP1256%CP1257%CP1258%ISO8859-1%ISO8859-2%ISO8859-3%ISO8859-4%ISO8859-5%ISO8859-6%ISO8859-7%ISO8859-8%ISO8859-9%ISO8859-13%ISO8859-15 Character Encoding (optional): # ===================================================================== # Set line termination character DEFAULT_MACRO TEXTLINE_OUT_END_OF_LINE_TEXTLINE_2 TEXTLINE_2_END_OF_LINE "$(TEXTLINE_OUT_END_OF_LINE_TEXTLINE_2)" GUI OPTIONAL CHOICE TEXTLINE_OUT_END_OF_LINE_TEXTLINE_2 Windows%Unix%Macintosh Line Termination: # ===================================================================== # Set the mime type.作为一个格式化的参数,即使是仅由FME服务器的存储库管理器DeFultMyTraceLyxOut.MIMEXyType TrimeLay2文本/朴素TrimeL2 2MyEype类型“$(Trtext Load OutuMimeType Type Lyn2)”来解析。注意-它实际上只在工作空间内使用。以下GUI行提示输入覆盖标志。默认值为#YES。可能的值是YES或NO。比NO或#以外的任何值没有被解释为YES。默认“宏文本行”是“文本行”是“文本行”是“文本行”是“文本行”是“文本行”是“文本行”是“文本行”是“图形用户界面选择文本行”是“文本行”是“文本行”是“文本行”是“非文本行”是“非文本行”是“文本行”是“非文本行”$(DestDataset是“文本行”!END_DEST_HEADER#!END U HEADER LOG_FILENAME“$(FME_MF_DIR)XMLFileFixer.LOG”LOG_APPEND NO LOG_MAX_FEATURES 200 LOG_MAX_RECORDED_FEATURES 200 FME_REPROJECTION_ENGINE FME FME_GEOMETRY_handing FME_STROKE_MAX_DEVIATION 0 LOG_TIMINGS YES LOG_FILTER_MASK-1 DEFAULT_MACRO DATASET_KEYWORDTEXTLINE_1 DEFAULT_MACRO DATASET_KEYWORDTEXTLINEŠ”-------------------------------------------------------------------------文本行_1_READER _META_ATTRIBUTES fme_basename fme_feature _type 35;——WorkStudioNyXMLFieleFixFor宏FMyVIEWRIESPAUP FMEVIEW是----------------------------------------包含[{[FIN存在eNV(TEMP)] }{SETGVisalIZETEMSPE$Env(TEMP)} ELSIF {$TCLIListSale:(平台)=“UNIX”}{SETGVisalIZETEMOP“/TMP”}否则{SETGVisalIZETEMPP C:};regsub-all{[,&]}{$(工作区名称)}{{}wsname;设置gVisualizerTemp$gVisualizerTemp/${wsname}uu[时钟格式[时钟秒]-格式%H%M%S];放置“宏工作区温度目录$gVisualizerTemp”;宏可视化工具特性库文件$(WORKSPACE_TEMP_DIR)/inspector.ffs宏可视化工具_CREATE_SPATIAL_INDEX YES 35;-----------------------------------查找uuuuuuuu KnownFeatureTypes_uuuuutext_uline YES“”no#----------工厂定义*测试工厂名称“意外的输入移除器”输入功能_TYPE*TEST@Lookup(uuuuuu KnownFeatureTypes_uuuuu,@FeatureType())==是输出传递功能_TYPE*357;——,ALIAS_GEOMETRY)#——-------------------------------------------------------------------------设定指令,将所有元属性添加到功能中。#我们这样做是为了让用户在查看的功能中看到所有可能的信息。READER_META_ATTRIBUTES fme_feature_type fme_dataset fme_basename#假设工作区临时目录已经设置并创建。请参阅controldefs.cpp-controldefs::writeVisualizerTempDir DEFAULT_MACRO WORKSPACE_TEMP_DIR INCLUDE[如果{[字符串长度{}]>0}{设置catter“”;设置逗号“;foreach attr{}{设置catter“$catter$comma@Value(\”$attr“)”;设置逗号“,”;} ;放置“宏CATMAC”连接($catter);}否则{放置“宏CATMAC”;};设置sa亚搏在线feName“[regsub-all{[^a-zA-Z0-9]}{文本{行}”[expr round(rand()*1000000)][时钟单击-毫秒]”;放置“宏安全名$SAFE亚搏在线 NAME”;]#创建FFS文件将驻留的临时目录。(“catch {file mkdir {$(WORKSPACE_TEMP_DIR)}}”)point cloud and vector features down different paths to prepare # them for viewing FACTORY_DEF * TestFactory FACTORY_NAME text_line_FeatureDirector INPUT FEATURE_TYPE text_line_0 TEST &fme_type == "fme_raster" OUTPUT FAILED FEATURE_TYPE text_line___NotRasterFeatures___ OUTPUT PASSED FEATURE_TYPE text_line___RasterFeatures___ FACTORY_DEF * TestFactory FACTORY_NAME text_line___FeatureDirector1 INPUT FEATURE_TYPE text_line___NotRasterFeatures___ TEST &fme_type == "fme_point_cloud" OUTPUT FAILED FEATURE_TYPE text_line___VectorFeatures___ OUTPUT PASSED FEATURE_TYPE text_line___PointCloudFeatures___ # Vector features simply may get their colors overridden FACTORY_DEF * TeeFactory FACTORY_NAME text_line_VectorSetterUpper INPUT FEATURE_TYPE text_line___VectorFeatures___ OUTPUT FEATURE_TYPE __viewme__ # Point Cloud Features Might Need to be thinned # Note that we don't call the ThinPointCloud function directly, but rather # do it through TCL.这应该允许这个转换器与# Desktop许可证一起使用,即使ThinPointCloud需要专业人员。Tcl2 proc 9f283d6c_c348_46b6_8f39_00148f9ddcec4_thinPointCloud {} {FME_Execute ThinPointCloud no_间伐1;}FACTORY_DEF * TeeFactory FACTORY_NAME text_line___PointCloudThinner输入FEATURE_TYPE text_line___PointCloudFeatures___输出FEATURE_TYPE __viewme__ @Tcl2 (“9 f283d6c_c348_46b6_8f39_00148f9ddcec4_thinpointcloud”) Tcl2 proc 9 f283d6c_c348_46b6_8f39_00148f9ddcec4_prepareraster {subsetStartRow subsetNumRows subsetStartCol subsetNumCols}{设置useDI(字符串相等查看nocase {$ (FME_VIEWER_APP)} {fmedatainspector});如果{!$useDI} { FME_Execute ApplyRasterRotation BILINEAR;};设置doResample [string = {NoReduction} {Resample}];set do子集[string = {NoReduction}{子集}];设置doBounds [string = {NoReduction} {BoundingBoxOnly}];{FME_Execute GeometryType fme_polygon;} elseif {$doResample || $ do子集}{set comment {First,我们需要给所有属性加上前缀。这样做是因为我们将调用@RasterProperties,我们希望确保它不会覆盖任何现有属性。};设置kAttrPrefix“。”;设置allNames [FME_AttributeNames];{设置新名称$kAttrPrefix;添加新名称oldName美元;FME_RenameAttribute新名称oldName美元;};FME_Execute RasterProperties光栅;如果{$doResample} {set oldNumCols [FME_GetAttribute _num_columns];设置oldNumRows [FME_GetAttribute _num_rows];设置oldSpacingX [FME_GetAttribute _spacing_x];设置oldSpacingY [FME_GetAttribute _spacing_y];设置kMinNumCells 32;设置kMaxNumCells 512;如果两个维度都大于最小num单元格,并且至少有一个大于最大值,那么我们只会重新取样。};$oldNumRows > $kMinNumCells && $oldNumCols > $kMinNumCells && ($oldNumRows > $kMaxNumCells || $oldNumCols > $kMaxNumCells)设置newSpacingY 1.0;如果{$oldNumRows > $oldNumCols} {set comment{如果行数多于列数,则需要选择一个间距,将行数减少到所选的最大值。};设置newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMaxNumCells];设置newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX];现在我们需要检查这样做是否会导致列数低于最小值。如果是这样,选择间距,使我们只向下到最小(而不是过去)。};设置newNumCols [expr $oldNumCols * $oldSpacingX / $newSpacingX];如果{$newNumCols < $kMinNumCells} {set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMinNumCells];设置newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY];};这与上面的情况相同,只是行和cols的角色是相反的。};设置newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMaxNumCells];设置newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY];设置newNumRows [expr $oldNumRows * $oldSpacingY / $newSpacingY];如果{$newNumRows < $kMinNumCells} {set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMinNumCells];设置newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX];};};FME_Execute ResampleRaster CELL_SIZE $newSpacingX $newSpacingY最近邻;};{set comment{获取一些可能是属性或常量的字符串的值。请注意,我们传递了正在使用的属性前缀,因为如果一个确实是属性,那么它实际上就不是字符串中的确切名称(因为我们在上面重命名了所有属性)。};设置rasterNumRows [FME_GetAttribute _num_rows];设置rasterNumCols[FME_GetAttribute_num_columns];设置注释{仅当指定的开始位置实际在光栅内时才执行子设置。};如果{$subsetStartRow<$rasterNumRows&&$subsetStartCol<$rasterNumCols}{设置注释{现在将子集绑定到光栅的大小,这样我们就不会创建填充。};如果{[expr$subsetStartRow+$subsetNumRows]>$rasterNumRows}{设置subsetNumRows[expr$rasterNumRows-$subsetStartRow];};如果{[expr$subsetStartCol+$subsetNumCols]>$rasterNumCols}{设置subsetNumCols[expr$rasterNumCols-$subsetStartCol];};执行substraster$subsetStartRow$subsetNumRows$subsetStartCol$subsetNumCols;};};set comment{删除@raserproperties添加的所有属性,并从实际属性中删除前缀。我们假设它们都以下划线开头。};FME_Execute RemoveAttributes FME_regexp_match{^};{设置新名称$kAttrPrefix;添加新名称oldName美元;FME_RenameAttribute$oldName$newName;};};}工厂定义*输入工厂名称文本行光栅设置器输入功能类型文本行光栅设置器输出功能类型视图名称Tcl2(“9f283d6c_c348_46b6_8f39_00148f9ddcec4_prepareRaster{ } { } { } { }“)现在将所有功能路由到记录器中,将其功能类型更改为转换器名称,以便能够很好地查看9f283d6c_c348_46b6_8f39_00148f9ddcec4_VIS_FEAT_type更改正在显示的功能的功能类型。默认的宏9f283d6c_c348_46b6_8f39_00148f9ddcec4_VIS_FEAT_TYPE text_line$(CATMAC)默认的宏可视化工具功能文件$(WORKSPACE_TEMP_DIR)/$(SAFE_FFS_NAME)。FFS默认的宏可视化工具创建空间索引否工厂定义记录工厂名称文本行记录器输入功能@#-------------------------------------------------------------------------工厂定义*工厂名称“文本行关联器”输入功能“文本行关联器”输出功能“类型”到“最终输出”路由亚搏在线器转换(FME通用,文本行)@SupplyAttributes(wb out feat类型),文本_line)35;——!=“”输出传递的功能类型*@FEATURE TYPE(@Value(@Value(@wb_out_feat_TYPE_uu))输出失败的功能类型u nuke_ume_uuu@Tcl2(“FME_StatMessage 818059{@Value(FME_template_ufeature_utype)}818060 818061 FME_warn”)。“,”----------FACTORY_DEF*TeeFactory FACTORY_uname”Final OUTPUT Nuker“输入”Type,NoKeY-Measix.------------------------------------FaseYyDeF*CeaCudioCytAutoTyAutoDead StuturyType。如果{[llength$files]==1}{设置文件{$(工作区温度目录)/};附加文件[lindex$files 0];评估FME_Execute System\173\042$(FME_HOME_UNIX)/fmeview\042/ownffs$theFile&\175;}elseif{[llength$files]==0}{catch{file delete-force{$(工作区温度目录)};}否则{设置文件noext{};foreach{fileName}$files{lappend filesnext[string trimright$fileName{.ffs}};eval FME_Execute System\173\042$(FME_HOME_UNIX)/fmeview\042/ownffs{$(WORKSPACE_TEMP_DIR)}$filesnext&\175;};};“)工厂定义*三通输入特性类型”__