node-switchbot 4.0.0-beta.1 → 4.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/devices/base.d.ts +59 -5
  2. package/dist/devices/base.d.ts.map +1 -1
  3. package/dist/devices/base.js +280 -28
  4. package/dist/devices/base.js.map +1 -1
  5. package/dist/settings.d.ts +6 -0
  6. package/dist/settings.d.ts.map +1 -1
  7. package/dist/settings.js +6 -0
  8. package/dist/settings.js.map +1 -1
  9. package/dist/switchbot.d.ts.map +1 -1
  10. package/dist/switchbot.js +14 -0
  11. package/dist/switchbot.js.map +1 -1
  12. package/dist/types/index.d.ts +12 -0
  13. package/dist/types/index.d.ts.map +1 -1
  14. package/dist/types/index.js.map +1 -1
  15. package/dist/utils/circuit-breaker.d.ts +98 -0
  16. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  17. package/dist/utils/circuit-breaker.js +187 -0
  18. package/dist/utils/circuit-breaker.js.map +1 -0
  19. package/dist/utils/connection-tracker.d.ts +66 -0
  20. package/dist/utils/connection-tracker.d.ts.map +1 -0
  21. package/dist/utils/connection-tracker.js +184 -0
  22. package/dist/utils/connection-tracker.js.map +1 -0
  23. package/dist/utils/fallback-handler.d.ts +68 -0
  24. package/dist/utils/fallback-handler.d.ts.map +1 -0
  25. package/dist/utils/fallback-handler.js +131 -0
  26. package/dist/utils/fallback-handler.js.map +1 -0
  27. package/dist/utils/index.d.ts +4 -0
  28. package/dist/utils/index.d.ts.map +1 -1
  29. package/dist/utils/index.js +5 -0
  30. package/dist/utils/index.js.map +1 -1
  31. package/dist/utils/retry.d.ts +55 -0
  32. package/dist/utils/retry.d.ts.map +1 -0
  33. package/dist/utils/retry.js +95 -0
  34. package/dist/utils/retry.js.map +1 -0
  35. package/docs/assets/hierarchy.js +1 -1
  36. package/docs/assets/search.js +1 -1
  37. package/docs/classes/APIError.html +2 -2
  38. package/docs/classes/APINotAvailableError.html +2 -2
  39. package/docs/classes/BLEConnection.html +9 -9
  40. package/docs/classes/BLENotAvailableError.html +2 -2
  41. package/docs/classes/BLEScanner.html +8 -8
  42. package/docs/classes/CommandFailedError.html +2 -2
  43. package/docs/classes/ConnectionTimeoutError.html +2 -2
  44. package/docs/classes/DeviceManager.html +13 -13
  45. package/docs/classes/DeviceNotFoundError.html +2 -2
  46. package/docs/classes/DiscoveryError.html +2 -2
  47. package/docs/classes/OpenAPIClient.html +24 -24
  48. package/docs/classes/SwitchBot.html +11 -11
  49. package/docs/classes/SwitchBotDevice.html +33 -15
  50. package/docs/classes/SwitchBotError.html +2 -2
  51. package/docs/classes/ValidationError.html +2 -2
  52. package/docs/classes/WoAirPurifier.html +36 -18
  53. package/docs/classes/WoAirPurifierTable.html +36 -18
  54. package/docs/classes/WoBlindTilt.html +38 -20
  55. package/docs/classes/WoBulb.html +37 -19
  56. package/docs/classes/WoCeilingLight.html +37 -19
  57. package/docs/classes/WoContact.html +32 -14
  58. package/docs/classes/WoCurtain.html +36 -18
  59. package/docs/classes/WoHand.html +35 -17
  60. package/docs/classes/WoHub2.html +32 -14
  61. package/docs/classes/WoHub3.html +32 -14
  62. package/docs/classes/WoHumi.html +36 -18
  63. package/docs/classes/WoHumi2.html +36 -18
  64. package/docs/classes/WoIOSensorTH.html +32 -14
  65. package/docs/classes/WoKeypad.html +32 -14
  66. package/docs/classes/WoLeak.html +32 -14
  67. package/docs/classes/WoPlugMiniJP.html +35 -17
  68. package/docs/classes/WoPlugMiniUS.html +35 -17
  69. package/docs/classes/WoPresence.html +32 -14
  70. package/docs/classes/WoRelaySwitch1.html +35 -17
  71. package/docs/classes/WoRelaySwitch1PM.html +35 -17
  72. package/docs/classes/WoRemote.html +32 -14
  73. package/docs/classes/WoSensorTH.html +32 -14
  74. package/docs/classes/WoSensorTHPlus.html +32 -14
  75. package/docs/classes/WoSensorTHPro.html +32 -14
  76. package/docs/classes/WoSensorTHProCO2.html +32 -14
  77. package/docs/classes/WoSmartLock.html +34 -16
  78. package/docs/classes/WoSmartLockPro.html +35 -17
  79. package/docs/classes/WoStrip.html +37 -19
  80. package/docs/enums/LogLevel.html +2 -2
  81. package/docs/enums/SwitchBotBLEModel.html +2 -2
  82. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  83. package/docs/functions/updateBaseURL.html +1 -1
  84. package/docs/hierarchy.html +1 -1
  85. package/docs/interfaces/APICommandRequest.html +2 -2
  86. package/docs/interfaces/APICommandResponse.html +2 -2
  87. package/docs/interfaces/APIDevice.html +2 -2
  88. package/docs/interfaces/APIDeviceStatus.html +2 -2
  89. package/docs/interfaces/APIErrorResponse.html +2 -2
  90. package/docs/interfaces/APIResponse.html +2 -2
  91. package/docs/interfaces/AirPurifierCommands.html +2 -2
  92. package/docs/interfaces/AirPurifierServiceData.html +5 -5
  93. package/docs/interfaces/AirPurifierStatus.html +7 -7
  94. package/docs/interfaces/BLEAdvertisement.html +2 -2
  95. package/docs/interfaces/BLEScanOptions.html +5 -5
  96. package/docs/interfaces/BLEServiceData.html +5 -5
  97. package/docs/interfaces/BlindTiltCommands.html +2 -2
  98. package/docs/interfaces/BlindTiltServiceData.html +5 -5
  99. package/docs/interfaces/BlindTiltStatus.html +6 -6
  100. package/docs/interfaces/BotCommands.html +2 -2
  101. package/docs/interfaces/BotServiceData.html +5 -5
  102. package/docs/interfaces/BotStatus.html +6 -6
  103. package/docs/interfaces/BulbCommands.html +2 -2
  104. package/docs/interfaces/BulbServiceData.html +5 -5
  105. package/docs/interfaces/BulbStatus.html +6 -6
  106. package/docs/interfaces/CeilingLightCommands.html +2 -2
  107. package/docs/interfaces/CeilingLightServiceData.html +5 -5
  108. package/docs/interfaces/CeilingLightStatus.html +6 -6
  109. package/docs/interfaces/CommandResult.html +6 -6
  110. package/docs/interfaces/ContactServiceData.html +5 -5
  111. package/docs/interfaces/ContactStatus.html +6 -6
  112. package/docs/interfaces/CurtainCommands.html +2 -2
  113. package/docs/interfaces/CurtainServiceData.html +5 -5
  114. package/docs/interfaces/CurtainStatus.html +6 -6
  115. package/docs/interfaces/DeviceInfo.html +13 -13
  116. package/docs/interfaces/DeviceListResponse.html +2 -2
  117. package/docs/interfaces/DeviceStatus.html +6 -6
  118. package/docs/interfaces/DiscoveryOptions.html +7 -7
  119. package/docs/interfaces/HubServiceData.html +5 -5
  120. package/docs/interfaces/HubStatus.html +6 -6
  121. package/docs/interfaces/HumidifierCommands.html +2 -2
  122. package/docs/interfaces/HumidifierServiceData.html +6 -6
  123. package/docs/interfaces/HumidifierStatus.html +6 -6
  124. package/docs/interfaces/KeypadStatus.html +6 -6
  125. package/docs/interfaces/LeakServiceData.html +5 -5
  126. package/docs/interfaces/LeakStatus.html +6 -6
  127. package/docs/interfaces/LockCommands.html +2 -2
  128. package/docs/interfaces/LockServiceData.html +6 -6
  129. package/docs/interfaces/LockStatus.html +6 -6
  130. package/docs/interfaces/MeterServiceData.html +5 -5
  131. package/docs/interfaces/MeterStatus.html +6 -6
  132. package/docs/interfaces/MotionServiceData.html +5 -5
  133. package/docs/interfaces/MotionStatus.html +6 -6
  134. package/docs/interfaces/PlugCommands.html +2 -2
  135. package/docs/interfaces/PlugServiceData.html +5 -5
  136. package/docs/interfaces/PlugStatus.html +6 -6
  137. package/docs/interfaces/PresenceServiceData.html +5 -5
  138. package/docs/interfaces/PresenceStatus.html +6 -6
  139. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  140. package/docs/interfaces/RelaySwitchServiceData.html +5 -5
  141. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  142. package/docs/interfaces/RemoteStatus.html +6 -6
  143. package/docs/interfaces/SceneListResponse.html +2 -2
  144. package/docs/interfaces/StripCommands.html +2 -2
  145. package/docs/interfaces/StripServiceData.html +5 -5
  146. package/docs/interfaces/StripStatus.html +6 -6
  147. package/docs/interfaces/SwitchBotConfig.html +21 -9
  148. package/docs/interfaces/WebhookConfig.html +2 -2
  149. package/docs/interfaces/WebhookDetails.html +2 -2
  150. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  151. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  152. package/docs/types/ConnectionType.html +1 -1
  153. package/docs/types/PhysicalDeviceType.html +1 -1
  154. package/docs/types/VirtualDeviceType.html +1 -1
  155. package/docs/variables/urls.html +1 -1
  156. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * utils/connection-tracker.ts: SwitchBot v4.0.0 - Connection Success Tracking
