Jump to content
We've recently updated our Privacy Statement, available here. ×
  • Spotfire® Developer - Summary of New and Changed Features


    This article summarizes all new, changed, deprecated or removed APIs and related features in all versions since Spotfire® 7.11 LTS.

    Introduction

    Read more about all the Spotfire APIs and customization options in Extending Spotfire®.

    Note that this article only covers changes made to the public APIs and SDK. Your use of any internal APIs or other internal implementation details is entirely at your own discretion and is not supported or warranted by Spotfire. For text area customizations, see Best Practices for Writing Custom JavaScript Code in Text Areas.

    New Features

    Disable prompts for column matches (12.1)

    It is now possible with the API to disable prompts for matching columns when data has been replaced. This can be specified for each data table.

    API reference:

    Data function categories and icons (12.1)

    It is now possible with the API to set categories for data functions, which will affect how they will be presented (icon, keywords) in the f(x) panel. The API also allows for setting custom icons.

    API reference:

    CustomDataSource load behavior

    It is now possible to specify that a CustomFileDataSource should always be loaded on the application thread. This is useful in cases where parallel loading in background processes may cause problems with custom data sources. Supported since 10.10 for CustomDataSource.

    API reference:

    Scripts in text areas (12.0)

    This new API capability allows an IronPython script or a C# extension to add new scripts to text areas and to modify or delete existing scripts. This is useful when you want to automate the creation and update of analysis files.

    API reference:

    Horizontal & positionable legends (12.0)

    It is now possible with the API to configure the legend of a visualization to display Color by, Shape by and Series by legend items horizontally, above or below the visualizations, aligned left, right or centered.

    API reference:

    Linear regression fit parameters in data relationships calculations (12.0)

    It is now possible with the API for data relationships calculations to configure fit parameters (Slope, Intercept) when using linear regression as the comparison method. The slope indicates the steepness of a line and the intercept indicates the location where it intersects an axis.

    API reference:

    Geometry simplification setting in map charts (12.0)

    It is now possible to use the API to change the geometry simplification setting in map charts.

    API reference:

    Zoom interpolation in map chart image layers (11.7)

    It is now possible with the API to configure an image in a map chart to keep sharp edges when upscaling the image, to avoid image blurring. This makes it possible to better inspect irregularities within pictures taken by image sensors, such as clusters of defective pixels.

    API reference:

    Hide Menus from Toolbar in a Web Player mashup (11.6)

    It is now possible to hide all the menus from the toolbar as a configuration option when showing a Spotfire analysis in a web page using the JavaScript API or parameterized URL. This is useful when you want to keep the toolbar to provide, for example, the filter and bookmark shortcuts to the end users, but not expose the Spotfire environment like Spotfire Library or My Accounts.

    hide-menus_1.thumb.png.90e198abedda60bdaa111623984be2b9.png

     

    Actionable notifications (11.5)

    The Spotfire notification service API now supports defining actions and callback functions. This means that it is possible to build analytic applications that use the notification service to notify the user about something and to offer the user clickable choices of actions. This new API addition can be called from IronPython scripts and C# extensions and can be used, for example, for custom recommendations.

    actinionablenotificationsdev_0.thumb.png.96d139f1a8d8920070e02d0e1570fb58.png

    The screenshot above shows a custom recommendation including an action, "Review". If the user clicks Review, a callback function is called which can perform actions such as navigating to another page, creating new pages or visualizations, or other operations supported by the Spotfire automation API.

    Here is a basic code snippet in IronPython:

    from Spotfire.Dxp.Framework.ApplicationModel import NotificationService, NotificationAction
    
    def createActionClosure():
       doc = Document
       def callback():
          doc.ActivePageReference = doc.Pages[2]
       return callback
    
    if Document.Properties['insightSummary'] != "None":
       NS = Application.GetService[NotificationService]()
       action = NotificationAction.Create("Review","Review inventory forecast", True,createActionClosure())
       NS.AddInformationNotificationWithActions(Document.Properties['insightSummary'], Document.Properties['insightDescription'], Document.Properties['insightDetail'],action)
    
     

    API reference: NotificationAction, NotificationService

    Standard tooltip configuration for visualization mods (11.5)

    standardtooltip.thumb.png.7d08f4ec88265655a7434c59546e1b88.png

    With a new API addition, it is now possible to have the tooltip of a visualization mod be configured using the standard tooltip panel with the same capabilities as for native visualizations, such as selecting what values to display and in what format (text, image or custom rendered).

    This enables analysts and business users to control what detailed information is displayed when highlighting items in a visualization mod, in a way that is most relevant for their use cases.

    With just a few lines of code, mod developers can now take advantage of using the standard tooltip configuration option in their mods.

    In mod-manifest.json:

     "dataViewDefinition": {
         "tooltip": { "enabled": true },
     

    In JavaScript:

     mod.controls.tooltip.show(row);
     

    API reference: Tooltip.show

    The previous tooltip API is still supported.

    Export marked data from visualization mods (11.5)

    exportdata.thumb.png.9454bbcb693d0b7276ae8be246b338e5.png

    Exporting marked data is now also supported for visualization mods. With the Export > Data to file ... menu option in the Analyst client, the user can download a tab-separated file containing the tooltip information for all marked items of any visualization mod on the current page. The export data functionality is automatically available for all existing visualization mods.

    If the standard tooltip configuration option has been enabled in the visualization mod's manifest (new in 11.5), the user can use the tooltip configuration panel to configure what values to export for each marked item. If not, the default configuration will be used.

    Improved heuristics for visualization mod axes (11.5)

    In 11.5, we have improved the heuristics for which default expressions are assigned to the axes of a visualization mod. This gives better default configurations for visualization mods in general and avoids invalid expressions. The improved heuristics works out of the box for all existing mods, and the mod developer can control this even further with the option to set allowed data types for each axis.

    Improved performance for Visualization Mods (11.4)

    The performance of visualization mods has been significantly improved. The transfer of data (rows and hierarchies) is now at least 2x faster for large data views and on par with the performance of native visualizations. Also, interactions are much more responsive with faster cancellation of obsolete API calls, for example, when undoing an operation or performing a new marking or filtering operation before the previous one has been completely processed.

    Viewing/Editing mode of an analysis (11.4)

    It is now possible to call the API to find out whether an analysis is currently in viewing or editing mode. This makes it possible for the developer to adapt custom UIs to show or hide authoring capabilities depending on the mode, and achieve the same behavior as native UIs, such as axis selectors, icons in visualization title bars, and panels.

    This API addition applies to the Mods API v1.2, the C# Custom Visualization API, and the JavaScript API for mashups, and works for installed Spotfire clients as well as web clients.

    All library item types available in library search (11.4)

    You can now search for and retrieve any item type in the library when using the LibraryManager.SearchLibraryManager.TryGetItem(GUID) or LibraryItem.TryGetItem(path) methods..

    The following types have been added to the LibraryItemType class:

    DataSource, ConnectionDataSource, DataConnection, Column, Filter, Join, Procedure, AnalysisState, Bookmark, Mod

    Mods developers on TIBCO Cloud Spotfire can sign mods using their own CA certificate (11.3)

    Mods developers on TIBCO Cloud Spotfire can download the Spotfire Package Builder from Library > Resources > Downloads to sign visualization mods with their own CA certificate. See Signing a visualization mod using Package Builder.

    Spotfire Mods API 1.1 (11.3)

    The Spotfire Mods API 1.1 is a minor update to the API and includes the following new features:

    • The ability to cancel a Reader, which allows you to start and cancel subscriptions for more dynamic functionality.
    • ID property on Page objects, more robust than index and name.
    • Enabled state for radio buttons.
    • New leafNode method on DataViewRow objects, which makes it easier to handle data from a categorical axis without having to check for empty expression.
    • New elementId method on DataViewRow objects, which gives you stable row identifiers that can be used to identify visual elements in different data views.

    All the new features are non-breaking, and existing mods Spotfire Mods API 1.0 will continue to work in Spotfire 11.3.

    Open .mod files in web clients using drag and drop (11.3)

    It is now possible to open a visualization mod by dragging the .mod file to an open analysis in the Spotfire web client. In earlier versions this was supported only in the installed clients.

    Added support for the JavaScript Mashup API in editing mode (11.3)

    It is now possible to use the JavaScript API also when the Spotfire analysis is in editing mode, enabling authoring of an analysis in a mashup context.

    Remove all and none from filters (11.2)

    The new capability to remove (All) and/or (None) options on the item-, list box- and radio button filters is also accompanied with an addition to the C# API that allows you to automate this functionality in IronPython scripts and C# extensions.

    Color cross table cells by other columns (11.2)

    The new capability to color cross table cells by values and custom expressions of other columns is also accompanied with an addition to the C# API that allows you to automate this functionality in IronPython scripts and C# extensions.

    JavaScript API authenticates silently when possible (11.1)

    If the Spotfire Server is configured for OpenID Connect authentication, then the API automatically tries to authenticate users without requiring user interaction, as was previously only supported for NTLM, Kerberos or X.509 Client Certificate authentication.

    Customize the welcome page (11.0)

    The white-labeling mechanism of Spotfire (also known as co-branding) has been extended so that the Spotfire welcome page content can be replaced by custom content such as graphics, text and links. This extends the possibility to brand Spotfire as a domain or organization-specific analytics tool. The content of the custom welcome page is provided through a custom HTML file, and it is possible to insert images, text and links. In addition, it is now possible to change the side image in the "splash screen" shown when starting the installed Spotfire client.

    Visualization Mods (11.0)

    Spotfire 11.0 provides the much awaited Spotfire Mods, a new lightweight cloud-ready framework for building new interactive visualization types, called visualization mods, that can be used in Spotfire like any other visualization. By connecting mods to any Spotfire data source and integrating with data science and other built-in Spotfire capabilities, you can create highly customized analytics applications directly within the Spotfire environment.

    Visualize labels from columns in the secondary table (10.10 LTS)

    It is now possible to show labels in a plot from columns in secondary data tables. This means for example that its possible to visualize data grouped by an id column, but instead of technical id:s, show the labels in the visualization as a more human-friendly name (which is only present in a secondary table).

    Custom top-level menus (10.10 LTS)

    You can now use the C# API to add new top-level menus for your custom application and document tools. A custom top-level menu can also contain sub-menus for a more fine-grained arrangement.

    This is especially useful when using Spotfire as a platform to build analytic applications. Since custom tools are often the most used tools for users of an analytic application, having direct access to them in a top-level menu makes the analytic application easier to use. In addition to the existing custom toolbar, co-branding, and white-labeling capabilities, the top-level menus feature provides an extra option for customizing Spotfire.

    Custom Export Tool with the current theme (10.10 LTS)

    With this release, it is possible to have a Custom Export Tool to follow the current theme that is used in the analysis, in addition to using the Spotfire light theme (default). This affects not only colors but also layout, such as font sizes, etc.

    Custom Data Source on application thread (10.10 LTS)

    Spotfire now performs data loading in background processes that run in parallel. This may sometime cause problems with custom data sources. To avoid those problems, a new property AlwaysLoadOnApplicationThread has been introduced to the CustomDataSource class. This can be overridden to signal that the data source should always be loaded on the application thread.

    Configure dual shared scales (10.9)

    The C# API now allows configuring a visualization with dual scales. 

    • API reference: Scale.class (IndexedScaleLabelLayout, IndexedLabelOrientation, IndexedShowLabel, IndexedMaximunNumberOfTicks, IndexedShowGridLines)

    Add Python data function (10.9)

    The C# API now allows for creating a data function based on a Python script.

    Digital signing using local certificate stores (10.9)

    The Spotfire Package Builder console app now supports the digital signing of cab files using a certificate in a local certificate store. This comes with the benefit of not having to provide a password on the command line. See Developer Documentation.

    Create data functions without approval stamp (10.8)

    The default behavior when creating a data function with the Spot?re C# API is to have an approval (trust) stamp set for the current user. The API now allows for inspecting the approval stamp of a data function, and for creating a copy that is not automatically approved by the current user.

    Custom map chart projection (10.8)

    The C# API now allows for defining a custom projection to use with the map chart. This type of projection can be generated from imported GeoTIFF image files, from imported Shape files, or, they can be added by users. See example.

    Data transformations on data sources (10.8)

    The C# API now allows for getting and setting data transformations performed on the result of an imported data connection data source. Read more here.

    Set legacy limit by marking behavior (10.8)

    To allow for compatibility for applications that require the legacy limit by marking behavior there is now a C# API that allows for configuring whether visualizations should use the behavior of versions 10.7 and prior,  or the new behavior introduced in this release when limited by their own marking.

    Identifier for custom tools (10.8)

    You can now specify an identifier to your custom tool to be used in the  ToolbarShortcuts preference when adding the tool to the toolbar.

    Show or hide pages for consumer users (10.7)

    The Spotfire C# API now allows you to programmatically, from a custom extension or script, inspect and change the visibility of a page in Viewing mode. This means that pages can be shown or hidden from consumer users dependent on the context in which the analysis is opened, for example, who the logged-in user is, or what the screen resolution of the client device is.

    Uniquely identify visualizations in integration tests (10.7)

    It is now possible to identify Spotfire visualizations in the HTML DOM in a unique and persistent way. This is useful when creating integration tests in Selenium (or similar testing frameworks) and having them run in a predictable fashion. Read more here.

    Access user information (10.4)

    This addition to the C# API allows IronPython scripts or C# extensions to access user name, domain, group/role membership and other relevant information about the current user.

    Calling the REST and SOAP APIs on behalf of end users (10.3)

    It is now possible to use an OAuth2 Authorization Code Grant flow with the Spotfire Server REST and SOAP APIs to make the API calls on behalf of end users.

    Expand or collapse the layer handler widget in a map chart (10.3)

    It is now possible to use the Spotfire C# API to get and set the state (expanded or collapsed) of the layer handler widget in a map chart. See MapChart.LayerHandlerState.

    Improved API to reload data tables (10.3)

    The Spotfire C# API to reload data tables in analysis has been redesigned for improved ease of use and robustness. For details, See the Deprecated and Removed Features section below.

    Library API for SBDF file upload (10.2)

    The new Library REST API lets external applications upload SBDF formatted data to the Spotfire library.

    Column header height in the graphical table (10.2)

    It is now possible to use the Spotfire C# API to configure the number of lines of text in the column header in a graphical table. See GraphicalTable.ColumnHeaderLineCount.

    Export data as comma-separated files (10.2)

    The Spotfire C# API for exporting data files now supports .csv formats with values separated by commas or semicolons, in addition to tab-separated files. See DataWriterTypeIdentifiers and TablePlot.ExportData.

    Reload linked and/or stored data sources (10.1)

    You can now reload individual data sources via the Spotfire C# API. This is useful, for example, when you want to add custom reload buttons in a text area to be used by Spotfire Consumer web client users. See DataOperation.Reload and  Data Table Source View API.

    Allow for empty values in custom row methods (10.1)

    The Spotfire C# API now allows for empty values to be propagated to custom row method implementations. Empty values may, in many cases, have special meaning, and with this API addition, those cases can now be handled in a custom row method. See CustomDataMethods.CustomRowMethod.

    Configure the AutoCreateFilters property on a data table (10.1)

    It is now possible, via the Spotfire C# API, to configure the AutoCreateFilters property on a data table. By setting the property to false (default is true) users get to manage filters manually, and they can decide whether they want to create filters for certain columns or not.

    See:

    Rename, copy and move items in the library (10.1)

    The Spotfire C# API has been extended with additional Spotfire library management operations that make it possible to rename, copy, move and set metadata (description, keywords, and properties) on library items. The operations can be called from custom extensions or from IronPython scripts. See LibraryManager.

    Lookup Automation Services jobs via the API (10.1)

    It is now possible to use the Spotfire C# API to browse for Automation Services jobs stored in the Spotfire library. This can be done directly from the LibraryManager class or using the LibraryBrowserDialog UI.

    New runtime parameters for custom tasks in Automation Services (10.1)

    The Automation Services API now provides the following runtime parameters for custom tasks:

    • Information about which context a job is executed in, on the server or locally in the client. This enables custom tasks to execute differently depending on the context.
    • File path to running job.

    See TaskExecutionContext.

    Updated Java User Directory API (10.1)

    A new version of the Java User Directory API is released, which is easier to use and has extended functionality. The following capabilities have been added to the API, giving it the same options as the User Directory web service:

    • Set display name and email address when creating users and groups.
    • Update display name and email address for a user or group.
    • Improved search for users and groups.
    • Enable/disable a user.
    • Lock/unlock a user.

    New Filter Rows Transformation (10.1)

    The Spotfire C# API now exposes FilterRowsTransformation, a transformation type that is used to filter out rows that do not match the given expression. In addition, the more generic ExpressionTransformation now includes a where clause property. This API is useful when you want to add transformations to a data table using IronPython scripts or custom extensions.

    Preferred aggregation method (10.0)

    The Spotfire C# API allows for getting or setting the preferred aggregation method to be used by plot heuristics when creating aggregated expressions from a data column. See DataColumn.PreferredAggreationMethod and VisualizationPreferences.PreferredAggregationMethodForNumericColumns.

    Default layers for map chart (10.0)

    The Spotfire C# API now allows for loading the default layer, for example base map layer, TMS layer, or feature layer, when configuring a map chart. See MapChart.AutoConfigureLayers.

    JavaScript API: New authentication mechanism support external/web authentication (7.14)

    It is now possible to use the JavaScript API on a Spotfire Server that is configured with any external/web authentication mechanism. For example, you can now create mashups that uses .dxp files on TIBCO Cloud Spotfire.

    Insert data operations (7.14)

    Using the Data Table Source View API it is now possible to add data operations (AddRowsOperation, AddColumnsOperation and DataTransformationOperation) to any location within the data table structure (SourceView).

    REST API to run Automation Services jobs (7.13)

    It is now possible to trigger the execution of Automation Services jobs from an external application using the Automation Services REST API. A job can either be stored in the Spotfire Library or passed as an argument. The API uses an OAuth2 based authentication/authorization mechanism.

    OAuth2 based authentication for the Web Service (SOAP) API (7.13)

    The SOAP Web Services API now uses an OAuth2-based authentication/authorization mechanism. This means that the API client only needs to support a single authentication method that will work with any Spotfire Server authentication configuration.

    Simplified workflow for building Spotfire C# extensions (7.13)

    With this release comes an updated and simplified procedure for building C# extensions for Spotfire. The package building functionality is now integrated with Visual Studio®. Templates are provided so that the configuration needed for a third-party developer is kept to a minimum. See Developer Documentation.

    Spotfire distribution files (7.13)

    With this release, it is possible to ship a bundled solution, containing several Spotfire packages, as a single distribution file (.sdn). See Package Builder console parameter reference.

    Export to PDF with the Spotfire C# API (7.12)

    A prepared PDF report can be exported with the Spotfire C# API, which makes it possible to include exporting of PDF reports in custom workflows with C# extensions or IronPython scripts. Use Report.ExportToPdf(Stream) or Report.ExportToPdf(String) to export a PDF from the analysis. Enumerate reports using the Document.GetReports() method.

    Export to PDF with the Spotfire JavaScript API (7.12)

    A prepared PDF report can be exported with the Spotfire JavaScript API, so that you can take advantage of the PDF reporting capabilities of Spotfire in a web mashup environment.

    In addition, there is an option in the JavaScript API to launch a dialog for exporting to PDF without having a prepared report. This option now has the same capabilities as when using the Spotfire clients:

    • The dialog provides a preview.
    • The exported visualizations use the visual theme in the analysis.
    • The exported PDF is of a higher graphical quality.

    Use Document.getReports() to enumerate existing reports and Document.exportReport() to export a report to PDF. Use Document.exportToPdf() to launch the export to PDF wizard.

    Render pages and visualizations to PNG images (7.12)

    The Spotfire C# API has new capabilities when rendering pages and visualizations. The resulting PNG images use the visual theme, and the API includes settings to adjust the resolution as well as the visibility of visual attributes, such as annotations, axis labels, legend and title. This API is useful when creating export tools to support customized layouts or output formats. See Visual.RenderAsync() and Page.RenderAsync().

    Remove data operation (7.12)

    The Data Table Source View API now lets you remove individual data sources or other operations, such as add columns operations or add rows operations.

    Maximize a visualization (7.12)

    The Spotfire C# API now supports the ability to temporarily maximize a visualization, and then return to the previous page layout again.

    Set WMS layer username and password (7.12)

    The Spotfire C# API now supports configuring a WMS layer with a username and password.

     

    Changes in Functionality

    Updated log4net.dll (11.7)

    The log4net.dll has been upgraded from 2.0.12 to 2.0.13

     

    Deprecated and Removed Features

    AngularJS-based API for custom login pages (11.7)

    The AngularJS-based API for custom login pages has been removed. A new API with the same capabilities is now provided as part of the Cobranding feature. The API is written in regular JavaScript, not in AngularJS. This means that using the new API does not require knowledge about a specific front-end framework and it is not subject to framework-breaking changes.

    WebRequestFactory.CreateSpotfireWebRequest (11.7)

    The API to create requests to the server APIs , WebRequestFactory.CreateSpotfireWebRequest(), has been deprecated in this release. All requests to the server should be made using the standard APIs WebRequest.CreateHttp or WebRequest.CreateDefault instead. Authentication and authorization to the server APIs is done using OAuth2 and registered API client credentials. See the following documentation for more information:

    Deprecated since Spotfire 10.10.0.

    jQueryUI removed from Spotfire (11.5)

    The jQueryUI JavaScript library is now removed from the Spotfire distribution.

    See how to include your own instances of jQuery and jQuery UI in Text areas. Also, see best practices for writing custom JavaScript code in Text areas for additional information on using JavaScript code with Spotfire products.

    Legacy SOAP Web Service API

    The legacy SOAP Web Service API has been removed in 10.3. It is replaced by the OAuth 2.0 based SOAP Web Service API (introduced in 7.13). Instructions on how to migrate existing solutions can be found here.

    The API User and Impersonator groups are no longer created during a fresh installation. On upgraded systems they remain but are renamed to "API User (obsolete)" and "Impersonator (obsolete)". They can be removed at will.

    DataTable.Refresh and related methods

    The following methods and properties in the C# API have been marked as obsolete (from 10.3)  and will be removed in a future release: DataTable.Refresh, DataTable.IsRefreshable, DataTableCollection.Refresh, DataTableCollection.RefreshAll() andDataTableCollection.RefreshAsync().

    Alternative methods are provided: DataTable.ReloadAllDataDataTable.ReloadLinkedDataDataTable.RefreshOnDemandData and corresponding methods in DataTableCollection.

    Visual.Render and VisualContext.Render

    The Visual.Render() and VisualContext.Render() methods in the C# API has been marked as obsolete and will be removed in a future release. Use Visual.RenderAsync() instead.

    Java User Directory API

    The existing Java User Directory API (com.spotfire.server.userdir) is deprecated (from 10.1) and will be removed in a future version. That API has been replaced by the new user directory API (com.spotfire.server.api.userdir.UserDirectory).

    Java Information Services API

    The following functions in the Information Services API are deprecated (from 10.1), and will not be available in a future version:

    • MetadataItem.isTerminal(). Use attributes instead
    • Public constructor MetadataItem(String, String). Use MetadataItem.Create(string, string) instead.
    • Public constructor MetadataItem(String, String, boolean). Use MetadataItem.Create(string, string) instead.

    The following Java functions in the Information Services API have been removed (10.1):

    • MetadataItem.fromXML(Element)
    • MetadataItem.ToXML(Element)
    • JDBCTypeSettings.convertToExternal()
    • JDBCTypeSettings.formatXML(Element)
    • JDBCTypeSettings.parseXML(Element)
    • JDBCContext.resolveTable(SourceTable)

    Document.Export(PDFExportSettings)

    The Document.Export(PDFExportSettings) in the C# API has been marked as obsolete (from 7.12) and will be removed in a future release. Use Report.ExportToPdf(Stream) or Report.ExportToPdf(String) to export a PDF from the analysis.  Enumerate reports using the Document.GetReports() method.

     

    Closed Issues

    Version Key   Summary

     7.13

     TS-51841

     Only the first cursor got the correct formatting when using the API method DataValueCursor.CreateFormatted in a script.

     10.0

     TS-49943

     PDF export did not take custom visualization area size into account.

     10.0

     TS-56737

     'Maximize Visualization' did not exist in the toolbar of a custom visualization.

     10.0

     TS-57015

     Spotfire closed unexpectedly when loading document with a custom extension. Issues were due to illegal object to be deserialized.

     10.2 HF-001 

     TS-59319

     There were occasional script errors in an analysis using compatibility versions of jQuery and jQuery UI.

     10.3

     TSDK-654

     There was no "MyExtensions" folder in the downloaded SDK folder.

     11.7

     TS-67943

     The code that updates status of menus and toolbars runs too often, calling the IsVisibleCore and

     IsEnabledCore methods of tools many times per second.

     

     


    User Feedback

    Recommended Comments

    There are no comments to display.


×
×
  • Create New...