8 #ifdef DtIFSPEC1516_2025
12 #include <vlutil/vlTime.h>
14 class DtNetStatsFedAmbWrapper;
23 class DtNetStatsRtiAmbImpl :
public DtRtiAmbassadorImplementor
28 DtNetStatsRtiAmbImpl( rti1516_2025::RTIambassador* topLevelAmbPtr);
37 virtual ~DtNetStatsRtiAmbImpl();
39 virtual bool netStatsEnabled()
const;
40 virtual void setNetStatsEnabled(
bool shouldEnable);
43 virtual void startTimer();
44 virtual void startTimer()
const;
64 virtual rti1516_2025::ConfigurationResult connect(
67 rti1516_2025::RtiConfiguration
const* configuration =
nullptr,
68 rti1516_2025::Credentials
const* credentials =
nullptr);
76 virtual void disconnect();
94 virtual void createFederationExecution(
95 std::wstring
const& federationName,
96 std::wstring
const& fomModule,
97 std::wstring
const& logicalTimeImplementationName = L
"");
111 virtual void createFederationExecution(
112 std::wstring
const& federationName,
113 std::vector<std::wstring>
const& fomModules,
114 std::wstring
const& logicalTimeImplementationName = L
"");
131 virtual void createFederationExecutionWithMIM(
132 std::wstring
const& federationName,
133 std::vector<std::wstring>
const& fomModules,
134 std::wstring
const& mimModule,
135 std::wstring
const& logicalTimeImplementationName = L
"");
145 virtual void destroyFederationExecution(
146 std::wstring
const& federationName);
153 virtual void listFederationExecutions();
160 virtual void listFederationExecutionMembers(std::wstring
const& federationName);
178 virtual rti1516_2025::FederateHandle joinFederationExecution(
179 std::wstring
const& federateName,
180 std::wstring
const& federateType,
181 std::wstring
const& federationExecutionName,
182 std::vector<std::wstring>
const& additionalFomModules,
183 unsigned long flags);
195 virtual void resignFederationExecution(
206 virtual void registerFederationSynchronizationPoint(
207 std::wstring
const& synchronizationPointLabel,
208 rti1516_2025::VariableLengthData
const& userSuppliedTag);
219 virtual void registerFederationSynchronizationPoint(
220 std::wstring
const& synchronizationPointLabel,
221 rti1516_2025::VariableLengthData
const& userSuppliedTag,
233 virtual void synchronizationPointAchieved(
234 std::wstring
const& synchronizationPointLabel,
235 bool successfully =
true);
245 virtual void requestFederationSave(
246 std::wstring
const& label);
259 virtual void requestFederationSave(
260 std::wstring
const& label,
261 rti1516_2025::LogicalTime
const& time);
271 virtual void federateSaveBegun();
281 virtual void federateSaveComplete();
291 virtual void federateSaveNotComplete();
300 virtual void abortFederationSave();
309 virtual void queryFederationSaveStatus();
319 virtual void requestFederationRestore(
320 std::wstring
const& label);
330 virtual void federateRestoreComplete();
340 virtual void federateRestoreNotComplete();
349 virtual void abortFederationRestore();
358 virtual void queryFederationRestoreStatus();
374 virtual void publishObjectClassAttributes(
375 rti1516_2025::ObjectClassHandle
const& objectClass,
388 virtual void unpublishObjectClass(
389 rti1516_2025::ObjectClassHandle
const& objectClass);
402 virtual void unpublishObjectClassAttributes(
403 rti1516_2025::ObjectClassHandle
const& objectClass,
415 virtual void publishInteractionClass(
416 rti1516_2025::InteractionClassHandle
const& interactionClass);
427 virtual void unpublishInteractionClass(
428 rti1516_2025::InteractionClassHandle
const& interactionClass);
440 virtual void publishObjectClassDirectedInteractions(
441 rti1516_2025::ObjectClassHandle
const& objectClass,
442 rti1516_2025::InteractionClassHandleSet
const& interactionClasses);
453 virtual void unpublishObjectClassDirectedInteractions(
454 rti1516_2025::ObjectClassHandle
const& objectClass);
466 virtual void unpublishObjectClassDirectedInteractions(
467 rti1516_2025::ObjectClassHandle
const& objectClass,
468 rti1516_2025::InteractionClassHandleSet
const& interactionClasses);
480 virtual void subscribeObjectClassAttributes(
481 rti1516_2025::ObjectClassHandle
const& objectClass,
484 std::wstring
const& updateRateDesignator = L
"");
495 virtual void unsubscribeObjectClass(
496 rti1516_2025::ObjectClassHandle
const& objectClass);
508 virtual void unsubscribeObjectClassAttributes(
509 rti1516_2025::ObjectClassHandle
const& objectClass,
522 virtual void subscribeInteractionClass(
523 rti1516_2025::InteractionClassHandle
const& interactionClass,
535 virtual void unsubscribeInteractionClass(
536 rti1516_2025::InteractionClassHandle
const& interactionClass);
548 virtual void subscribeObjectClassDirectedInteractions(
549 rti1516_2025::ObjectClassHandle
const& objectClass,
550 rti1516_2025::InteractionClassHandleSet
const& interactionClasses,
551 bool universally =
false);
562 virtual void unsubscribeObjectClassDirectedInteractions(
563 rti1516_2025::ObjectClassHandle
const& objectClass);
575 virtual void unsubscribeObjectClassDirectedInteractions(
576 rti1516_2025::ObjectClassHandle
const& objectClass,
577 rti1516_2025::InteractionClassHandleSet
const& interactionClasses);
593 virtual void reserveObjectInstanceName(
594 std::wstring
const& objectInstanceName);
605 virtual void releaseObjectInstanceName(
606 std::wstring
const& objectInstanceName);
618 virtual void reserveMultipleObjectInstanceNames(
619 std::set<std::wstring>
const& objectInstanceNames);
630 virtual void releaseMultipleObjectInstanceNames(
631 std::set<std::wstring>
const& objectInstanceNames);
643 virtual rti1516_2025::ObjectInstanceHandle registerObjectInstance(
644 rti1516_2025::ObjectClassHandle
const& objectClass);
658 virtual rti1516_2025::ObjectInstanceHandle registerObjectInstance(
659 rti1516_2025::ObjectClassHandle
const& objectClass,
660 std::wstring
const& objectInstanceName);
673 virtual void updateAttributeValues(
674 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
676 rti1516_2025::VariableLengthData
const& userSuppliedTag);
690 virtual rti1516_2025::MessageRetractionHandle updateAttributeValues(
691 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
693 rti1516_2025::VariableLengthData
const& userSuppliedTag,
694 rti1516_2025::LogicalTime
const& time);
707 virtual void sendInteraction(
708 rti1516_2025::InteractionClassHandle
const& interactionClass,
710 rti1516_2025::VariableLengthData
const& userSuppliedTag);
724 virtual rti1516_2025::MessageRetractionHandle sendInteraction(
725 rti1516_2025::InteractionClassHandle
const& interactionClass,
727 rti1516_2025::VariableLengthData
const& userSuppliedTag,
728 rti1516_2025::LogicalTime
const& time);
742 virtual void sendDirectedInteraction(
743 rti1516_2025::InteractionClassHandle
const& interactionClass,
744 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
746 rti1516_2025::VariableLengthData
const& userSuppliedTag);
761 virtual rti1516_2025::MessageRetractionHandle sendDirectedInteraction(
762 rti1516_2025::InteractionClassHandle
const& interactionClass,
763 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
765 rti1516_2025::VariableLengthData
const& userSuppliedTag,
766 rti1516_2025::LogicalTime
const& time);
778 virtual void deleteObjectInstance(
779 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
780 rti1516_2025::VariableLengthData
const& userSuppliedTag);
793 virtual rti1516_2025::MessageRetractionHandle deleteObjectInstance(
794 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
795 rti1516_2025::VariableLengthData
const& userSuppliedTag,
796 rti1516_2025::LogicalTime
const& time);
809 virtual void localDeleteObjectInstance(
810 rti1516_2025::ObjectInstanceHandle
const& objectInstance);
822 virtual void requestAttributeValueUpdate(
823 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
825 rti1516_2025::VariableLengthData
const& userSuppliedTag);
837 virtual void requestAttributeValueUpdate(
838 rti1516_2025::ObjectClassHandle
const& objectClass,
840 rti1516_2025::VariableLengthData
const& userSuppliedTag);
855 virtual void requestAttributeTransportationTypeChange(
856 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
858 rti1516_2025::TransportationTypeHandle
const& transportationType);
872 virtual void changeDefaultAttributeTransportationType(
873 rti1516_2025::ObjectClassHandle
const& objectClass,
875 rti1516_2025::TransportationTypeHandle
const& transportationType);
887 virtual void queryAttributeTransportationType(
888 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
889 rti1516_2025::AttributeHandle
const& attribute);
903 virtual void requestInteractionTransportationTypeChange(
904 rti1516_2025::InteractionClassHandle
const& interactionClass,
905 rti1516_2025::TransportationTypeHandle
const& transportationType);
916 virtual void queryInteractionTransportationType(
917 rti1516_2025::FederateHandle
const& federate,
918 rti1516_2025::InteractionClassHandle
const& interactionClass);
936 virtual void unconditionalAttributeOwnershipDivestiture(
937 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
939 rti1516_2025::VariableLengthData
const& userSuppliedTag);
953 virtual void negotiatedAttributeOwnershipDivestiture(
954 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
956 rti1516_2025::VariableLengthData
const& userSuppliedTag);
971 virtual void confirmDivestiture(
972 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
974 rti1516_2025::VariableLengthData
const& userSuppliedTag);
989 virtual void attributeOwnershipAcquisition(
990 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
992 rti1516_2025::VariableLengthData
const& userSuppliedTag);
1008 virtual void attributeOwnershipAcquisitionIfAvailable(
1009 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1011 rti1516_2025::VariableLengthData
const& userSuppliedTag);
1024 virtual void attributeOwnershipReleaseDenied(
1025 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1027 rti1516_2025::VariableLengthData
const& userSuppliedTag);
1040 virtual void attributeOwnershipDivestitureIfWanted(
1041 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1043 rti1516_2025::VariableLengthData
const& userSuppliedTag,
1058 virtual void cancelNegotiatedAttributeOwnershipDivestiture(
1059 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1074 virtual void cancelAttributeOwnershipAcquisition(
1075 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1088 virtual void queryAttributeOwnership(
1089 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1102 virtual bool isAttributeOwnedByFederate(
1103 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1104 rti1516_2025::AttributeHandle
const& attribute);
1122 virtual void enableTimeRegulation(
1123 rti1516_2025::LogicalTimeInterval
const& lookahead);
1134 virtual void disableTimeRegulation();
1147 virtual void enableTimeConstrained();
1158 virtual void disableTimeConstrained();
1173 virtual void timeAdvanceRequest(
1174 rti1516_2025::LogicalTime
const& time);
1189 virtual void timeAdvanceRequestAvailable(
1190 rti1516_2025::LogicalTime
const& time);
1205 virtual void nextMessageRequest(
1206 rti1516_2025::LogicalTime
const& time);
1221 virtual void nextMessageRequestAvailable(
1222 rti1516_2025::LogicalTime
const& time);
1237 virtual void flushQueueRequest(
1238 rti1516_2025::LogicalTime
const& time);
1249 virtual void enableAsynchronousDelivery();
1260 virtual void disableAsynchronousDelivery();
1270 virtual bool queryGALT(rti1516_2025::LogicalTime& time);
1280 virtual void queryLogicalTime(rti1516_2025::LogicalTime& time);
1290 virtual bool queryLITS(rti1516_2025::LogicalTime& time);
1303 virtual void modifyLookahead(
1304 rti1516_2025::LogicalTimeInterval
const& lookahead);
1315 virtual void queryLookahead(rti1516_2025::LogicalTimeInterval& interval);
1328 virtual void retract(
1329 rti1516_2025::MessageRetractionHandle
const& retraction);
1342 virtual void changeAttributeOrderType(
1343 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1357 virtual void changeDefaultAttributeOrderType(
1358 rti1516_2025::ObjectClassHandle
const& objectClass,
1372 virtual void changeInteractionOrderType(
1373 rti1516_2025::InteractionClassHandle
const& interactionClass,
1389 virtual rti1516_2025::RegionHandle createRegion(
1402 virtual void commitRegionModifications(
1416 virtual void deleteRegion(
1417 rti1516_2025::RegionHandle
const& region);
1434 virtual rti1516_2025::ObjectInstanceHandle registerObjectInstanceWithRegions(
1435 rti1516_2025::ObjectClassHandle
const& objectClass,
1455 virtual rti1516_2025::ObjectInstanceHandle registerObjectInstanceWithRegions(
1456 rti1516_2025::ObjectClassHandle
const& objectClass,
1458 std::wstring
const& objectInstanceName);
1473 virtual void associateRegionsForUpdates(
1474 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1489 virtual void unassociateRegionsForUpdates(
1490 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1506 virtual void subscribeObjectClassAttributesWithRegions(
1507 rti1516_2025::ObjectClassHandle
const& objectClass,
1510 std::wstring
const& updateRateDesignator = L
"");
1525 virtual void unsubscribeObjectClassAttributesWithRegions(
1526 rti1516_2025::ObjectClassHandle
const& objectClass,
1542 virtual void subscribeInteractionClassWithRegions(
1543 rti1516_2025::InteractionClassHandle
const& interactionClass,
1545 bool active =
true);
1560 virtual void unsubscribeInteractionClassWithRegions(
1561 rti1516_2025::InteractionClassHandle
const& interactionClass,
1578 virtual void sendInteractionWithRegions(
1579 rti1516_2025::InteractionClassHandle
const& interactionClass,
1582 rti1516_2025::VariableLengthData
const& userSuppliedTag);
1599 virtual rti1516_2025::MessageRetractionHandle sendInteractionWithRegions(
1600 rti1516_2025::InteractionClassHandle
const& interactionClass,
1603 rti1516_2025::VariableLengthData
const& userSuppliedTag,
1604 rti1516_2025::LogicalTime
const& time);
1619 virtual void requestAttributeValueUpdateWithRegions(
1620 rti1516_2025::ObjectClassHandle
const& objectClass,
1622 rti1516_2025::VariableLengthData
const& userSuppliedTag);
1635 virtual rti1516_2025::FederateHandle getFederateHandle(
1636 std::wstring
const& federateName);
1646 virtual std::wstring getFederateName(
1647 rti1516_2025::FederateHandle
const& federate);
1656 virtual rti1516_2025::ObjectClassHandle getObjectClassHandle(
1657 std::wstring
const& objectClassName);
1666 virtual std::wstring getObjectClassName(
1667 rti1516_2025::ObjectClassHandle
const& objectClass);
1676 virtual rti1516_2025::ObjectClassHandle getKnownObjectClassHandle(
1677 rti1516_2025::ObjectInstanceHandle
const& objectInstance);
1686 virtual rti1516_2025::ObjectInstanceHandle getObjectInstanceHandle(
1687 std::wstring
const& objectInstanceName);
1696 virtual std::wstring getObjectInstanceName(
1697 rti1516_2025::ObjectInstanceHandle
const& objectInstance);
1707 virtual rti1516_2025::AttributeHandle getAttributeHandle(
1708 rti1516_2025::ObjectClassHandle
const& objectClass,
1709 std::wstring
const& attributeName);
1720 virtual std::wstring getAttributeName(
1721 rti1516_2025::ObjectClassHandle
const& objectClass,
1722 rti1516_2025::AttributeHandle
const& attribute);
1731 virtual double getUpdateRateValue(
1732 std::wstring
const& updateRateDesignator);
1742 virtual double getUpdateRateValueForAttribute(
1743 rti1516_2025::ObjectInstanceHandle
const& objectInstance,
1744 rti1516_2025::AttributeHandle
const& attribute);
1753 virtual rti1516_2025::InteractionClassHandle getInteractionClassHandle(
1754 std::wstring
const& interactionClassName);
1763 virtual std::wstring getInteractionClassName(
1764 rti1516_2025::InteractionClassHandle
const& interactionClass);
1774 virtual rti1516_2025::ParameterHandle getParameterHandle(
1775 rti1516_2025::InteractionClassHandle
const& interactionClass,
1776 std::wstring
const& parameterName);
1787 virtual std::wstring getParameterName(
1788 rti1516_2025::InteractionClassHandle
const& interactionClass,
1789 rti1516_2025::ParameterHandle
const& parameter);
1799 std::wstring
const& orderTypeName);
1808 virtual std::wstring getOrderName(
1818 virtual rti1516_2025::TransportationTypeHandle getTransportationTypeHandle(
1819 std::wstring
const& transportationTypeName);
1828 virtual std::wstring getTransportationTypeName(
1829 rti1516_2025::TransportationTypeHandle
const& transportationType);
1839 rti1516_2025::ObjectClassHandle
const& objectClass);
1849 rti1516_2025::InteractionClassHandle
const& interactionClass);
1858 virtual rti1516_2025::DimensionHandle getDimensionHandle(
1859 std::wstring
const& dimensionName);
1868 virtual std::wstring getDimensionName(
1869 rti1516_2025::DimensionHandle
const& dimension);
1878 virtual unsigned long getDimensionUpperBound(
1879 rti1516_2025::DimensionHandle
const& dimension);
1891 rti1516_2025::RegionHandle
const& region);
1903 virtual rti1516_2025::RangeBounds getRangeBounds(
1904 rti1516_2025::RegionHandle
const& region,
1905 rti1516_2025::DimensionHandle
const& dimension);
1919 virtual void setRangeBounds(
1920 rti1516_2025::RegionHandle
const& region,
1921 rti1516_2025::DimensionHandle
const& dimension,
1922 rti1516_2025::RangeBounds
const& rangeBounds);
1931 virtual unsigned long normalizeServiceGroup(
1941 virtual unsigned long normalizeFederateHandle(
1942 rti1516_2025::FederateHandle
const& federate);
1951 virtual unsigned long normalizeObjectClassHandle(
1952 rti1516_2025::ObjectClassHandle
const& objectClass);
1961 virtual unsigned long normalizeInteractionClassHandle(
1962 rti1516_2025::InteractionClassHandle
const& interactionClass);
1971 virtual unsigned long normalizeObjectInstanceHandle(
1972 rti1516_2025::ObjectInstanceHandle
const& objectInstance);
1982 virtual bool getObjectClassRelevanceAdvisorySwitch()
const;
1992 virtual void setObjectClassRelevanceAdvisorySwitch(
bool switchValue);
2002 virtual bool getAttributeRelevanceAdvisorySwitch()
const;
2012 virtual void setAttributeRelevanceAdvisorySwitch(
bool switchValue);
2022 virtual bool getAttributeScopeAdvisorySwitch()
const;
2032 virtual void setAttributeScopeAdvisorySwitch(
bool switchValue);
2042 virtual bool getInteractionRelevanceAdvisorySwitch()
const;
2052 virtual void setInteractionRelevanceAdvisorySwitch(
bool switchValue);
2062 virtual bool getConveyRegionDesignatorSetsSwitch()
const;
2072 virtual void setConveyRegionDesignatorSetsSwitch(
bool switchValue);
2093 virtual void setAutomaticResignDirective(
2104 virtual bool getServiceReportingSwitch()
const;
2115 virtual void setServiceReportingSwitch(
bool switchValue);
2125 virtual bool getExceptionReportingSwitch()
const;
2135 virtual void setExceptionReportingSwitch(
bool switchValue);
2145 virtual bool getSendServiceReportsToFileSwitch()
const;
2155 virtual void setSendServiceReportsToFileSwitch(
bool switchValue);
2165 virtual bool getAutoProvideSwitch()
const;
2175 virtual bool getDelaySubscriptionEvaluationSwitch()
const;
2185 virtual bool getAdvisoriesUseKnownClassSwitch()
const;
2195 virtual bool getAllowRelaxedDDMSwitch()
const;
2205 virtual bool getNonRegulatedGrantSwitch()
const;
2212 virtual bool evokeCallback(
2213 double approximateMinimumTimeInSeconds,
2214 bool unlockWhileWaiting =
false);
2221 virtual bool evokeMultipleCallbacks(
2222 double approximateMinimumTimeInSeconds,
2223 double approximateMaximumTimeInSeconds,
2224 bool unlockWhileWaiting =
false);
2232 virtual void enableCallbacks();
2240 virtual void disableCallbacks();
2245 virtual DtRtiApiUniquePtr<rti1516_2025::LogicalTimeFactory> getTimeFactory()
const;
2248 virtual rti1516_2025::FederateHandle decodeFederateHandle(
2249 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2251 virtual rti1516_2025::ObjectClassHandle decodeObjectClassHandle(
2252 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2254 virtual rti1516_2025::InteractionClassHandle decodeInteractionClassHandle(
2255 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2257 virtual rti1516_2025::ObjectInstanceHandle decodeObjectInstanceHandle(
2258 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2260 virtual rti1516_2025::AttributeHandle decodeAttributeHandle(
2261 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2263 virtual rti1516_2025::ParameterHandle decodeParameterHandle(
2264 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2266 virtual rti1516_2025::DimensionHandle decodeDimensionHandle(
2267 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2269 virtual rti1516_2025::MessageRetractionHandle decodeMessageRetractionHandle(
2270 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2272 virtual rti1516_2025::RegionHandle decodeRegionHandle(
2273 rti1516_2025::VariableLengthData
const& encodedValue)
const;
2278 static DtRtiAmbassadorImplementor* create(rti1516_2025::RTIambassador* topLevelAmbPtr);
2283 virtual void clearManagers();
2288 DtNetStatsFedAmbWrapper* myStatisticsFedAmb;
2289 const DtString myStatisticsFedAmbName;
2295 MAKRti::DtClock myTimer;
2300 bool myNetStatsEnabled;
2304 #endif // DtIFSPEC1516_2025
OrderType
Definition: datatypes.pb.h:472
std::set< AttributeHandle > AttributeHandleSet
Definition: Typedefs.h:35
Definition: netStatsMonitor.h:33
ServiceGroup
Definition: datatypes.pb.h:497
CallbackModel
Definition: datatypes.pb.h:280
std::set< RegionHandle > RegionHandleSet
Definition: Typedefs.h:39
std::vector< AttributeHandleSetRegionHandleSetPair > AttributeHandleSetRegionHandleSetPairVector
Definition: Typedefs.h:57
An abstract base class which must be implemented, and used by a federate.
DtRtiAmbAPIType
Definition: rtiAmbAPITypes.h:12
ResignAction
Definition: datatypes.pb.h:305
std::map< AttributeHandle, VariableLengthData > AttributeHandleValueMap
Definition: Typedefs.h:44
std::set< FederateHandle > FederateHandleSet
Definition: Typedefs.h:37
std::set< DimensionHandle > DimensionHandleSet
Definition: Typedefs.h:38
std::map< ParameterHandle, VariableLengthData > ParameterHandleValueMap
Definition: Typedefs.h:49