4
+ */
5
+ import { Logger } from './index.js';
6
+ /**
7
+ * Tracks connection success/failure statistics per device per connection type
8
+ */
9
+ export class ConnectionTracker {
10
+ deviceId;
11
+ stats = new Map();
12
+ logger;
13
+ constructor(deviceId, logLevel) {
14
+ this.deviceId = deviceId;
15
+ this.logger = new Logger(`ConnectionTracker:${deviceId}`, logLevel);
16
+ // Initialize stats for all connection types
17
+ const connectionTypes = ['ble', 'api'];
18
+ for (const type of connectionTypes) {
19
+ this.stats.set(type, {
20
+ connectionType: type,
21
+ successCount: 0,
22
+ failureCount: 0,
23
+ totalAttempts: 0,
24
+ successRate: 1, // Start optimistic
25
+ averageLatencyMs: 0,
26
+ lastAttemptTime: undefined,
27
+ lastSuccessTime: undefined,
28
+ lastFailureTime: undefined,
29
+ });
30
+ }
31
+ }
32
+ /**
33
+ * Record a successful attempt
34
+ */
35
+ recordSuccess(connectionType, latencyMs = 0) {
36
+ const stat = this.stats.get(connectionType);
37
+ if (!stat) {
38
+ return;
39
+ }
40
+ stat.successCount++;
41
+ stat.totalAttempts++;
42
+ stat.lastAttemptTime = new Date();
43
+ stat.lastSuccessTime = new Date();
44
+ // Update average latency (exponential moving average)
45
+ const alpha = 0.3;
46
+ stat.averageLatencyMs = stat.averageLatencyMs * (1 - alpha) + latencyMs * alpha;
47
+ // Update success rate
48
+ stat.successRate = stat.totalAttempts === 0 ? 1 : stat.successCount / stat.totalAttempts;
49
+ this.logger.debug(`${connectionType}: success recorded`, {
50
+ successRate: stat.successRate.toFixed(2),
51
+ latency: latencyMs,
52
+ });
53
+ }
54
+ /**
55
+ * Record a failed attempt
56
+ */
57
+ recordFailure(connectionType) {
58
+ const stat = this.stats.get(connectionType);
59
+ if (!stat) {
60
+ return;
61
+ }
62
+ stat.failureCount++;
63
+ stat.totalAttempts++;
64
+ stat.lastAttemptTime = new Date();
65
+ stat.lastFailureTime = new Date();
66
+ // Update success rate
67
+ stat.successRate = stat.totalAttempts === 0 ? 1 : stat.successCount / stat.totalAttempts;
68
+ this.logger.debug(`${connectionType}: failure recorded`, {
69
+ successRate: stat.successRate.toFixed(2),
70
+ });
71
+ }
72
+ /**
73
+ * Get statistics for a connection type
74
+ */
75
+ getStats(connectionType) {
76
+ return this.stats.get(connectionType);
77
+ }
78
+ /**
79
+ * Get all statistics
80
+ */
81
+ getAllStats() {
82
+ return Array.from(this.stats.values());
83
+ }
84
+ /**
85
+ * Get the best connection type (highest success rate)
86
+ */
87
+ getBestConnection(availableTypes = ['ble', 'api']) {
88
+ let bestType;
89
+ let bestRate = -1;
90
+ for (const type of availableTypes) {
91
+ const stat = this.stats.get(type);
92
+ if (stat && stat.successRate > bestRate) {
93
+ bestRate = stat.successRate;
94
+ bestType = type;
95
+ }
96
+ }
97
+ if (bestType) {
98
+ const stat = this.stats.get(bestType);
99
+ if (stat.totalAttempts > 0) {
100
+ this.logger.debug(`Best connection: ${bestType} (success rate: ${stat.successRate.toFixed(2)})`);
101
+ }
102
+ }
103
+ return bestType;
104
+ }
105
+ /**
106
+ * Get the most recent successful connection type
107
+ */
108
+ getMostRecentSuccessful(availableTypes = ['ble', 'api']) {
109
+ let mostRecentType;
110
+ let mostRecentTime;
111
+ for (const type of availableTypes) {
112
+ const stat = this.stats.get(type);
113
+ if (stat?.lastSuccessTime) {
114
+ if (!mostRecentTime || stat.lastSuccessTime > mostRecentTime) {
115
+ mostRecentTime = stat.lastSuccessTime;
116
+ mostRecentType = type;
117
+ }
118
+ }
119
+ }
120
+ return mostRecentType;
121
+ }
122
+ /**
123
+ * Check if a connection type is considered reliable
124
+ * (e.g., success rate > 75% with at least 5 attempts)
125
+ */
126
+ isReliable(connectionType, minAttempts = 5, minRate = 0.75) {
127
+ const stat = this.stats.get(connectionType);
128
+ if (!stat) {
129
+ return false;
130
+ }
131
+ return stat.totalAttempts >= minAttempts && stat.successRate >= minRate;
132
+ }
133
+ /**
134
+ * Get connection recommendation with reasoning
135
+ */
136
+ getRecommendation(availableTypes = ['ble', 'api']) {
137
+ const stats = availableTypes.map(type => this.stats.get(type)).filter(Boolean);
138
+ // If no attempt history, recommend first available
139
+ if (stats.every(s => s.totalAttempts === 0)) {
140
+ return {
141
+ recommended: availableTypes[0],
142
+ reason: 'No history, using first available connection',
143
+ stats,
144
+ };
145
+ }
146
+ // Find most reliable based on success rate
147
+ const bestType = this.getBestConnection(availableTypes);
148
+ if (!bestType) {
149
+ return {
150
+ recommended: undefined,
151
+ reason: 'No available connections',
152
+ stats,
153
+ };
154
+ }
155
+ const bestStat = this.stats.get(bestType);
156
+ let reason = `${bestType} has best success rate (${bestStat.successRate.toFixed(2)})`;
157
+ // Add context about latency if applicable
158
+ if (bestStat.averageLatencyMs > 0) {
159
+ reason += ` with avg latency ${bestStat.averageLatencyMs.toFixed(0)}ms`;
160
+ }
161
+ return {
162
+ recommended: bestType,
163
+ reason,
164
+ stats,
165
+ };
166
+ }
167
+ /**
168
+ * Reset all statistics
169
+ */
170
+ reset() {
171
+ this.logger.debug('Resetting all statistics');
172
+ for (const stat of this.stats.values()) {
173
+ stat.successCount = 0;
174
+ stat.failureCount = 0;
175
+ stat.totalAttempts = 0;
176
+ stat.successRate = 1;
177
+ stat.averageLatencyMs = 0;
178
+ stat.lastAttemptTime = undefined;
179
+ stat.lastSuccessTime = undefined;
180
+ stat.lastFailureTime = undefined;
181
+ }
182
+ }
183
+ }
184
+ //# sourceMappingURL=connection-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-tracker.js","sourceRoot":"","sources":["../../src/utils/connection-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { ConnectionType } from '../types/index.js';
2
+ /**
3
+ * Information about a fallback event
4
+ */
5
+ export interface FallbackEvent {
6
+ deviceId: string;
7
+ primaryConnection: ConnectionType;
8
+ fallbackConnection: ConnectionType | undefined;
9
+ reason: string;
10
+ timestamp: Date;
11
+ attemptsCount?: number;
12
+ totalTimeMs?: number;
13
+ }
14
+ /**
15
+ * Type for custom fallback handler callbacks
16
+ */
17
+ export type FallbackHandler = (event: FallbackEvent) => void | Promise<void>;
18
+ /**
19
+ * Options for registering a fallback handler
20
+ */
21
+ export interface FallbackHandlerOptions {
22
+ /** Handler identifier for later removal */
23
+ id?: string;
24
+ /** Handler priority (higher = executes first) */
25
+ priority?: number;
26
+ }
27
+ /**
28
+ * Manages custom fallback handlers and events
29
+ */
30
+ export declare class FallbackHandlerManager {
31
+ private handlers;
32
+ private logger;
33
+ private handlerCounter;
34
+ constructor(logLevel?: number);
35
+ /**
36
+ * Register a custom fallback handler
37
+ */
38
+ register(handler: FallbackHandler, options?: FallbackHandlerOptions): string;
39
+ /**
40
+ * Unregister a fallback handler
41
+ */
42
+ unregister(id: string): boolean;
43
+ /**
44
+ * Emit a fallback event to all registered handlers
45
+ */
46
+ emit(event: FallbackEvent): Promise<void>;
47
+ /**
48
+ * Clear all handlers
49
+ */
50
+ clear(): void;
51
+ /**
52
+ * Get handler count
53
+ */
54
+ getHandlerCount(): number;
55
+ }
56
+ /**
57
+ * Built-in fallback handler: Log fallback events
58
+ */
59
+ export declare function createLoggingFallbackHandler(logLevel?: number): FallbackHandler;
60
+ /**
61
+ * Built-in fallback handler: Metrics/statistics collection
62
+ */
63
+ export declare function createMetricsCollectionHandler(): FallbackHandler;
64
+ /**
65
+ * Built-in fallback handler: Alert on repeated fallbacks
66
+ */
67
+ export declare function createAlertHandler(alertThreshold?: number): FallbackHandler;
68
+ //# sourceMappingURL=fallback-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-handler.d.ts","sourceRoot":"","sources":["../../src/utils/fallback-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAIvD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,cAAc,CAAA;IACjC,kBAAkB,EAAE,cAAc,GAAG,SAAS,CAAA;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,IAAI,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE5E;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAGH;IAEb,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,cAAc,CAAI;gBAEd,QAAQ,CAAC,EAAE,MAAM;IAI7B;;OAEG;IACH,QAAQ,CACN,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,sBAA2B,GACnC,MAAM;IAUT;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ/B;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,GAAE,MAAU,GAAG,eAAe,CAmBlF;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,eAAe,CA+BhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,GAAE,MAAU,GAAG,eAAe,CAkB9E"}
@@ -0,0 +1,131 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * utils/fallback-handler.ts: SwitchBot v4.0.0 - Custom Fallback Handlers
4
+ */
5
+ import { Logger } from './index.js';
6
+ /**
7
+ * Manages custom fallback handlers and events
8
+ */
9
+ export class FallbackHandlerManager {
10
+ handlers = new Map();
11
+ logger;
12
+ handlerCounter = 0;
13
+ constructor(logLevel) {
14
+ this.logger = new Logger('FallbackHandlerManager', logLevel);
15
+ }
16
+ /**
17
+ * Register a custom fallback handler
18
+ */
19
+ register(handler, options = {}) {
20
+ const id = options.id || `handler_${++this.handlerCounter}`;
21
+ const priority = options.priority ?? 0;
22
+ this.handlers.set(id, { handler, priority });
23
+ this.logger.debug(`Registered fallback handler: ${id} (priority: ${priority})`);
24
+ return id;
25
+ }
26
+ /**
27
+ * Unregister a fallback handler
28
+ */
29
+ unregister(id) {
30
+ const removed = this.handlers.delete(id);
31
+ if (removed) {
32
+ this.logger.debug(`Unregistered fallback handler: ${id}`);
33
+ }
34
+ return removed;
35
+ }
36
+ /**
37
+ * Emit a fallback event to all registered handlers
38
+ */
39
+ async emit(event) {
40
+ // Sort handlers by priority (descending)
41
+ const sortedHandlers = Array.from(this.handlers.entries())
42
+ .sort((a, b) => b[1].priority - a[1].priority);
43
+ this.logger.debug(`Emitting fallback event to ${sortedHandlers.length} handlers`, {
44
+ device: event.deviceId,
45
+ primary: event.primaryConnection,
46
+ fallback: event.fallbackConnection,
47
+ });
48
+ for (const [id, { handler }] of sortedHandlers) {
49
+ try {
50
+ await Promise.resolve(handler(event));
51
+ }
52
+ catch (error) {
53
+ this.logger.error(`Fallback handler ${id} threw error`, error);
54
+ // Continue with other handlers even if one fails
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Clear all handlers
60
+ */
61
+ clear() {
62
+ this.logger.debug(`Clearing ${this.handlers.size} fallback handlers`);
63
+ this.handlers.clear();
64
+ }
65
+ /**
66
+ * Get handler count
67
+ */
68
+ getHandlerCount() {
69
+ return this.handlers.size;
70
+ }
71
+ }
72
+ /**
73
+ * Built-in fallback handler: Log fallback events
74
+ */
75
+ export function createLoggingFallbackHandler(logLevel = 3) {
76
+ const logger = new Logger('FallbackLogger', logLevel);
77
+ return (event) => {
78
+ if (!event.fallbackConnection) {
79
+ logger.error(`Device ${event.deviceId}: ${event.primaryConnection} failed and no fallback available`);
80
+ }
81
+ else {
82
+ logger.warn(`Device ${event.deviceId}: ${event.primaryConnection} failed, falling back to ${event.fallbackConnection}`, {
83
+ reason: event.reason,
84
+ attempts: event.attemptsCount,
85
+ timeMs: event.totalTimeMs,
86
+ });
87
+ }
88
+ };
89
+ }
90
+ /**
91
+ * Built-in fallback handler: Metrics/statistics collection
92
+ */
93
+ export function createMetricsCollectionHandler() {
94
+ const metrics = {
95
+ totalFallbacks: 0,
96
+ fallbacksByDevice: new Map(),
97
+ fallbacksByConnection: new Map(),
98
+ lastFallbackTime: undefined,
99
+ };
100
+ const handler = (event) => {
101
+ metrics.totalFallbacks++;
102
+ metrics.lastFallbackTime = event.timestamp;
103
+ const deviceCount = metrics.fallbacksByDevice.get(event.deviceId) || 0;
104
+ metrics.fallbacksByDevice.set(event.deviceId, deviceCount + 1);
105
+ if (event.fallbackConnection) {
106
+ const connectionKey = `${event.primaryConnection}->${event.fallbackConnection}`;
107
+ const count = metrics.fallbacksByConnection.get(connectionKey) || 0;
108
+ metrics.fallbacksByConnection.set(connectionKey, count + 1);
109
+ }
110
+ };
111
+ handler.getMetrics = () => ({ ...metrics });
112
+ return handler;
113
+ }
114
+ /**
115
+ * Built-in fallback handler: Alert on repeated fallbacks
116
+ */
117
+ export function createAlertHandler(alertThreshold = 3) {
118
+ const fallbackCounts = new Map();
119
+ const logger = new Logger('FallbackAlertHandler');
120
+ return (event) => {
121
+ const count = (fallbackCounts.get(event.deviceId) || 0) + 1;
122
+ fallbackCounts.set(event.deviceId, count);
123
+ if (count === alertThreshold) {
124
+ logger.error(`ALERT: Device ${event.deviceId} has fallen back ${count} times - check connection`);
125
+ }
126
+ if (count > alertThreshold && count % alertThreshold === 0) {
127
+ logger.error(`ALERT: Device ${event.deviceId} has fallen back ${count} times`);
128
+ }
129
+ };
130
+ }
131
+ //# sourceMappingURL=fallback-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-handler.js","sourceRoot":"","sources":["../../src/utils/fallback-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA8BnC;;GAEG;AACH,MAAM,OAAO,sBAAsB;IACzB,QAAQ,GAGZ,IAAI,GAAG,EAAE,CAAA;IAEL,MAAM,CAAQ;IACd,cAAc,GAAG,CAAC,CAAA;IAE1B,YAAY,QAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAA;IAC9D,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,OAAwB,EACxB,UAAkC,EAAE;QAEpC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,CAAA;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAA;QAEtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,eAAe,QAAQ,GAAG,CAAC,CAAA;QAE/E,OAAO,EAAE,CAAA;IACX,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,EAAU;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,KAAoB;QAC7B,yCAAyC;QACzC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;aACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAEhD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,cAAc,CAAC,MAAM,WAAW,EAAE;YAChF,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,OAAO,EAAE,KAAK,CAAC,iBAAiB;YAChC,QAAQ,EAAE,KAAK,CAAC,kBAAkB;SACnC,CAAC,CAAA;QAEF,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;gBAC9D,iDAAiD;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,CAAA;QACrE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAA;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAmB,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IAErD,OAAO,CAAC,KAAoB,EAAE,EAAE;QAC9B,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CACV,UAAU,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,iBAAiB,mCAAmC,CACxF,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CACT,UAAU,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,iBAAiB,4BAA4B,KAAK,CAAC,kBAAkB,EAAE,EAC1G;gBACE,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,aAAa;gBAC7B,MAAM,EAAE,KAAK,CAAC,WAAW;aAC1B,CACF,CAAA;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC5C,MAAM,OAAO,GAKT;QACF,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,IAAI,GAAG,EAAkB;QAC5C,qBAAqB,EAAE,IAAI,GAAG,EAAkB;QAChD,gBAAgB,EAAE,SAAS;KAC5B,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,EAAE;QACvC,OAAO,CAAC,cAAc,EAAE,CAAA;QACxB,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAA;QAE1C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACtE,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;QAE9D,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,GAAG,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,kBAAkB,EAAE,CAAA;YAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACnE,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC,CAGA;IAAC,OAAe,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IAErD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,iBAAyB,CAAC;IAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAChD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAA;IAEjD,OAAO,CAAC,KAAoB,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3D,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAEzC,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CACV,iBAAiB,KAAK,CAAC,QAAQ,oBAAoB,KAAK,2BAA2B,CACpF,CAAA;QACH,CAAC;QAED,IAAI,KAAK,GAAG,cAAc,IAAI,KAAK,GAAG,cAAc,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,QAAQ,oBAAoB,KAAK,QAAQ,CAAC,CAAA;QAChF,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
@@ -94,4 +94,8 @@ export declare function debounce<T extends (...args: any[]) => any>(fn: T, delay
94
94
  * Throttle function
95
95
  */
96
96
  export declare function throttle<T extends (...args: any[]) => any>(fn: T, limitMs: number): (...args: Parameters<T>) => void;
97
+ export { CircuitBreaker, type CircuitBreakerConfig, CircuitBreakerState, type CircuitBreakerStats } from './circuit-breaker.js';
98
+ export { type ConnectionStats, ConnectionTracker } from './connection-tracker.js';
99
+ export { createAlertHandler, createLoggingFallbackHandler, createMetricsCollectionHandler, type FallbackEvent, type FallbackHandler, FallbackHandlerManager, type FallbackHandlerOptions, } from './fallback-handler.js';
100
+ export { type RetryConfig, RetryExecutor, type RetryResult } from './retry.js';
97
101
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -203,4 +203,9 @@ export function throttle(fn, limitMs) {
203
203
  }
204
204
  };
205
205
  }
206
+ export { CircuitBreaker, CircuitBreakerState } from './circuit-breaker.js';
207
+ export { ConnectionTracker } from './connection-tracker.js';
208
+ export { createAlertHandler, createLoggingFallbackHandler, createMetricsCollectionHandler, FallbackHandlerManager, } from './fallback-handler.js';
209
+ // Export advanced utilities
210
+ export { RetryExecutor } from './retry.js';
206
211
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Retry configuration options
3
+ */
4
+ export interface RetryConfig {
5
+ /** Maximum number of retry attempts (default: 3) */
6
+ maxAttempts?: number;
7
+ /** Initial delay in milliseconds (default: 100) */
8
+ initialDelayMs?: number;
9
+ /** Maximum delay in milliseconds (default: 5000) */
10
+ maxDelayMs?: number;
11
+ /** Exponential backoff multiplier (default: 2) */
12
+ backoffMultiplier?: number;
13
+ /** Jitter factor 0-1 to randomize delays (default: 0.1) */
14
+ jitterFactor?: number;
15
+ }
16
+ /**
17
+ * Retry execution result
18
+ */
19
+ export interface RetryResult<T> {
20
+ /** Whether the operation succeeded */
21
+ success: boolean;
22
+ /** The result (if successful) */
23
+ result?: T;
24
+ /** The error (if failed) */
25
+ error?: Error;
26
+ /** Number of attempts made */
27
+ attemptsCount: number;
28
+ /** Total time spent retrying in milliseconds */
29
+ totalTimeMs: number;
30
+ }
31
+ /**
32
+ * Retry executor with exponential backoff
33
+ */
34
+ export declare class RetryExecutor {
35
+ private logger;
36
+ private config;
37
+ constructor(config?: RetryConfig, logLevel?: number);
38
+ /**
39
+ * Calculate delay for next attempt with exponential backoff
40
+ */
41
+ private calculateDelay;
42
+ /**
43
+ * Execute a function with automatic retries and exponential backoff
44
+ */
45
+ execute<T>(fn: () => Promise<T>, description?: string): Promise<RetryResult<T>>;
46
+ /**
47
+ * Convenience method: execute with retries, throw on final failure
48
+ */
49
+ executeOrThrow<T>(fn: () => Promise<T>, description?: string): Promise<T>;
50
+ }
51
+ /**
52
+ * Convenience function: retry a promise with automatic backoff
53
+ */
54
+ export declare function retry<T>(fn: () => Promise<T>, config?: RetryConfig, logLevel?: number): Promise<T>;
55
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAA;IACV,4BAA4B;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,WAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM;IAYvD;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,SAAc,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAuD1B;;OAEG;IACG,cAAc,CAAC,CAAC,EACpB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,SAAc,GACxB,OAAO,CAAC,CAAC,CAAC;CASd;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,WAAgB,EACxB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -0,0 +1,95 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * utils/retry.ts: SwitchBot v4.0.0 - Retry Logic with Exponential Backoff
4
+ */
5
+ import { Logger } from './index.js';
6
+ /**
7
+ * Retry executor with exponential backoff
8
+ */
9
+ export class RetryExecutor {
10
+ logger;
11
+ config;
12
+ constructor(config = {}, logLevel) {
13
+ this.config = {
14
+ maxAttempts: config.maxAttempts ?? 3,
15
+ initialDelayMs: config.initialDelayMs ?? 100,
16
+ maxDelayMs: config.maxDelayMs ?? 5000,
17
+ backoffMultiplier: config.backoffMultiplier ?? 2,
18
+ jitterFactor: config.jitterFactor ?? 0.1,
19
+ };
20
+ this.logger = new Logger('RetryExecutor', logLevel);
21
+ }
22
+ /**
23
+ * Calculate delay for next attempt with exponential backoff
24
+ */
25
+ calculateDelay(attemptNumber) {
26
+ const exponentialDelay = this.config.initialDelayMs * this.config.backoffMultiplier ** (attemptNumber - 1);
27
+ const cappedDelay = Math.min(exponentialDelay, this.config.maxDelayMs);
28
+ // Add jitter to prevent thundering herd
29
+ const jitter = cappedDelay * this.config.jitterFactor * (Math.random() * 2 - 1);
30
+ return Math.max(0, cappedDelay + jitter);
31
+ }
32
+ /**
33
+ * Execute a function with automatic retries and exponential backoff
34
+ */
35
+ async execute(fn, description = 'Operation') {
36
+ let lastError;
37
+ let totalTimeMs = 0;
38
+ let attemptNumber = 0;
39
+ for (attemptNumber = 1; attemptNumber <= this.config.maxAttempts; attemptNumber++) {
40
+ try {
41
+ const startTime = Date.now();
42
+ const result = await fn();
43
+ const elapsedMs = Date.now() - startTime;
44
+ totalTimeMs += elapsedMs;
45
+ if (attemptNumber > 1) {
46
+ this.logger.info(`${description} succeeded on attempt ${attemptNumber}/${this.config.maxAttempts}`);
47
+ }
48
+ return {
49
+ success: true,
50
+ result,
51
+ attemptsCount: attemptNumber,
52
+ totalTimeMs,
53
+ };
54
+ }
55
+ catch (error) {
56
+ lastError = error instanceof Error ? error : new Error(String(error));
57
+ const elapsedMs = Date.now() - (Date.now() - totalTimeMs);
58
+ totalTimeMs += elapsedMs;
59
+ if (attemptNumber < this.config.maxAttempts) {
60
+ const delayMs = this.calculateDelay(attemptNumber);
61
+ this.logger.warn(`${description} failed on attempt ${attemptNumber}/${this.config.maxAttempts}, retrying in ${delayMs}ms`, { error: lastError.message });
62
+ // Wait before retrying
63
+ await new Promise(resolve => setTimeout(resolve, delayMs));
64
+ }
65
+ else {
66
+ this.logger.error(`${description} failed after ${attemptNumber} attempts`, { error: lastError.message });
67
+ }
68
+ }
69
+ }
70
+ return {
71
+ success: false,
72
+ error: lastError || new Error('Unknown error'),
73
+ attemptsCount: attemptNumber,
74
+ totalTimeMs,
75
+ };
76
+ }
77
+ /**
78
+ * Convenience method: execute with retries, throw on final failure
79
+ */
80
+ async executeOrThrow(fn, description = 'Operation') {
81
+ const result = await this.execute(fn, description);
82
+ if (result.success) {
83
+ return result.result;
84
+ }
85
+ throw result.error;
86
+ }
87
+ }
88
+ /**
89
+ * Convenience function: retry a promise with automatic backoff
90
+ */
91
+ export async function retry(fn, config = {}, logLevel) {
92
+ const executor = new RetryExecutor(config, logLevel);
93
+ return executor.executeOrThrow(fn);
94
+ }
95
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "eJydmslu20gQht+F58pM74tvcRY4M3YiRM7MYeADLTExEYoMKDKDIPC7B2XacjdJidW5yNvf9fGvXlhF+mfWNk23z87+k5YbkMoxkFYJkNZykNZ5kM44UMxpkJ4JkF5JkN4aUIwpEFaAFI7fQNYWn6ti05VNvc/OfmbCCvxS57siO8vW/5fd5u686V4X38tNkUH2tay32RkXDrK+rbKzbFPl+32x/3Mk/eOu21UZDH/OzrJuv32BY18Mv4Bsc1dW27aoBxOgnQbjNXjugTNugHMhgAuhgSv8nZUMuBMWBMMPLhkIgd8pKUFo/NFzB5Jxf3MPmbQ88PFv87JsV31bfi6L9pSLSJjiQVmHWGXdMex1fludzOBUvXAB95BppyPeeVXW2+uy6k6DDrJlgvEjQl/dLgTvq9uU1DlmQXIhMH+O2Yj2qiirsv5yWX65W7AUKpddee5jTlN3+WYJMYiWo+MCjsP3bZeX9UL4QUQIz4WIwl/k9fZ0bFQQAgsRT/ZFfysWAve3ImWyuRwmGr+OUXIRJQke1GhqL/pduRR4VyZ50MI8eNDCTFCL+dqVSwnD0EbKKPS7D+ui3jft9cXp+M86AsRKFkH+Ln58yxdW0qAhBHci3sqXRf71dGhUEAJ7oaLAq6r/clXW5V+r0+GfdcsQvMnMQj6taZBP66QV5YXCFYW3tRjbFvuiPn3nfVYRfImRr49Flf8Y7t38NCRUpngTUrIHb3LkLQy4uqLDV1cEn2q0fz4Wu6ZbSOOgIQTXIye0rUncmPHCMFjdGKxzrFAgnOAPuTSjaXyKvar6Pe0qUEmwakeb7TC8bYictiFgnODHMK8+LBypsZYA8zwu0ta7vO0um83C8XSQLSOwCp1HLOctUBJA41Jg3bXltwUCSgihhQyn/uXq3Zu2bU5Wz08aSnAl4+Dvm+7l97yssO6lgCZ6EjSc+PPLN0nQOT0FqkOnr5rdLq+3b/OyKraLyKmaAjQiAtb10N9dl7ui6TsCdG4ECRwu+qEPfN90b5u+XrY6I6cgbbhGX5f7TfO9aH8s0yIlBeTCA+rQ7C6CYmVSVyykAtwn+OEA1xHg3OKHB3SOLby9Ga4uvB38k1flNscJXLy8kZSQCGXCRAQd67pocQZf511+IAptnohl3RXt53yDu3d20FH2YeTAdyzew3RuLCbw4vlQhuOjFg1SeQVSMw5SCw9SSwtSKwNSaw1SG/yrZSC1e/hwILU3IA1zIA3XN4OPsNU6NOQJbmaGUHPow11z3qRQm9/gaRauGXw+kACM1cmzprkGaYbyGn8Ij8bgkQH9go6MoqZC+PhwxicKCfDJACpXhifE46OGBO5kAJWrwhb5ok+Y+VhM5Wkd8XblNvF0mh1DpZtwY2E/S+eO1FSiDY9DrBsTiLGaSowO4KuiS0nuWE5mhoXbVYM3rAToWE+l+nDtYmdPZ47URKJhoc+ntj6BOh1BJUcnY9Bu0+Hzg6j8qM98aFHo5LGcyLTRU9qgKnksu/f0OuZpRPLtyfLhbYU8VlV1edcnXMigpyZAibkahGh/ok81r91QClkzexkk6yM11Xj0dui8IVtuftssf3zDIa0bsWk+m0SHzo9KLqrFQJrqEV/gSScUKDY885OOs3HlR3J7ECZvKKc0KKaHbeWiUyWs3IjZmBtCnAGnjtaalBRMB1C5eq7CJCFDLZVm3LSupCY3VifvKMbNMMtOzNS2JMehlurYy1FFSyEddESKZ2K2jiWmdjogObvq8UW653a+oqbZjuVU91GXNLxyIvFCKZUlzbhmp5CehVRO9MQTa2/iXIbS1FmM/yfC60mzQLJ6EFKtRkfQUPNTQIGSSjIzjQEJFUipLDtuB4gTGEqTJ5CJ4RGfd5NmhOLzWUh1GTc9Tw0FiRWJaTz8d6T5xoOY3JkRyTkWQ44V40euhWR/oqdmQMRUfAlJBD5LqazozeVD30TMc6Sl0jSfNHUUY4GSSoqepg7vEkioUJrevEn8bzt8JG8dByx2AcsvwIoEsFAAvHsC3s4A7zOAJzB+4I/GAW5qwB0HuPQAV8LN/f39Lx3H9OA="