monaco-grpc-sdk 1.0.3

Typed Rust gRPC client SDK for the Monaco Exchange API — generated from Protocol Buffer definitions
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
// @generated
// This file is @generated by prost-build.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Position {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    /// Margin account UUID for the isolated bucket that owns this position.
    #[prost(string, tag="2")]
    pub margin_account_id: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub trading_pair_id: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub side: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub size: ::prost::alloc::string::String,
    #[prost(string, tag="6")]
    pub entry_price: ::prost::alloc::string::String,
    #[prost(string, tag="7")]
    pub mark_price: ::prost::alloc::string::String,
    #[prost(string, optional, tag="8")]
    pub index_price: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, tag="9")]
    pub unrealized_pnl: ::prost::alloc::string::String,
    #[prost(string, tag="10")]
    pub realized_pnl: ::prost::alloc::string::String,
    /// Current isolated collateral for this position's margin-account bucket.
    #[prost(string, tag="11")]
    pub isolated_margin: ::prost::alloc::string::String,
    #[prost(string, optional, tag="12")]
    pub leverage: ::core::option::Option<::prost::alloc::string::String>,
    /// Maintenance margin required by this position at mark_price using the
    /// market maintenance-margin rate. Zero when the position has no open exposure.
    #[prost(string, tag="13")]
    pub maintenance_margin_required: ::prost::alloc::string::String,
    /// Initial margin required by this position at mark_price, honoring both its
    /// effective leverage and the market initial-margin floor. Zero when the
    /// position has no open exposure.
    #[prost(string, optional, tag="14")]
    pub initial_margin_required: ::core::option::Option<::prost::alloc::string::String>,
    /// Liquidation mark-price threshold. In ISOLATED mode, this is the
    /// position/risk-bucket threshold. In CROSS mode, it is conditional: it varies
    /// only this position's mark while all other marks in the cross risk bucket
    /// remain unchanged. Other position marks, funding, realized PnL,
    /// fees/reserves, and collateral can change it. Treat an absent or blank value
    /// as unavailable, never as zero.
    #[prost(string, tag="15")]
    pub liquidation_price: ::prost::alloc::string::String,
    #[prost(string, tag="16")]
    pub status: ::prost::alloc::string::String,
    #[prost(string, tag="17")]
    pub updated_at: ::prost::alloc::string::String,
    #[prost(string, optional, tag="18")]
    pub risk_bucket_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="19")]
    pub margin_mode: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ListPositionsRequest {
    /// Optional isolated bucket filter.
    #[prost(string, optional, tag="1")]
    pub margin_account_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="2")]
    pub trading_pair_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="3")]
    pub status: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(uint32, optional, tag="4")]
    pub page: ::core::option::Option<u32>,
    #[prost(uint32, optional, tag="5")]
    pub page_size: ::core::option::Option<u32>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListPositionsResponse {
    #[prost(message, repeated, tag="1")]
    pub positions: ::prost::alloc::vec::Vec<Position>,
    #[prost(uint32, tag="2")]
    pub total: u32,
    #[prost(uint32, tag="3")]
    pub page: u32,
    #[prost(uint32, tag="4")]
    pub page_size: u32,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct GetPositionRequest {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct GetPositionResponse {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    /// Margin account UUID for the isolated bucket that owns this position.
    #[prost(string, tag="2")]
    pub margin_account_id: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub trading_pair_id: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub side: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub size: ::prost::alloc::string::String,
    #[prost(string, tag="6")]
    pub entry_price: ::prost::alloc::string::String,
    #[prost(string, tag="7")]
    pub mark_price: ::prost::alloc::string::String,
    #[prost(string, optional, tag="8")]
    pub index_price: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, tag="9")]
    pub unrealized_pnl: ::prost::alloc::string::String,
    #[prost(string, tag="10")]
    pub realized_pnl: ::prost::alloc::string::String,
    /// Current isolated collateral for this position's margin-account bucket.
    #[prost(string, tag="11")]
    pub isolated_margin: ::prost::alloc::string::String,
    #[prost(string, optional, tag="12")]
    pub leverage: ::core::option::Option<::prost::alloc::string::String>,
    /// Maintenance margin required by this position at mark_price using the
    /// market maintenance-margin rate. Zero when the position has no open exposure.
    #[prost(string, tag="13")]
    pub maintenance_margin_required: ::prost::alloc::string::String,
    /// Initial margin required by this position at mark_price, honoring both its
    /// effective leverage and the market initial-margin floor. Zero when the
    /// position has no open exposure.
    #[prost(string, optional, tag="14")]
    pub initial_margin_required: ::core::option::Option<::prost::alloc::string::String>,
    /// Liquidation mark-price threshold. In ISOLATED mode, this is the
    /// position/risk-bucket threshold. In CROSS mode, it is conditional: it varies
    /// only this position's mark while all other marks in the cross risk bucket
    /// remain unchanged. Other position marks, funding, realized PnL,
    /// fees/reserves, and collateral can change it. Treat an absent or blank value
    /// as unavailable, never as zero.
    #[prost(string, tag="15")]
    pub liquidation_price: ::prost::alloc::string::String,
    #[prost(string, tag="16")]
    pub status: ::prost::alloc::string::String,
    #[prost(string, tag="17")]
    pub updated_at: ::prost::alloc::string::String,
    #[prost(string, optional, tag="18")]
    pub risk_bucket_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="19")]
    pub margin_mode: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ClosePositionRequest {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub close_type: ::prost::alloc::string::String,
    #[prost(string, optional, tag="3")]
    pub limit_price: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(int32, optional, tag="4")]
    pub slippage_tolerance_bps: ::core::option::Option<i32>,
    #[prost(string, optional, tag="5")]
    pub quantity: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ClosePositionResponse {
    #[prost(string, tag="1")]
    pub close_order_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub status: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub message: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub submitted_quantity: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct BatchCloseAllRequest {
    /// Optional trading-pair filter. When set, only open positions on this
    /// trading pair are closed; otherwise every open position is closed.
    #[prost(string, optional, tag="1")]
    pub trading_pair_id: ::core::option::Option<::prost::alloc::string::String>,
    /// Optional slippage tolerance (basis points) applied to each MARKET close.
    #[prost(int32, optional, tag="2")]
    pub slippage_tolerance_bps: ::core::option::Option<i32>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct BatchCloseAllResponse {
    /// Number of open positions the batch attempted to close.
    #[prost(int32, tag="1")]
    pub total_requested: i32,
    /// Number of positions whose close order was accepted by the matching engine
    /// (SUCCESS, PARTIAL, or PENDING).
    #[prost(int32, tag="2")]
    pub total_closed: i32,
    /// Number of positions whose close failed (validation, lookup, or a rejected
    /// close order).
    #[prost(int32, tag="3")]
    pub total_failed: i32,
    #[prost(message, repeated, tag="4")]
    pub results: ::prost::alloc::vec::Vec<BatchCloseResult>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct BatchCloseResult {
    /// Position UUID this result is for.
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    /// Close order UUID. Present when the close order was accepted.
    #[prost(string, optional, tag="2")]
    pub close_order_id: ::core::option::Option<::prost::alloc::string::String>,
    /// Close outcome: SUCCESS, PARTIAL, or PENDING. Present when accepted.
    #[prost(string, optional, tag="3")]
    pub status: ::core::option::Option<::prost::alloc::string::String>,
    /// Quantity submitted on the close order. Present when accepted.
    #[prost(string, optional, tag="4")]
    pub submitted_quantity: ::core::option::Option<::prost::alloc::string::String>,
    /// Failure detail. Present when this position could not be closed.
    #[prost(message, optional, tag="5")]
    pub error: ::core::option::Option<BatchCloseError>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct BatchCloseError {
    /// Machine-readable error code (e.g. POSITION_NOT_FOUND, INVALID_REQUEST,
    /// MATCHING_ENGINE_ERROR).
    #[prost(string, tag="1")]
    pub code: ::prost::alloc::string::String,
    /// Human-readable error message.
    #[prost(string, tag="2")]
    pub message: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct GetPositionRiskRequest {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct GetPositionRiskResponse {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub mark_price: ::prost::alloc::string::String,
    #[prost(string, optional, tag="3")]
    pub index_price: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, tag="4")]
    pub unrealized_pnl: ::prost::alloc::string::String,
    /// Liquidation mark-price threshold. In ISOLATED mode, this is the
    /// position/risk-bucket threshold. In CROSS mode, it is conditional: it varies
    /// only this position's mark while all other marks in the cross risk bucket
    /// remain unchanged. Other position marks, funding, realized PnL,
    /// fees/reserves, and collateral can change it. Treat an absent or blank value
    /// as unavailable, never as zero.
    #[prost(string, tag="5")]
    pub liquidation_price: ::prost::alloc::string::String,
    #[prost(string, tag="6")]
    pub margin_ratio: ::prost::alloc::string::String,
    /// Maintenance margin required by this position at mark_price using the
    /// market maintenance-margin rate. Zero when the position has no open exposure.
    #[prost(string, tag="7")]
    pub maintenance_margin_required: ::prost::alloc::string::String,
    /// Initial margin required by this position at mark_price, honoring both its
    /// effective leverage and the market initial-margin floor. Zero when the
    /// position has no open exposure.
    #[prost(string, optional, tag="8")]
    pub initial_margin_required: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, tag="9")]
    pub updated_at: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AddPositionMarginRequest {
    /// Position UUID for the isolated bucket being adjusted.
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub amount: ::prost::alloc::string::String,
    /// Collateral asset to move into the isolated bucket. USDC is the current v1 path.
    #[prost(string, tag="3")]
    pub asset: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AddPositionMarginResponse {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    /// Margin account UUID for the isolated bucket that was adjusted.
    #[prost(string, tag="2")]
    pub margin_account_id: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub new_isolated_margin: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub status: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub message: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ReducePositionMarginRequest {
    /// Position UUID for the isolated bucket being adjusted.
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub amount: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ReducePositionMarginResponse {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    /// Margin account UUID for the isolated bucket that was adjusted.
    #[prost(string, tag="2")]
    pub margin_account_id: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub new_isolated_margin: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub status: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub message: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct PositionHistoryEvent {
    #[prost(string, tag="1")]
    pub id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub margin_account_id: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub trading_pair_id: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub action: ::prost::alloc::string::String,
    #[prost(string, optional, tag="6")]
    pub size_change: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="7")]
    pub price: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="8")]
    pub realized_pnl: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="9")]
    pub fees_paid: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="10")]
    pub collateral_change: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="11")]
    pub order_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, tag="12")]
    pub created_at: ::prost::alloc::string::String,
    /// Average entry price immediately before this reduction execution.
    #[prost(string, optional, tag="13")]
    pub entry_price: ::core::option::Option<::prost::alloc::string::String>,
    /// Initial margin allocated pro rata to this reduction execution.
    #[prost(string, optional, tag="14")]
    pub allocated_initial_margin: ::core::option::Option<::prost::alloc::string::String>,
    /// Funding allocated pro rata to this reduction; positive means paid.
    #[prost(string, optional, tag="15")]
    pub funding_paid: ::core::option::Option<::prost::alloc::string::String>,
    /// Realized PnL after trading fees and funding for this reduction execution.
    #[prost(string, optional, tag="16")]
    pub net_realized_pnl: ::core::option::Option<::prost::alloc::string::String>,
    /// Net realized PnL divided by allocated_initial_margin, expressed as a percentage.
    #[prost(string, optional, tag="17")]
    pub realized_roe: ::core::option::Option<::prost::alloc::string::String>,
    /// Position side immediately before this reduction execution.
    #[prost(string, optional, tag="18")]
    pub position_side: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ListPositionHistoryRequest {
    #[prost(string, optional, tag="1")]
    pub position_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="2")]
    pub margin_account_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="3")]
    pub trading_pair_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(uint32, optional, tag="4")]
    pub page: ::core::option::Option<u32>,
    #[prost(uint32, optional, tag="5")]
    pub page_size: ::core::option::Option<u32>,
    /// When true, return only DECREASE, CLOSE, and LIQUIDATE execution rows.
    #[prost(bool, optional, tag="6")]
    pub reduction_only: ::core::option::Option<bool>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListPositionHistoryResponse {
    #[prost(message, repeated, tag="1")]
    pub events: ::prost::alloc::vec::Vec<PositionHistoryEvent>,
    #[prost(uint32, tag="2")]
    pub total: u32,
    #[prost(uint32, tag="3")]
    pub page: u32,
    #[prost(uint32, tag="4")]
    pub page_size: u32,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct GetPositionPnlHistoryRequest {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub interval: ::prost::alloc::string::String,
    #[prost(uint64, optional, tag="3")]
    pub start_time: ::core::option::Option<u64>,
    #[prost(uint64, optional, tag="4")]
    pub end_time: ::core::option::Option<u64>,
}
/// One PnL state sample for a position in one bucket. Cumulative fields are
/// lifetime values as of the bucket; fundingPaid and fees are cost-positive.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct PositionPnlPoint {
    #[prost(string, tag="1")]
    pub bucket_start: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub quantity: ::prost::alloc::string::String,
    #[prost(string, tag="3")]
    pub entry_price: ::prost::alloc::string::String,
    #[prost(string, tag="4")]
    pub mark_price: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub unrealized_pnl: ::prost::alloc::string::String,
    #[prost(string, tag="6")]
    pub cum_realized_pnl: ::prost::alloc::string::String,
    #[prost(string, tag="7")]
    pub cum_funding_paid: ::prost::alloc::string::String,
    #[prost(string, tag="8")]
    pub cum_fees: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetPositionPnlHistoryResponse {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, tag="2")]
    pub interval: ::prost::alloc::string::String,
    #[prost(message, repeated, tag="3")]
    pub data: ::prost::alloc::vec::Vec<PositionPnlPoint>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct TpSlLeg {
    #[prost(string, tag="1")]
    pub trigger_price: ::prost::alloc::string::String,
    /// MARKET or LIMIT
    #[prost(string, tag="2")]
    pub order_type: ::prost::alloc::string::String,
    #[prost(string, optional, tag="3")]
    pub limit_price: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="4")]
    pub quantity: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="5")]
    pub time_in_force: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(int32, optional, tag="6")]
    pub slippage_tolerance_bps: ::core::option::Option<i32>,
    #[prost(string, optional, tag="7")]
    pub expires_at: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AttachPositionTpSlRequest {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(message, optional, tag="2")]
    pub take_profit: ::core::option::Option<TpSlLeg>,
    #[prost(message, optional, tag="3")]
    pub stop_loss: ::core::option::Option<TpSlLeg>,
}
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AttachPositionTpSlResponse {
    #[prost(string, tag="1")]
    pub position_id: ::prost::alloc::string::String,
    #[prost(string, optional, tag="2")]
    pub take_profit_order_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, optional, tag="3")]
    pub stop_loss_order_id: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(string, tag="4")]
    pub status: ::prost::alloc::string::String,
    #[prost(string, tag="5")]
    pub message: ::prost::alloc::string::String,
}
include!("monaco.api.positions.tonic.rs");
// @@protoc_insertion_point(module)