x-twitter-scraper 0.6.0 → 0.7.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/lib/x_twitter_scraper/internal/type/union.rb +25 -9
- data/lib/x_twitter_scraper/models/content_disclosure.rb +1 -9
- data/lib/x_twitter_scraper/models/embedded_tweet.rb +389 -1
- data/lib/x_twitter_scraper/models/paginated_tweets.rb +4 -5
- data/lib/x_twitter_scraper/models/search_tweet.rb +371 -1
- data/lib/x_twitter_scraper/models/support/ticket_list_response.rb +30 -17
- data/lib/x_twitter_scraper/models/support/ticket_retrieve_response.rb +49 -24
- data/lib/x_twitter_scraper/models/support/ticket_update_response.rb +18 -6
- data/lib/x_twitter_scraper/models/trend_list_response.rb +28 -1
- data/lib/x_twitter_scraper/models/tweet_media.rb +213 -1
- data/lib/x_twitter_scraper/models/user_profile.rb +211 -21
- data/lib/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rb +60 -26
- data/lib/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rb +4 -4
- data/lib/x_twitter_scraper/models/x/account_create_response.rb +149 -2
- data/lib/x_twitter_scraper/models/x/account_reauth_response.rb +4 -4
- data/lib/x_twitter_scraper/models/x/communities/tweet_list_by_community_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/communities/tweet_list_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/community_retrieve_info_response.rb +1 -17
- data/lib/x_twitter_scraper/models/x/community_retrieve_search_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/list_retrieve_tweets_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/tweet_author.rb +14 -1
- data/lib/x_twitter_scraper/models/x/tweet_detail.rb +373 -1
- data/lib/x_twitter_scraper/models/x/tweet_get_quotes_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/tweet_get_replies_params.rb +34 -6
- data/lib/x_twitter_scraper/models/x/tweet_get_replies_response.rb +345 -0
- data/lib/x_twitter_scraper/models/x/tweet_get_thread_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/user_retrieve_likes_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/user_retrieve_media_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/user_retrieve_mentions_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/user_retrieve_replies_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x/user_retrieve_tweets_params.rb +3 -5
- data/lib/x_twitter_scraper/models/x_get_article_response.rb +1 -7
- data/lib/x_twitter_scraper/models/x_get_trends_response.rb +28 -1
- data/lib/x_twitter_scraper/resources/x/account_connection_attempts.rb +1 -1
- data/lib/x_twitter_scraper/resources/x/accounts.rb +2 -2
- data/lib/x_twitter_scraper/resources/x/communities/tweets.rb +2 -2
- data/lib/x_twitter_scraper/resources/x/communities.rb +1 -1
- data/lib/x_twitter_scraper/resources/x/lists.rb +1 -1
- data/lib/x_twitter_scraper/resources/x/tweets.rb +14 -11
- data/lib/x_twitter_scraper/resources/x/users.rb +5 -5
- data/lib/x_twitter_scraper/version.rb +1 -1
- data/lib/x_twitter_scraper.rb +2 -1
- data/rbi/x_twitter_scraper/models/content_disclosure.rbi +1 -15
- data/rbi/x_twitter_scraper/models/embedded_tweet.rbi +708 -3
- data/rbi/x_twitter_scraper/models/paginated_tweets.rbi +4 -5
- data/rbi/x_twitter_scraper/models/search_tweet.rbi +674 -3
- data/rbi/x_twitter_scraper/models/support/ticket_list_response.rbi +75 -55
- data/rbi/x_twitter_scraper/models/support/ticket_retrieve_response.rbi +129 -87
- data/rbi/x_twitter_scraper/models/support/ticket_update_response.rbi +62 -13
- data/rbi/x_twitter_scraper/models/trend_list_response.rbi +40 -3
- data/rbi/x_twitter_scraper/models/tweet_media.rbi +313 -3
- data/rbi/x_twitter_scraper/models/user_profile.rbi +340 -29
- data/rbi/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rbi +61 -83
- data/rbi/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rbi +6 -6
- data/rbi/x_twitter_scraper/models/x/account_create_response.rbi +264 -2
- data/rbi/x_twitter_scraper/models/x/account_reauth_response.rbi +6 -6
- data/rbi/x_twitter_scraper/models/x/communities/tweet_list_by_community_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/communities/tweet_list_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/community_retrieve_info_response.rbi +0 -22
- data/rbi/x_twitter_scraper/models/x/community_retrieve_search_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/list_retrieve_tweets_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/tweet_author.rbi +13 -3
- data/rbi/x_twitter_scraper/models/x/tweet_detail.rbi +690 -3
- data/rbi/x_twitter_scraper/models/x/tweet_get_quotes_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/tweet_get_replies_params.rbi +68 -8
- data/rbi/x_twitter_scraper/models/x/tweet_get_replies_response.rbi +527 -0
- data/rbi/x_twitter_scraper/models/x/tweet_get_thread_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/user_retrieve_likes_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/user_retrieve_media_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/user_retrieve_mentions_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/user_retrieve_replies_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x/user_retrieve_tweets_params.rbi +4 -8
- data/rbi/x_twitter_scraper/models/x_get_article_response.rbi +0 -9
- data/rbi/x_twitter_scraper/models/x_get_trends_response.rbi +40 -3
- data/rbi/x_twitter_scraper/resources/x/accounts.rbi +1 -1
- data/rbi/x_twitter_scraper/resources/x/communities/tweets.rbi +4 -8
- data/rbi/x_twitter_scraper/resources/x/communities.rbi +2 -4
- data/rbi/x_twitter_scraper/resources/x/lists.rbi +2 -4
- data/rbi/x_twitter_scraper/resources/x/tweets.rbi +20 -18
- data/rbi/x_twitter_scraper/resources/x/users.rbi +10 -20
- data/sig/x_twitter_scraper/models/content_disclosure.rbs +1 -11
- data/sig/x_twitter_scraper/models/embedded_tweet.rbs +343 -62
- data/sig/x_twitter_scraper/models/search_tweet.rbs +333 -70
- data/sig/x_twitter_scraper/models/support/ticket_list_response.rbs +29 -32
- data/sig/x_twitter_scraper/models/support/ticket_retrieve_response.rbs +49 -48
- data/sig/x_twitter_scraper/models/support/ticket_update_response.rbs +25 -7
- data/sig/x_twitter_scraper/models/trend_list_response.rbs +16 -20
- data/sig/x_twitter_scraper/models/tweet_media.rbs +146 -15
- data/sig/x_twitter_scraper/models/user_profile.rbs +164 -86
- data/sig/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rbs +50 -33
- data/sig/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rbs +5 -5
- data/sig/x_twitter_scraper/models/x/account_create_response.rbs +147 -1
- data/sig/x_twitter_scraper/models/x/account_reauth_response.rbs +5 -5
- data/sig/x_twitter_scraper/models/x/community_retrieve_info_response.rbs +0 -14
- data/sig/x_twitter_scraper/models/x/tweet_author.rbs +11 -3
- data/sig/x_twitter_scraper/models/x/tweet_detail.rbs +333 -70
- data/sig/x_twitter_scraper/models/x/tweet_get_replies_params.rbs +26 -0
- data/sig/x_twitter_scraper/models/x/tweet_get_replies_response.rbs +274 -0
- data/sig/x_twitter_scraper/models/x_get_article_response.rbs +0 -7
- data/sig/x_twitter_scraper/models/x_get_trends_response.rbs +25 -3
- data/sig/x_twitter_scraper/resources/x/accounts.rbs +1 -1
- data/sig/x_twitter_scraper/resources/x/tweets.rbs +3 -1
- metadata +4 -1
|
@@ -39,6 +39,15 @@ module XTwitterScraper
|
|
|
39
39
|
sig { returns(Integer) }
|
|
40
40
|
attr_accessor :view_count
|
|
41
41
|
|
|
42
|
+
# Article metadata attached to a tweet.
|
|
43
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::Article)) }
|
|
44
|
+
attr_reader :article
|
|
45
|
+
|
|
46
|
+
sig do
|
|
47
|
+
params(article: XTwitterScraper::EmbeddedTweet::Article::OrHash).void
|
|
48
|
+
end
|
|
49
|
+
attr_writer :article
|
|
50
|
+
|
|
42
51
|
# X user profile with bio, follower counts, and verification status.
|
|
43
52
|
sig { returns(T.nilable(XTwitterScraper::UserProfile)) }
|
|
44
53
|
attr_reader :author
|
|
@@ -46,6 +55,24 @@ module XTwitterScraper
|
|
|
46
55
|
sig { params(author: XTwitterScraper::UserProfile::OrHash).void }
|
|
47
56
|
attr_writer :author
|
|
48
57
|
|
|
58
|
+
# Public card metadata attached to a tweet.
|
|
59
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::Card)) }
|
|
60
|
+
attr_reader :card
|
|
61
|
+
|
|
62
|
+
sig { params(card: XTwitterScraper::EmbeddedTweet::Card::OrHash).void }
|
|
63
|
+
attr_writer :card
|
|
64
|
+
|
|
65
|
+
# Community Note presentation metadata returned by X.
|
|
66
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::CommunityNote)) }
|
|
67
|
+
attr_reader :community_note
|
|
68
|
+
|
|
69
|
+
sig do
|
|
70
|
+
params(
|
|
71
|
+
community_note: XTwitterScraper::EmbeddedTweet::CommunityNote::OrHash
|
|
72
|
+
).void
|
|
73
|
+
end
|
|
74
|
+
attr_writer :community_note
|
|
75
|
+
|
|
49
76
|
# Content disclosure metadata shown by X when a tweet is labeled as paid
|
|
50
77
|
# partnership content or AI-generated media.
|
|
51
78
|
sig { returns(T.nilable(XTwitterScraper::ContentDisclosure)) }
|
|
@@ -76,6 +103,13 @@ module XTwitterScraper
|
|
|
76
103
|
sig { params(display_text_range: T::Array[Integer]).void }
|
|
77
104
|
attr_writer :display_text_range
|
|
78
105
|
|
|
106
|
+
# Edit history metadata returned by X.
|
|
107
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::Edit)) }
|
|
108
|
+
attr_reader :edit
|
|
109
|
+
|
|
110
|
+
sig { params(edit: XTwitterScraper::EmbeddedTweet::Edit::OrHash).void }
|
|
111
|
+
attr_writer :edit
|
|
112
|
+
|
|
79
113
|
sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
|
|
80
114
|
attr_reader :entities
|
|
81
115
|
|
|
@@ -124,6 +158,12 @@ module XTwitterScraper
|
|
|
124
158
|
sig { params(is_reply: T::Boolean).void }
|
|
125
159
|
attr_writer :is_reply
|
|
126
160
|
|
|
161
|
+
sig { returns(T.nilable(T::Boolean)) }
|
|
162
|
+
attr_reader :is_translatable
|
|
163
|
+
|
|
164
|
+
sig { params(is_translatable: T::Boolean).void }
|
|
165
|
+
attr_writer :is_translatable
|
|
166
|
+
|
|
127
167
|
sig { returns(T.nilable(String)) }
|
|
128
168
|
attr_reader :lang
|
|
129
169
|
|
|
@@ -136,6 +176,60 @@ module XTwitterScraper
|
|
|
136
176
|
sig { params(media: T::Array[XTwitterScraper::TweetMedia::OrHash]).void }
|
|
137
177
|
attr_writer :media
|
|
138
178
|
|
|
179
|
+
# Complete Note Tweet content and rich-text metadata.
|
|
180
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::NoteTweet)) }
|
|
181
|
+
attr_reader :note_tweet
|
|
182
|
+
|
|
183
|
+
sig do
|
|
184
|
+
params(
|
|
185
|
+
note_tweet: XTwitterScraper::EmbeddedTweet::NoteTweet::OrHash
|
|
186
|
+
).void
|
|
187
|
+
end
|
|
188
|
+
attr_writer :note_tweet
|
|
189
|
+
|
|
190
|
+
# Public place metadata attached to a tweet.
|
|
191
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::Place)) }
|
|
192
|
+
attr_reader :place
|
|
193
|
+
|
|
194
|
+
sig { params(place: XTwitterScraper::EmbeddedTweet::Place::OrHash).void }
|
|
195
|
+
attr_writer :place
|
|
196
|
+
|
|
197
|
+
sig { returns(T.nilable(T::Boolean)) }
|
|
198
|
+
attr_reader :possibly_sensitive
|
|
199
|
+
|
|
200
|
+
sig { params(possibly_sensitive: T::Boolean).void }
|
|
201
|
+
attr_writer :possibly_sensitive
|
|
202
|
+
|
|
203
|
+
# Engagement counts retained from a prior tweet edit.
|
|
204
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet::PreviousCounts)) }
|
|
205
|
+
attr_reader :previous_counts
|
|
206
|
+
|
|
207
|
+
sig do
|
|
208
|
+
params(
|
|
209
|
+
previous_counts:
|
|
210
|
+
XTwitterScraper::EmbeddedTweet::PreviousCounts::OrHash
|
|
211
|
+
).void
|
|
212
|
+
end
|
|
213
|
+
attr_writer :previous_counts
|
|
214
|
+
|
|
215
|
+
# Quoted or retweeted tweet context. Every object includes id, text, and
|
|
216
|
+
# engagement metrics. A zero metric can mean X did not report the count. Author,
|
|
217
|
+
# media, and conversation fields appear when available.
|
|
218
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet)) }
|
|
219
|
+
attr_reader :quoted_tweet
|
|
220
|
+
|
|
221
|
+
sig { params(quoted_tweet: XTwitterScraper::EmbeddedTweet).void }
|
|
222
|
+
attr_writer :quoted_tweet
|
|
223
|
+
|
|
224
|
+
# Quoted or retweeted tweet context. Every object includes id, text, and
|
|
225
|
+
# engagement metrics. A zero metric can mean X did not report the count. Author,
|
|
226
|
+
# media, and conversation fields appear when available.
|
|
227
|
+
sig { returns(T.nilable(XTwitterScraper::EmbeddedTweet)) }
|
|
228
|
+
attr_reader :retweeted_tweet
|
|
229
|
+
|
|
230
|
+
sig { params(retweeted_tweet: XTwitterScraper::EmbeddedTweet).void }
|
|
231
|
+
attr_writer :retweeted_tweet
|
|
232
|
+
|
|
139
233
|
sig { returns(T.nilable(String)) }
|
|
140
234
|
attr_reader :source
|
|
141
235
|
|
|
@@ -154,6 +248,12 @@ module XTwitterScraper
|
|
|
154
248
|
sig { params(url: String).void }
|
|
155
249
|
attr_writer :url
|
|
156
250
|
|
|
251
|
+
sig { returns(T.nilable(String)) }
|
|
252
|
+
attr_reader :view_state
|
|
253
|
+
|
|
254
|
+
sig { params(view_state: String).void }
|
|
255
|
+
attr_writer :view_state
|
|
256
|
+
|
|
157
257
|
# Quoted or retweeted tweet context. Every object includes id, text, and
|
|
158
258
|
# engagement metrics. A zero metric can mean X did not report the count. Author,
|
|
159
259
|
# media, and conversation fields appear when available.
|
|
@@ -167,11 +267,15 @@ module XTwitterScraper
|
|
|
167
267
|
retweet_count: Integer,
|
|
168
268
|
text: String,
|
|
169
269
|
view_count: Integer,
|
|
270
|
+
article: XTwitterScraper::EmbeddedTweet::Article::OrHash,
|
|
170
271
|
author: XTwitterScraper::UserProfile::OrHash,
|
|
272
|
+
card: XTwitterScraper::EmbeddedTweet::Card::OrHash,
|
|
273
|
+
community_note: XTwitterScraper::EmbeddedTweet::CommunityNote::OrHash,
|
|
171
274
|
content_disclosure: XTwitterScraper::ContentDisclosure::OrHash,
|
|
172
275
|
conversation_id: String,
|
|
173
276
|
created_at: String,
|
|
174
277
|
display_text_range: T::Array[Integer],
|
|
278
|
+
edit: XTwitterScraper::EmbeddedTweet::Edit::OrHash,
|
|
175
279
|
entities: T::Hash[Symbol, T.anything],
|
|
176
280
|
in_reply_to_id: String,
|
|
177
281
|
in_reply_to_user_id: String,
|
|
@@ -180,11 +284,20 @@ module XTwitterScraper
|
|
|
180
284
|
is_note_tweet: T::Boolean,
|
|
181
285
|
is_quote_status: T::Boolean,
|
|
182
286
|
is_reply: T::Boolean,
|
|
287
|
+
is_translatable: T::Boolean,
|
|
183
288
|
lang: String,
|
|
184
289
|
media: T::Array[XTwitterScraper::TweetMedia::OrHash],
|
|
290
|
+
note_tweet: XTwitterScraper::EmbeddedTweet::NoteTweet::OrHash,
|
|
291
|
+
place: XTwitterScraper::EmbeddedTweet::Place::OrHash,
|
|
292
|
+
possibly_sensitive: T::Boolean,
|
|
293
|
+
previous_counts:
|
|
294
|
+
XTwitterScraper::EmbeddedTweet::PreviousCounts::OrHash,
|
|
295
|
+
quoted_tweet: XTwitterScraper::EmbeddedTweet,
|
|
296
|
+
retweeted_tweet: XTwitterScraper::EmbeddedTweet,
|
|
185
297
|
source: String,
|
|
186
298
|
type: String,
|
|
187
|
-
url: String
|
|
299
|
+
url: String,
|
|
300
|
+
view_state: String
|
|
188
301
|
).returns(T.attached_class)
|
|
189
302
|
end
|
|
190
303
|
def self.new(
|
|
@@ -196,14 +309,22 @@ module XTwitterScraper
|
|
|
196
309
|
retweet_count:,
|
|
197
310
|
text:,
|
|
198
311
|
view_count:,
|
|
312
|
+
# Article metadata attached to a tweet.
|
|
313
|
+
article: nil,
|
|
199
314
|
# X user profile with bio, follower counts, and verification status.
|
|
200
315
|
author: nil,
|
|
316
|
+
# Public card metadata attached to a tweet.
|
|
317
|
+
card: nil,
|
|
318
|
+
# Community Note presentation metadata returned by X.
|
|
319
|
+
community_note: nil,
|
|
201
320
|
# Content disclosure metadata shown by X when a tweet is labeled as paid
|
|
202
321
|
# partnership content or AI-generated media.
|
|
203
322
|
content_disclosure: nil,
|
|
204
323
|
conversation_id: nil,
|
|
205
324
|
created_at: nil,
|
|
206
325
|
display_text_range: nil,
|
|
326
|
+
# Edit history metadata returned by X.
|
|
327
|
+
edit: nil,
|
|
207
328
|
entities: nil,
|
|
208
329
|
in_reply_to_id: nil,
|
|
209
330
|
in_reply_to_user_id: nil,
|
|
@@ -212,11 +333,28 @@ module XTwitterScraper
|
|
|
212
333
|
is_note_tweet: nil,
|
|
213
334
|
is_quote_status: nil,
|
|
214
335
|
is_reply: nil,
|
|
336
|
+
is_translatable: nil,
|
|
215
337
|
lang: nil,
|
|
216
338
|
media: nil,
|
|
339
|
+
# Complete Note Tweet content and rich-text metadata.
|
|
340
|
+
note_tweet: nil,
|
|
341
|
+
# Public place metadata attached to a tweet.
|
|
342
|
+
place: nil,
|
|
343
|
+
possibly_sensitive: nil,
|
|
344
|
+
# Engagement counts retained from a prior tweet edit.
|
|
345
|
+
previous_counts: nil,
|
|
346
|
+
# Quoted or retweeted tweet context. Every object includes id, text, and
|
|
347
|
+
# engagement metrics. A zero metric can mean X did not report the count. Author,
|
|
348
|
+
# media, and conversation fields appear when available.
|
|
349
|
+
quoted_tweet: nil,
|
|
350
|
+
# Quoted or retweeted tweet context. Every object includes id, text, and
|
|
351
|
+
# engagement metrics. A zero metric can mean X did not report the count. Author,
|
|
352
|
+
# media, and conversation fields appear when available.
|
|
353
|
+
retweeted_tweet: nil,
|
|
217
354
|
source: nil,
|
|
218
355
|
type: nil,
|
|
219
|
-
url: nil
|
|
356
|
+
url: nil,
|
|
357
|
+
view_state: nil
|
|
220
358
|
)
|
|
221
359
|
end
|
|
222
360
|
|
|
@@ -231,11 +369,15 @@ module XTwitterScraper
|
|
|
231
369
|
retweet_count: Integer,
|
|
232
370
|
text: String,
|
|
233
371
|
view_count: Integer,
|
|
372
|
+
article: XTwitterScraper::EmbeddedTweet::Article,
|
|
234
373
|
author: XTwitterScraper::UserProfile,
|
|
374
|
+
card: XTwitterScraper::EmbeddedTweet::Card,
|
|
375
|
+
community_note: XTwitterScraper::EmbeddedTweet::CommunityNote,
|
|
235
376
|
content_disclosure: XTwitterScraper::ContentDisclosure,
|
|
236
377
|
conversation_id: String,
|
|
237
378
|
created_at: String,
|
|
238
379
|
display_text_range: T::Array[Integer],
|
|
380
|
+
edit: XTwitterScraper::EmbeddedTweet::Edit,
|
|
239
381
|
entities: T::Hash[Symbol, T.anything],
|
|
240
382
|
in_reply_to_id: String,
|
|
241
383
|
in_reply_to_user_id: String,
|
|
@@ -244,16 +386,579 @@ module XTwitterScraper
|
|
|
244
386
|
is_note_tweet: T::Boolean,
|
|
245
387
|
is_quote_status: T::Boolean,
|
|
246
388
|
is_reply: T::Boolean,
|
|
389
|
+
is_translatable: T::Boolean,
|
|
247
390
|
lang: String,
|
|
248
391
|
media: T::Array[XTwitterScraper::TweetMedia],
|
|
392
|
+
note_tweet: XTwitterScraper::EmbeddedTweet::NoteTweet,
|
|
393
|
+
place: XTwitterScraper::EmbeddedTweet::Place,
|
|
394
|
+
possibly_sensitive: T::Boolean,
|
|
395
|
+
previous_counts: XTwitterScraper::EmbeddedTweet::PreviousCounts,
|
|
396
|
+
quoted_tweet: XTwitterScraper::EmbeddedTweet,
|
|
397
|
+
retweeted_tweet: XTwitterScraper::EmbeddedTweet,
|
|
249
398
|
source: String,
|
|
250
399
|
type: String,
|
|
251
|
-
url: String
|
|
400
|
+
url: String,
|
|
401
|
+
view_state: String
|
|
252
402
|
}
|
|
253
403
|
)
|
|
254
404
|
end
|
|
255
405
|
def to_hash
|
|
256
406
|
end
|
|
407
|
+
|
|
408
|
+
class Article < XTwitterScraper::Internal::Type::BaseModel
|
|
409
|
+
OrHash =
|
|
410
|
+
T.type_alias do
|
|
411
|
+
T.any(
|
|
412
|
+
XTwitterScraper::EmbeddedTweet::Article,
|
|
413
|
+
XTwitterScraper::Internal::AnyHash
|
|
414
|
+
)
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
sig { returns(T.nilable(String)) }
|
|
418
|
+
attr_reader :id
|
|
419
|
+
|
|
420
|
+
sig { params(id: String).void }
|
|
421
|
+
attr_writer :id
|
|
422
|
+
|
|
423
|
+
sig { returns(T.nilable(String)) }
|
|
424
|
+
attr_reader :cover_media_url
|
|
425
|
+
|
|
426
|
+
sig { params(cover_media_url: String).void }
|
|
427
|
+
attr_writer :cover_media_url
|
|
428
|
+
|
|
429
|
+
sig { returns(T.nilable(String)) }
|
|
430
|
+
attr_reader :preview_text
|
|
431
|
+
|
|
432
|
+
sig { params(preview_text: String).void }
|
|
433
|
+
attr_writer :preview_text
|
|
434
|
+
|
|
435
|
+
sig { returns(T.nilable(String)) }
|
|
436
|
+
attr_reader :title
|
|
437
|
+
|
|
438
|
+
sig { params(title: String).void }
|
|
439
|
+
attr_writer :title
|
|
440
|
+
|
|
441
|
+
# Article metadata attached to a tweet.
|
|
442
|
+
sig do
|
|
443
|
+
params(
|
|
444
|
+
id: String,
|
|
445
|
+
cover_media_url: String,
|
|
446
|
+
preview_text: String,
|
|
447
|
+
title: String
|
|
448
|
+
).returns(T.attached_class)
|
|
449
|
+
end
|
|
450
|
+
def self.new(
|
|
451
|
+
id: nil,
|
|
452
|
+
cover_media_url: nil,
|
|
453
|
+
preview_text: nil,
|
|
454
|
+
title: nil
|
|
455
|
+
)
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
sig do
|
|
459
|
+
override.returns(
|
|
460
|
+
{
|
|
461
|
+
id: String,
|
|
462
|
+
cover_media_url: String,
|
|
463
|
+
preview_text: String,
|
|
464
|
+
title: String
|
|
465
|
+
}
|
|
466
|
+
)
|
|
467
|
+
end
|
|
468
|
+
def to_hash
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
class Card < XTwitterScraper::Internal::Type::BaseModel
|
|
473
|
+
OrHash =
|
|
474
|
+
T.type_alias do
|
|
475
|
+
T.any(
|
|
476
|
+
XTwitterScraper::EmbeddedTweet::Card,
|
|
477
|
+
XTwitterScraper::Internal::AnyHash
|
|
478
|
+
)
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
sig { returns(T.nilable(String)) }
|
|
482
|
+
attr_reader :id
|
|
483
|
+
|
|
484
|
+
sig { params(id: String).void }
|
|
485
|
+
attr_writer :id
|
|
486
|
+
|
|
487
|
+
sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
|
|
488
|
+
attr_reader :binding_values
|
|
489
|
+
|
|
490
|
+
sig { params(binding_values: T::Hash[Symbol, T.anything]).void }
|
|
491
|
+
attr_writer :binding_values
|
|
492
|
+
|
|
493
|
+
sig { returns(T.nilable(String)) }
|
|
494
|
+
attr_reader :name
|
|
495
|
+
|
|
496
|
+
sig { params(name: String).void }
|
|
497
|
+
attr_writer :name
|
|
498
|
+
|
|
499
|
+
sig { returns(T.nilable(String)) }
|
|
500
|
+
attr_reader :url
|
|
501
|
+
|
|
502
|
+
sig { params(url: String).void }
|
|
503
|
+
attr_writer :url
|
|
504
|
+
|
|
505
|
+
# Public card metadata attached to a tweet.
|
|
506
|
+
sig do
|
|
507
|
+
params(
|
|
508
|
+
id: String,
|
|
509
|
+
binding_values: T::Hash[Symbol, T.anything],
|
|
510
|
+
name: String,
|
|
511
|
+
url: String
|
|
512
|
+
).returns(T.attached_class)
|
|
513
|
+
end
|
|
514
|
+
def self.new(id: nil, binding_values: nil, name: nil, url: nil)
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
sig do
|
|
518
|
+
override.returns(
|
|
519
|
+
{
|
|
520
|
+
id: String,
|
|
521
|
+
binding_values: T::Hash[Symbol, T.anything],
|
|
522
|
+
name: String,
|
|
523
|
+
url: String
|
|
524
|
+
}
|
|
525
|
+
)
|
|
526
|
+
end
|
|
527
|
+
def to_hash
|
|
528
|
+
end
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
class CommunityNote < XTwitterScraper::Internal::Type::BaseModel
|
|
532
|
+
OrHash =
|
|
533
|
+
T.type_alias do
|
|
534
|
+
T.any(
|
|
535
|
+
XTwitterScraper::EmbeddedTweet::CommunityNote,
|
|
536
|
+
XTwitterScraper::Internal::AnyHash
|
|
537
|
+
)
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
sig { returns(T.nilable(String)) }
|
|
541
|
+
attr_reader :id
|
|
542
|
+
|
|
543
|
+
sig { params(id: String).void }
|
|
544
|
+
attr_writer :id
|
|
545
|
+
|
|
546
|
+
sig { returns(T.nilable(String)) }
|
|
547
|
+
attr_reader :destination_url
|
|
548
|
+
|
|
549
|
+
sig { params(destination_url: String).void }
|
|
550
|
+
attr_writer :destination_url
|
|
551
|
+
|
|
552
|
+
sig { returns(T.nilable(String)) }
|
|
553
|
+
attr_reader :footer
|
|
554
|
+
|
|
555
|
+
sig { params(footer: String).void }
|
|
556
|
+
attr_writer :footer
|
|
557
|
+
|
|
558
|
+
sig { returns(T.nilable(String)) }
|
|
559
|
+
attr_reader :short_title
|
|
560
|
+
|
|
561
|
+
sig { params(short_title: String).void }
|
|
562
|
+
attr_writer :short_title
|
|
563
|
+
|
|
564
|
+
sig { returns(T.nilable(String)) }
|
|
565
|
+
attr_reader :subtitle
|
|
566
|
+
|
|
567
|
+
sig { params(subtitle: String).void }
|
|
568
|
+
attr_writer :subtitle
|
|
569
|
+
|
|
570
|
+
sig { returns(T.nilable(String)) }
|
|
571
|
+
attr_reader :title
|
|
572
|
+
|
|
573
|
+
sig { params(title: String).void }
|
|
574
|
+
attr_writer :title
|
|
575
|
+
|
|
576
|
+
sig { returns(T.nilable(String)) }
|
|
577
|
+
attr_reader :visual_style
|
|
578
|
+
|
|
579
|
+
sig { params(visual_style: String).void }
|
|
580
|
+
attr_writer :visual_style
|
|
581
|
+
|
|
582
|
+
# Community Note presentation metadata returned by X.
|
|
583
|
+
sig do
|
|
584
|
+
params(
|
|
585
|
+
id: String,
|
|
586
|
+
destination_url: String,
|
|
587
|
+
footer: String,
|
|
588
|
+
short_title: String,
|
|
589
|
+
subtitle: String,
|
|
590
|
+
title: String,
|
|
591
|
+
visual_style: String
|
|
592
|
+
).returns(T.attached_class)
|
|
593
|
+
end
|
|
594
|
+
def self.new(
|
|
595
|
+
id: nil,
|
|
596
|
+
destination_url: nil,
|
|
597
|
+
footer: nil,
|
|
598
|
+
short_title: nil,
|
|
599
|
+
subtitle: nil,
|
|
600
|
+
title: nil,
|
|
601
|
+
visual_style: nil
|
|
602
|
+
)
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
sig do
|
|
606
|
+
override.returns(
|
|
607
|
+
{
|
|
608
|
+
id: String,
|
|
609
|
+
destination_url: String,
|
|
610
|
+
footer: String,
|
|
611
|
+
short_title: String,
|
|
612
|
+
subtitle: String,
|
|
613
|
+
title: String,
|
|
614
|
+
visual_style: String
|
|
615
|
+
}
|
|
616
|
+
)
|
|
617
|
+
end
|
|
618
|
+
def to_hash
|
|
619
|
+
end
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
class Edit < XTwitterScraper::Internal::Type::BaseModel
|
|
623
|
+
OrHash =
|
|
624
|
+
T.type_alias do
|
|
625
|
+
T.any(
|
|
626
|
+
XTwitterScraper::EmbeddedTweet::Edit,
|
|
627
|
+
XTwitterScraper::Internal::AnyHash
|
|
628
|
+
)
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
sig { returns(T.nilable(String)) }
|
|
632
|
+
attr_reader :editable_until_msecs
|
|
633
|
+
|
|
634
|
+
sig { params(editable_until_msecs: String).void }
|
|
635
|
+
attr_writer :editable_until_msecs
|
|
636
|
+
|
|
637
|
+
sig { returns(T.nilable(T::Array[String])) }
|
|
638
|
+
attr_reader :edit_tweet_ids
|
|
639
|
+
|
|
640
|
+
sig { params(edit_tweet_ids: T::Array[String]).void }
|
|
641
|
+
attr_writer :edit_tweet_ids
|
|
642
|
+
|
|
643
|
+
# Edit history metadata returned by X.
|
|
644
|
+
sig do
|
|
645
|
+
params(
|
|
646
|
+
editable_until_msecs: String,
|
|
647
|
+
edit_tweet_ids: T::Array[String]
|
|
648
|
+
).returns(T.attached_class)
|
|
649
|
+
end
|
|
650
|
+
def self.new(editable_until_msecs: nil, edit_tweet_ids: nil)
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
sig do
|
|
654
|
+
override.returns(
|
|
655
|
+
{ editable_until_msecs: String, edit_tweet_ids: T::Array[String] }
|
|
656
|
+
)
|
|
657
|
+
end
|
|
658
|
+
def to_hash
|
|
659
|
+
end
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
class NoteTweet < XTwitterScraper::Internal::Type::BaseModel
|
|
663
|
+
OrHash =
|
|
664
|
+
T.type_alias do
|
|
665
|
+
T.any(
|
|
666
|
+
XTwitterScraper::EmbeddedTweet::NoteTweet,
|
|
667
|
+
XTwitterScraper::Internal::AnyHash
|
|
668
|
+
)
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
sig { returns(String) }
|
|
672
|
+
attr_accessor :text
|
|
673
|
+
|
|
674
|
+
sig { returns(T.nilable(String)) }
|
|
675
|
+
attr_reader :id
|
|
676
|
+
|
|
677
|
+
sig { params(id: String).void }
|
|
678
|
+
attr_writer :id
|
|
679
|
+
|
|
680
|
+
sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
|
|
681
|
+
attr_reader :entities
|
|
682
|
+
|
|
683
|
+
sig { params(entities: T::Hash[Symbol, T.anything]).void }
|
|
684
|
+
attr_writer :entities
|
|
685
|
+
|
|
686
|
+
sig { returns(T.nilable(T::Boolean)) }
|
|
687
|
+
attr_reader :is_expandable
|
|
688
|
+
|
|
689
|
+
sig { params(is_expandable: T::Boolean).void }
|
|
690
|
+
attr_writer :is_expandable
|
|
691
|
+
|
|
692
|
+
sig do
|
|
693
|
+
returns(
|
|
694
|
+
T.nilable(
|
|
695
|
+
T::Array[XTwitterScraper::EmbeddedTweet::NoteTweet::RichtextTag]
|
|
696
|
+
)
|
|
697
|
+
)
|
|
698
|
+
end
|
|
699
|
+
attr_reader :richtext_tags
|
|
700
|
+
|
|
701
|
+
sig do
|
|
702
|
+
params(
|
|
703
|
+
richtext_tags:
|
|
704
|
+
T::Array[
|
|
705
|
+
XTwitterScraper::EmbeddedTweet::NoteTweet::RichtextTag::OrHash
|
|
706
|
+
]
|
|
707
|
+
).void
|
|
708
|
+
end
|
|
709
|
+
attr_writer :richtext_tags
|
|
710
|
+
|
|
711
|
+
# Complete Note Tweet content and rich-text metadata.
|
|
712
|
+
sig do
|
|
713
|
+
params(
|
|
714
|
+
text: String,
|
|
715
|
+
id: String,
|
|
716
|
+
entities: T::Hash[Symbol, T.anything],
|
|
717
|
+
is_expandable: T::Boolean,
|
|
718
|
+
richtext_tags:
|
|
719
|
+
T::Array[
|
|
720
|
+
XTwitterScraper::EmbeddedTweet::NoteTweet::RichtextTag::OrHash
|
|
721
|
+
]
|
|
722
|
+
).returns(T.attached_class)
|
|
723
|
+
end
|
|
724
|
+
def self.new(
|
|
725
|
+
text:,
|
|
726
|
+
id: nil,
|
|
727
|
+
entities: nil,
|
|
728
|
+
is_expandable: nil,
|
|
729
|
+
richtext_tags: nil
|
|
730
|
+
)
|
|
731
|
+
end
|
|
732
|
+
|
|
733
|
+
sig do
|
|
734
|
+
override.returns(
|
|
735
|
+
{
|
|
736
|
+
text: String,
|
|
737
|
+
id: String,
|
|
738
|
+
entities: T::Hash[Symbol, T.anything],
|
|
739
|
+
is_expandable: T::Boolean,
|
|
740
|
+
richtext_tags:
|
|
741
|
+
T::Array[XTwitterScraper::EmbeddedTweet::NoteTweet::RichtextTag]
|
|
742
|
+
}
|
|
743
|
+
)
|
|
744
|
+
end
|
|
745
|
+
def to_hash
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
class RichtextTag < XTwitterScraper::Internal::Type::BaseModel
|
|
749
|
+
OrHash =
|
|
750
|
+
T.type_alias do
|
|
751
|
+
T.any(
|
|
752
|
+
XTwitterScraper::EmbeddedTweet::NoteTweet::RichtextTag,
|
|
753
|
+
XTwitterScraper::Internal::AnyHash
|
|
754
|
+
)
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
sig { returns(Integer) }
|
|
758
|
+
attr_accessor :from_index
|
|
759
|
+
|
|
760
|
+
sig { returns(Integer) }
|
|
761
|
+
attr_accessor :to_index
|
|
762
|
+
|
|
763
|
+
sig { returns(T::Array[String]) }
|
|
764
|
+
attr_accessor :types
|
|
765
|
+
|
|
766
|
+
sig do
|
|
767
|
+
params(
|
|
768
|
+
from_index: Integer,
|
|
769
|
+
to_index: Integer,
|
|
770
|
+
types: T::Array[String]
|
|
771
|
+
).returns(T.attached_class)
|
|
772
|
+
end
|
|
773
|
+
def self.new(from_index:, to_index:, types:)
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
sig do
|
|
777
|
+
override.returns(
|
|
778
|
+
{
|
|
779
|
+
from_index: Integer,
|
|
780
|
+
to_index: Integer,
|
|
781
|
+
types: T::Array[String]
|
|
782
|
+
}
|
|
783
|
+
)
|
|
784
|
+
end
|
|
785
|
+
def to_hash
|
|
786
|
+
end
|
|
787
|
+
end
|
|
788
|
+
end
|
|
789
|
+
|
|
790
|
+
class Place < XTwitterScraper::Internal::Type::BaseModel
|
|
791
|
+
OrHash =
|
|
792
|
+
T.type_alias do
|
|
793
|
+
T.any(
|
|
794
|
+
XTwitterScraper::EmbeddedTweet::Place,
|
|
795
|
+
XTwitterScraper::Internal::AnyHash
|
|
796
|
+
)
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
sig { returns(T.nilable(String)) }
|
|
800
|
+
attr_reader :id
|
|
801
|
+
|
|
802
|
+
sig { params(id: String).void }
|
|
803
|
+
attr_writer :id
|
|
804
|
+
|
|
805
|
+
sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
|
|
806
|
+
attr_reader :bounding_box
|
|
807
|
+
|
|
808
|
+
sig { params(bounding_box: T::Hash[Symbol, T.anything]).void }
|
|
809
|
+
attr_writer :bounding_box
|
|
810
|
+
|
|
811
|
+
sig { returns(T.nilable(String)) }
|
|
812
|
+
attr_reader :country
|
|
813
|
+
|
|
814
|
+
sig { params(country: String).void }
|
|
815
|
+
attr_writer :country
|
|
816
|
+
|
|
817
|
+
sig { returns(T.nilable(String)) }
|
|
818
|
+
attr_reader :country_code
|
|
819
|
+
|
|
820
|
+
sig { params(country_code: String).void }
|
|
821
|
+
attr_writer :country_code
|
|
822
|
+
|
|
823
|
+
sig { returns(T.nilable(String)) }
|
|
824
|
+
attr_reader :full_name
|
|
825
|
+
|
|
826
|
+
sig { params(full_name: String).void }
|
|
827
|
+
attr_writer :full_name
|
|
828
|
+
|
|
829
|
+
sig { returns(T.nilable(String)) }
|
|
830
|
+
attr_reader :name
|
|
831
|
+
|
|
832
|
+
sig { params(name: String).void }
|
|
833
|
+
attr_writer :name
|
|
834
|
+
|
|
835
|
+
sig { returns(T.nilable(String)) }
|
|
836
|
+
attr_reader :place_type
|
|
837
|
+
|
|
838
|
+
sig { params(place_type: String).void }
|
|
839
|
+
attr_writer :place_type
|
|
840
|
+
|
|
841
|
+
sig { returns(T.nilable(String)) }
|
|
842
|
+
attr_reader :url
|
|
843
|
+
|
|
844
|
+
sig { params(url: String).void }
|
|
845
|
+
attr_writer :url
|
|
846
|
+
|
|
847
|
+
# Public place metadata attached to a tweet.
|
|
848
|
+
sig do
|
|
849
|
+
params(
|
|
850
|
+
id: String,
|
|
851
|
+
bounding_box: T::Hash[Symbol, T.anything],
|
|
852
|
+
country: String,
|
|
853
|
+
country_code: String,
|
|
854
|
+
full_name: String,
|
|
855
|
+
name: String,
|
|
856
|
+
place_type: String,
|
|
857
|
+
url: String
|
|
858
|
+
).returns(T.attached_class)
|
|
859
|
+
end
|
|
860
|
+
def self.new(
|
|
861
|
+
id: nil,
|
|
862
|
+
bounding_box: nil,
|
|
863
|
+
country: nil,
|
|
864
|
+
country_code: nil,
|
|
865
|
+
full_name: nil,
|
|
866
|
+
name: nil,
|
|
867
|
+
place_type: nil,
|
|
868
|
+
url: nil
|
|
869
|
+
)
|
|
870
|
+
end
|
|
871
|
+
|
|
872
|
+
sig do
|
|
873
|
+
override.returns(
|
|
874
|
+
{
|
|
875
|
+
id: String,
|
|
876
|
+
bounding_box: T::Hash[Symbol, T.anything],
|
|
877
|
+
country: String,
|
|
878
|
+
country_code: String,
|
|
879
|
+
full_name: String,
|
|
880
|
+
name: String,
|
|
881
|
+
place_type: String,
|
|
882
|
+
url: String
|
|
883
|
+
}
|
|
884
|
+
)
|
|
885
|
+
end
|
|
886
|
+
def to_hash
|
|
887
|
+
end
|
|
888
|
+
end
|
|
889
|
+
|
|
890
|
+
class PreviousCounts < XTwitterScraper::Internal::Type::BaseModel
|
|
891
|
+
OrHash =
|
|
892
|
+
T.type_alias do
|
|
893
|
+
T.any(
|
|
894
|
+
XTwitterScraper::EmbeddedTweet::PreviousCounts,
|
|
895
|
+
XTwitterScraper::Internal::AnyHash
|
|
896
|
+
)
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
sig { returns(T.nilable(Integer)) }
|
|
900
|
+
attr_reader :bookmark_count
|
|
901
|
+
|
|
902
|
+
sig { params(bookmark_count: Integer).void }
|
|
903
|
+
attr_writer :bookmark_count
|
|
904
|
+
|
|
905
|
+
sig { returns(T.nilable(Integer)) }
|
|
906
|
+
attr_reader :like_count
|
|
907
|
+
|
|
908
|
+
sig { params(like_count: Integer).void }
|
|
909
|
+
attr_writer :like_count
|
|
910
|
+
|
|
911
|
+
sig { returns(T.nilable(Integer)) }
|
|
912
|
+
attr_reader :quote_count
|
|
913
|
+
|
|
914
|
+
sig { params(quote_count: Integer).void }
|
|
915
|
+
attr_writer :quote_count
|
|
916
|
+
|
|
917
|
+
sig { returns(T.nilable(Integer)) }
|
|
918
|
+
attr_reader :reply_count
|
|
919
|
+
|
|
920
|
+
sig { params(reply_count: Integer).void }
|
|
921
|
+
attr_writer :reply_count
|
|
922
|
+
|
|
923
|
+
sig { returns(T.nilable(Integer)) }
|
|
924
|
+
attr_reader :retweet_count
|
|
925
|
+
|
|
926
|
+
sig { params(retweet_count: Integer).void }
|
|
927
|
+
attr_writer :retweet_count
|
|
928
|
+
|
|
929
|
+
# Engagement counts retained from a prior tweet edit.
|
|
930
|
+
sig do
|
|
931
|
+
params(
|
|
932
|
+
bookmark_count: Integer,
|
|
933
|
+
like_count: Integer,
|
|
934
|
+
quote_count: Integer,
|
|
935
|
+
reply_count: Integer,
|
|
936
|
+
retweet_count: Integer
|
|
937
|
+
).returns(T.attached_class)
|
|
938
|
+
end
|
|
939
|
+
def self.new(
|
|
940
|
+
bookmark_count: nil,
|
|
941
|
+
like_count: nil,
|
|
942
|
+
quote_count: nil,
|
|
943
|
+
reply_count: nil,
|
|
944
|
+
retweet_count: nil
|
|
945
|
+
)
|
|
946
|
+
end
|
|
947
|
+
|
|
948
|
+
sig do
|
|
949
|
+
override.returns(
|
|
950
|
+
{
|
|
951
|
+
bookmark_count: Integer,
|
|
952
|
+
like_count: Integer,
|
|
953
|
+
quote_count: Integer,
|
|
954
|
+
reply_count: Integer,
|
|
955
|
+
retweet_count: Integer
|
|
956
|
+
}
|
|
957
|
+
)
|
|
958
|
+
end
|
|
959
|
+
def to_hash
|
|
960
|
+
end
|
|
961
|
+
end
|
|
257
962
|
end
|
|
258
963
|
end
|
|
259
964
|
end
|