@jubbio/core 1.0.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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/Client.d.ts +147 -0
  4. package/dist/Client.js +471 -0
  5. package/dist/builders/ActionRowBuilder.d.ts +53 -0
  6. package/dist/builders/ActionRowBuilder.js +68 -0
  7. package/dist/builders/ButtonBuilder.d.ts +77 -0
  8. package/dist/builders/ButtonBuilder.js +96 -0
  9. package/dist/builders/EmbedBuilder.d.ts +157 -0
  10. package/dist/builders/EmbedBuilder.js +199 -0
  11. package/dist/builders/ModalBuilder.d.ts +122 -0
  12. package/dist/builders/ModalBuilder.js +162 -0
  13. package/dist/builders/SelectMenuBuilder.d.ts +123 -0
  14. package/dist/builders/SelectMenuBuilder.js +165 -0
  15. package/dist/builders/SlashCommandBuilder.d.ts +197 -0
  16. package/dist/builders/SlashCommandBuilder.js +324 -0
  17. package/dist/builders/index.d.ts +9 -0
  18. package/dist/builders/index.js +26 -0
  19. package/dist/enums.d.ts +196 -0
  20. package/dist/enums.js +216 -0
  21. package/dist/index.d.ts +25 -0
  22. package/dist/index.js +128 -0
  23. package/dist/managers/BaseManager.d.ts +69 -0
  24. package/dist/managers/BaseManager.js +106 -0
  25. package/dist/managers/ChannelManager.d.ts +98 -0
  26. package/dist/managers/ChannelManager.js +209 -0
  27. package/dist/managers/GuildMemberManager.d.ts +74 -0
  28. package/dist/managers/GuildMemberManager.js +156 -0
  29. package/dist/managers/RoleManager.d.ts +84 -0
  30. package/dist/managers/RoleManager.js +207 -0
  31. package/dist/managers/index.d.ts +7 -0
  32. package/dist/managers/index.js +24 -0
  33. package/dist/rest/REST.d.ts +483 -0
  34. package/dist/rest/REST.js +805 -0
  35. package/dist/rest/index.d.ts +1 -0
  36. package/dist/rest/index.js +18 -0
  37. package/dist/sharding/ShardingManager.d.ts +179 -0
  38. package/dist/sharding/ShardingManager.js +375 -0
  39. package/dist/sharding/index.d.ts +4 -0
  40. package/dist/sharding/index.js +21 -0
  41. package/dist/structures/Channel.d.ts +120 -0
  42. package/dist/structures/Channel.js +224 -0
  43. package/dist/structures/Collection.d.ts +53 -0
  44. package/dist/structures/Collection.js +115 -0
  45. package/dist/structures/Guild.d.ts +59 -0
  46. package/dist/structures/Guild.js +90 -0
  47. package/dist/structures/GuildMember.d.ts +130 -0
  48. package/dist/structures/GuildMember.js +208 -0
  49. package/dist/structures/Interaction.d.ts +224 -0
  50. package/dist/structures/Interaction.js +404 -0
  51. package/dist/structures/Message.d.ts +93 -0
  52. package/dist/structures/Message.js +145 -0
  53. package/dist/structures/User.d.ts +37 -0
  54. package/dist/structures/User.js +65 -0
  55. package/dist/structures/index.d.ts +7 -0
  56. package/dist/structures/index.js +25 -0
  57. package/dist/structures.d.ts +1 -0
  58. package/dist/structures.js +19 -0
  59. package/dist/types.d.ts +255 -0
  60. package/dist/types.js +3 -0
  61. package/dist/utils/BitField.d.ts +66 -0
  62. package/dist/utils/BitField.js +138 -0
  63. package/dist/utils/Collection.d.ts +116 -0
  64. package/dist/utils/Collection.js +265 -0
  65. package/dist/utils/Collector.d.ts +152 -0
  66. package/dist/utils/Collector.js +314 -0
  67. package/dist/utils/DataResolver.d.ts +61 -0
  68. package/dist/utils/DataResolver.js +146 -0
  69. package/dist/utils/Formatters.d.ts +145 -0
  70. package/dist/utils/Formatters.js +213 -0
  71. package/dist/utils/IntentsBitField.d.ts +85 -0
  72. package/dist/utils/IntentsBitField.js +99 -0
  73. package/dist/utils/Partials.d.ts +105 -0
  74. package/dist/utils/Partials.js +149 -0
  75. package/dist/utils/PermissionsBitField.d.ts +118 -0
  76. package/dist/utils/PermissionsBitField.js +145 -0
  77. package/dist/utils/SnowflakeUtil.d.ts +63 -0
  78. package/dist/utils/SnowflakeUtil.js +93 -0
  79. package/dist/utils/Sweepers.d.ts +127 -0
  80. package/dist/utils/Sweepers.js +270 -0
  81. package/dist/utils/index.d.ts +13 -0
  82. package/dist/utils/index.js +30 -0
  83. package/package.json +37 -0
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Collectors for awaiting messages, reactions, and interactions
3
+ * API compatible with Discord.js Collectors
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { Collection } from './Collection';
7
+ export interface CollectorOptions<T> {
8
+ /** How long to run the collector for in milliseconds */
9
+ time?: number;
10
+ /** How long to wait for the next item in milliseconds */
11
+ idle?: number;
12
+ /** Maximum number of items to collect */
13
+ max?: number;
14
+ /** Maximum number of items to process */
15
+ maxProcessed?: number;
16
+ /** Filter function */
17
+ filter?: (item: T, collected: Collection<string, T>) => boolean | Promise<boolean>;
18
+ /** Whether to dispose of items when the collector ends */
19
+ dispose?: boolean;
20
+ }
21
+ export interface CollectorResetTimerOptions {
22
+ time?: number;
23
+ idle?: number;
24
+ }
25
+ /**
26
+ * Abstract base class for collectors
27
+ */
28
+ export declare abstract class Collector<K extends string, V> extends EventEmitter {
29
+ /** The client that instantiated this collector */
30
+ readonly client: any;
31
+ /** The items collected */
32
+ readonly collected: Collection<K, V>;
33
+ /** Whether the collector has ended */
34
+ ended: boolean;
35
+ /** The reason the collector ended */
36
+ endReason: string | null;
37
+ /** Filter function */
38
+ filter: (item: V, collected: Collection<K, V>) => boolean | Promise<boolean>;
39
+ /** Collector options */
40
+ options: CollectorOptions<V>;
41
+ /** Number of items processed */
42
+ private _processedCount;
43
+ /** Timeout for time limit */
44
+ private _timeout;
45
+ /** Timeout for idle limit */
46
+ private _idleTimeout;
47
+ constructor(client: any, options?: CollectorOptions<V>);
48
+ /**
49
+ * Handle an item being collected
50
+ */
51
+ handleCollect(item: V): Promise<void>;
52
+ /**
53
+ * Handle an item being disposed
54
+ */
55
+ handleDispose(item: V): void;
56
+ /**
57
+ * Get the key for an item
58
+ */
59
+ abstract collect(item: V): K | null;
60
+ /**
61
+ * Get the key for disposing an item
62
+ */
63
+ abstract dispose(item: V): K | null;
64
+ /**
65
+ * Stop the collector
66
+ */
67
+ stop(reason?: string): void;
68
+ /**
69
+ * Reset the collector's timer
70
+ */
71
+ resetTimer(options?: CollectorResetTimerOptions): void;
72
+ /**
73
+ * Check the end conditions
74
+ */
75
+ checkEnd(): boolean;
76
+ /**
77
+ * Get the next item
78
+ */
79
+ get next(): Promise<V>;
80
+ }
81
+ /**
82
+ * Message collector options
83
+ */
84
+ export interface MessageCollectorOptions extends CollectorOptions<any> {
85
+ /** Channel to collect messages from */
86
+ channelId?: string;
87
+ }
88
+ /**
89
+ * Collector for messages
90
+ */
91
+ export declare class MessageCollector extends Collector<string, any> {
92
+ readonly channelId: string;
93
+ private readonly messageHandler;
94
+ constructor(client: any, channelId: string, options?: MessageCollectorOptions);
95
+ collect(message: any): string | null;
96
+ dispose(message: any): string | null;
97
+ }
98
+ /**
99
+ * Interaction collector options
100
+ */
101
+ export interface InteractionCollectorOptions extends CollectorOptions<any> {
102
+ /** Channel to collect interactions from */
103
+ channelId?: string;
104
+ /** Guild to collect interactions from */
105
+ guildId?: string;
106
+ /** Message to collect interactions from */
107
+ messageId?: string;
108
+ /** Interaction types to collect */
109
+ interactionType?: number | number[];
110
+ /** Component types to collect */
111
+ componentType?: number | number[];
112
+ }
113
+ /**
114
+ * Collector for interactions (buttons, select menus, etc.)
115
+ */
116
+ export declare class InteractionCollector extends Collector<string, any> {
117
+ readonly channelId?: string;
118
+ readonly guildId?: string;
119
+ readonly messageId?: string;
120
+ readonly interactionType?: number[];
121
+ readonly componentType?: number[];
122
+ private readonly interactionHandler;
123
+ constructor(client: any, options?: InteractionCollectorOptions);
124
+ collect(interaction: any): string | null;
125
+ dispose(interaction: any): string | null;
126
+ }
127
+ /**
128
+ * Reaction collector options
129
+ */
130
+ export interface ReactionCollectorOptions extends CollectorOptions<any> {
131
+ /** Message to collect reactions from */
132
+ messageId: string;
133
+ }
134
+ /**
135
+ * Collector for reactions
136
+ */
137
+ export declare class ReactionCollector extends Collector<string, any> {
138
+ readonly messageId: string;
139
+ private readonly reactionHandler;
140
+ constructor(client: any, messageId: string, options: ReactionCollectorOptions);
141
+ collect(reaction: any): string | null;
142
+ dispose(reaction: any): string | null;
143
+ }
144
+ /**
145
+ * Await messages helper
146
+ */
147
+ export declare function awaitMessages(client: any, channelId: string, options?: MessageCollectorOptions): Promise<Collection<string, any>>;
148
+ /**
149
+ * Await reactions helper
150
+ */
151
+ export declare function awaitReactions(client: any, messageId: string, options: ReactionCollectorOptions): Promise<Collection<string, any>>;
152
+ export default Collector;
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ /**
3
+ * Collectors for awaiting messages, reactions, and interactions
4
+ * API compatible with Discord.js Collectors
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ReactionCollector = exports.InteractionCollector = exports.MessageCollector = exports.Collector = void 0;
8
+ exports.awaitMessages = awaitMessages;
9
+ exports.awaitReactions = awaitReactions;
10
+ const events_1 = require("events");
11
+ const Collection_1 = require("./Collection");
12
+ /**
13
+ * Abstract base class for collectors
14
+ */
15
+ class Collector extends events_1.EventEmitter {
16
+ /** The client that instantiated this collector */
17
+ client;
18
+ /** The items collected */
19
+ collected = new Collection_1.Collection();
20
+ /** Whether the collector has ended */
21
+ ended = false;
22
+ /** The reason the collector ended */
23
+ endReason = null;
24
+ /** Filter function */
25
+ filter;
26
+ /** Collector options */
27
+ options;
28
+ /** Number of items processed */
29
+ _processedCount = 0;
30
+ /** Timeout for time limit */
31
+ _timeout = null;
32
+ /** Timeout for idle limit */
33
+ _idleTimeout = null;
34
+ constructor(client, options = {}) {
35
+ super();
36
+ this.client = client;
37
+ this.options = options;
38
+ this.filter = options.filter ?? (() => true);
39
+ this.handleCollect = this.handleCollect.bind(this);
40
+ this.handleDispose = this.handleDispose.bind(this);
41
+ if (options.time) {
42
+ this._timeout = setTimeout(() => this.stop('time'), options.time);
43
+ }
44
+ if (options.idle) {
45
+ this._idleTimeout = setTimeout(() => this.stop('idle'), options.idle);
46
+ }
47
+ }
48
+ /**
49
+ * Handle an item being collected
50
+ */
51
+ async handleCollect(item) {
52
+ if (this.ended)
53
+ return;
54
+ this._processedCount++;
55
+ const filterResult = await this.filter(item, this.collected);
56
+ if (!filterResult)
57
+ return;
58
+ const key = this.collect(item);
59
+ if (key === null)
60
+ return;
61
+ this.collected.set(key, item);
62
+ this.emit('collect', item);
63
+ // Reset idle timer
64
+ if (this._idleTimeout) {
65
+ clearTimeout(this._idleTimeout);
66
+ this._idleTimeout = setTimeout(() => this.stop('idle'), this.options.idle);
67
+ }
68
+ // Check limits
69
+ if (this.options.max && this.collected.size >= this.options.max) {
70
+ this.stop('limit');
71
+ }
72
+ if (this.options.maxProcessed && this._processedCount >= this.options.maxProcessed) {
73
+ this.stop('processedLimit');
74
+ }
75
+ }
76
+ /**
77
+ * Handle an item being disposed
78
+ */
79
+ handleDispose(item) {
80
+ if (!this.options.dispose)
81
+ return;
82
+ const key = this.dispose(item);
83
+ if (key === null)
84
+ return;
85
+ if (this.collected.has(key)) {
86
+ this.collected.delete(key);
87
+ this.emit('dispose', item);
88
+ }
89
+ }
90
+ /**
91
+ * Stop the collector
92
+ */
93
+ stop(reason = 'user') {
94
+ if (this.ended)
95
+ return;
96
+ this.ended = true;
97
+ this.endReason = reason;
98
+ if (this._timeout) {
99
+ clearTimeout(this._timeout);
100
+ this._timeout = null;
101
+ }
102
+ if (this._idleTimeout) {
103
+ clearTimeout(this._idleTimeout);
104
+ this._idleTimeout = null;
105
+ }
106
+ this.emit('end', this.collected, reason);
107
+ }
108
+ /**
109
+ * Reset the collector's timer
110
+ */
111
+ resetTimer(options = {}) {
112
+ if (this._timeout) {
113
+ clearTimeout(this._timeout);
114
+ this._timeout = null;
115
+ }
116
+ if (this._idleTimeout) {
117
+ clearTimeout(this._idleTimeout);
118
+ this._idleTimeout = null;
119
+ }
120
+ if (options.time ?? this.options.time) {
121
+ this._timeout = setTimeout(() => this.stop('time'), options.time ?? this.options.time);
122
+ }
123
+ if (options.idle ?? this.options.idle) {
124
+ this._idleTimeout = setTimeout(() => this.stop('idle'), options.idle ?? this.options.idle);
125
+ }
126
+ }
127
+ /**
128
+ * Check the end conditions
129
+ */
130
+ checkEnd() {
131
+ const reason = this.endReason;
132
+ if (reason) {
133
+ this.stop(reason);
134
+ return true;
135
+ }
136
+ return false;
137
+ }
138
+ /**
139
+ * Get the next item
140
+ */
141
+ get next() {
142
+ return new Promise((resolve, reject) => {
143
+ if (this.ended) {
144
+ reject(new Error('Collector has ended'));
145
+ return;
146
+ }
147
+ const cleanup = () => {
148
+ this.removeListener('collect', onCollect);
149
+ this.removeListener('end', onEnd);
150
+ };
151
+ const onCollect = (item) => {
152
+ cleanup();
153
+ resolve(item);
154
+ };
155
+ const onEnd = () => {
156
+ cleanup();
157
+ reject(new Error('Collector ended'));
158
+ };
159
+ this.on('collect', onCollect);
160
+ this.on('end', onEnd);
161
+ });
162
+ }
163
+ }
164
+ exports.Collector = Collector;
165
+ /**
166
+ * Collector for messages
167
+ */
168
+ class MessageCollector extends Collector {
169
+ channelId;
170
+ messageHandler;
171
+ constructor(client, channelId, options = {}) {
172
+ super(client, options);
173
+ this.channelId = channelId;
174
+ // Get bot's user ID to filter out bot's own messages
175
+ const botUserId = client.user?.id;
176
+ this.messageHandler = (message) => {
177
+ if (message.channel_id === this.channelId || message.channelId === this.channelId) {
178
+ // Automatically filter out bot's own messages
179
+ const authorId = message.author?.id || message.author_id;
180
+ if (botUserId && authorId === botUserId)
181
+ return;
182
+ // Also filter by application_id (bot messages have this)
183
+ if (message.application_id || message.applicationId)
184
+ return;
185
+ this.handleCollect(message);
186
+ }
187
+ };
188
+ client.on('messageCreate', this.messageHandler);
189
+ this.once('end', () => {
190
+ client.removeListener('messageCreate', this.messageHandler);
191
+ });
192
+ }
193
+ collect(message) {
194
+ return message.id ?? null;
195
+ }
196
+ dispose(message) {
197
+ return message.id ?? null;
198
+ }
199
+ }
200
+ exports.MessageCollector = MessageCollector;
201
+ /**
202
+ * Collector for interactions (buttons, select menus, etc.)
203
+ */
204
+ class InteractionCollector extends Collector {
205
+ channelId;
206
+ guildId;
207
+ messageId;
208
+ interactionType;
209
+ componentType;
210
+ interactionHandler;
211
+ constructor(client, options = {}) {
212
+ super(client, options);
213
+ this.channelId = options.channelId;
214
+ this.guildId = options.guildId;
215
+ this.messageId = options.messageId;
216
+ this.interactionType = options.interactionType
217
+ ? Array.isArray(options.interactionType) ? options.interactionType : [options.interactionType]
218
+ : undefined;
219
+ this.componentType = options.componentType
220
+ ? Array.isArray(options.componentType) ? options.componentType : [options.componentType]
221
+ : undefined;
222
+ this.interactionHandler = (interaction) => {
223
+ // Filter by channel
224
+ if (this.channelId && interaction.channelId !== this.channelId)
225
+ return;
226
+ // Filter by guild
227
+ if (this.guildId && interaction.guildId !== this.guildId)
228
+ return;
229
+ // Filter by message
230
+ if (this.messageId && interaction.message?.id !== this.messageId)
231
+ return;
232
+ // Filter by interaction type
233
+ if (this.interactionType && !this.interactionType.includes(interaction.type))
234
+ return;
235
+ // Filter by component type
236
+ if (this.componentType && interaction.componentType && !this.componentType.includes(interaction.componentType))
237
+ return;
238
+ this.handleCollect(interaction);
239
+ };
240
+ client.on('interactionCreate', this.interactionHandler);
241
+ this.once('end', () => {
242
+ client.removeListener('interactionCreate', this.interactionHandler);
243
+ });
244
+ }
245
+ collect(interaction) {
246
+ return interaction.id ?? null;
247
+ }
248
+ dispose(interaction) {
249
+ return interaction.id ?? null;
250
+ }
251
+ }
252
+ exports.InteractionCollector = InteractionCollector;
253
+ /**
254
+ * Collector for reactions
255
+ */
256
+ class ReactionCollector extends Collector {
257
+ messageId;
258
+ reactionHandler;
259
+ constructor(client, messageId, options) {
260
+ super(client, options);
261
+ this.messageId = messageId;
262
+ this.reactionHandler = (reaction) => {
263
+ if (reaction.message_id === this.messageId || reaction.messageId === this.messageId) {
264
+ this.handleCollect(reaction);
265
+ }
266
+ };
267
+ client.on('messageReactionAdd', this.reactionHandler);
268
+ this.once('end', () => {
269
+ client.removeListener('messageReactionAdd', this.reactionHandler);
270
+ });
271
+ }
272
+ collect(reaction) {
273
+ // Key is emoji identifier
274
+ return reaction.emoji?.id ?? reaction.emoji?.name ?? null;
275
+ }
276
+ dispose(reaction) {
277
+ return reaction.emoji?.id ?? reaction.emoji?.name ?? null;
278
+ }
279
+ }
280
+ exports.ReactionCollector = ReactionCollector;
281
+ /**
282
+ * Await messages helper
283
+ */
284
+ function awaitMessages(client, channelId, options = {}) {
285
+ return new Promise((resolve, reject) => {
286
+ const collector = new MessageCollector(client, channelId, options);
287
+ collector.once('end', (collected, reason) => {
288
+ if (options.max && collected.size < options.max) {
289
+ reject(new Error(`Collector ended with reason: ${reason}`));
290
+ }
291
+ else {
292
+ resolve(collected);
293
+ }
294
+ });
295
+ });
296
+ }
297
+ /**
298
+ * Await reactions helper
299
+ */
300
+ function awaitReactions(client, messageId, options) {
301
+ return new Promise((resolve, reject) => {
302
+ const collector = new ReactionCollector(client, messageId, options);
303
+ collector.once('end', (collected, reason) => {
304
+ if (options.max && collected.size < options.max) {
305
+ reject(new Error(`Collector ended with reason: ${reason}`));
306
+ }
307
+ else {
308
+ resolve(collected);
309
+ }
310
+ });
311
+ });
312
+ }
313
+ exports.default = Collector;
314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL0NvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUE2WEgsc0NBZ0JDO0FBS0Qsd0NBZ0JDO0FBaGFELG1DQUFzQztBQUN0Qyw2Q0FBMEM7QUFzQjFDOztHQUVHO0FBQ0gsTUFBc0IsU0FBK0IsU0FBUSxxQkFBWTtJQUN2RSxrREFBa0Q7SUFDbEMsTUFBTSxDQUFNO0lBRTVCLDBCQUEwQjtJQUNWLFNBQVMsR0FBcUIsSUFBSSx1QkFBVSxFQUFFLENBQUM7SUFFL0Qsc0NBQXNDO0lBQy9CLEtBQUssR0FBRyxLQUFLLENBQUM7SUFFckIscUNBQXFDO0lBQzlCLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRXZDLHNCQUFzQjtJQUNmLE1BQU0sQ0FBdUU7SUFFcEYsd0JBQXdCO0lBQ2pCLE9BQU8sQ0FBc0I7SUFFcEMsZ0NBQWdDO0lBQ3hCLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFFNUIsNkJBQTZCO0lBQ3JCLFFBQVEsR0FBMEIsSUFBSSxDQUFDO0lBRS9DLDZCQUE2QjtJQUNyQixZQUFZLEdBQTBCLElBQUksQ0FBQztJQUVuRCxZQUFZLE1BQVcsRUFBRSxVQUErQixFQUFFO1FBQ3hELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBSSxPQUFPLENBQUMsTUFBYyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FB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RXBFLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzFDLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGdDQUFnQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxrQkFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ29sbGVjdG9ycyBmb3IgYXdhaXRpbmcgbWVzc2FnZXMsIHJlYWN0aW9ucywgYW5kIGludGVyYWN0aW9uc1xyXG4gKiBBUEkgY29tcGF0aWJsZSB3aXRoIERpc2NvcmQuanMgQ29sbGVjdG9yc1xyXG4gKi9cclxuXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0b3JPcHRpb25zPFQ+IHtcclxuICAvKiogSG93IGxvbmcgdG8gcnVuIHRoZSBjb2xsZWN0b3IgZm9yIGluIG1pbGxpc2Vjb25kcyAqL1xyXG4gIHRpbWU/OiBudW1iZXI7XHJcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGl0ZW0gaW4gbWlsbGlzZWNvbmRzICovXHJcbiAgaWRsZT86IG51bWJlcjtcclxuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gY29sbGVjdCAqL1xyXG4gIG1heD86IG51bWJlcjtcclxuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcHJvY2VzcyAqL1xyXG4gIG1heFByb2Nlc3NlZD86IG51bWJlcjtcclxuICAvKiogRmlsdGVyIGZ1bmN0aW9uICovXHJcbiAgZmlsdGVyPzogKGl0ZW06IFQsIGNvbGxlY3RlZDogQ29sbGVjdGlvbjxzdHJpbmcsIFQ+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcclxuICAvKiogV2hldGhlciB0byBkaXNwb3NlIG9mIGl0ZW1zIHdoZW4gdGhlIGNvbGxlY3RvciBlbmRzICovXHJcbiAgZGlzcG9zZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdG9yUmVzZXRUaW1lck9wdGlvbnMge1xyXG4gIHRpbWU/OiBudW1iZXI7XHJcbiAgaWRsZT86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbGxlY3RvcnNcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0b3I8SyBleHRlbmRzIHN0cmluZywgVj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIC8qKiBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgY29sbGVjdG9yICovXHJcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogYW55O1xyXG4gIFxyXG4gIC8qKiBUaGUgaXRlbXMgY29sbGVjdGVkICovXHJcbiAgcHVibGljIHJlYWRvbmx5IGNvbGxlY3RlZDogQ29sbGVjdGlvbjxLLCBWPiA9IG5ldyBDb2xsZWN0aW9uKCk7XHJcbiAgXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbGxlY3RvciBoYXMgZW5kZWQgKi9cclxuICBwdWJsaWMgZW5kZWQgPSBmYWxzZTtcclxuICBcclxuICAvKiogVGhlIHJlYXNvbiB0aGUgY29sbGVjdG9yIGVuZGVkICovXHJcbiAgcHVibGljIGVuZFJlYXNvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgXHJcbiAgLyoqIEZpbHRlciBmdW5jdGlvbiAqL1xyXG4gIHB1YmxpYyBmaWx0ZXI6IChpdGVtOiBWLCBjb2xsZWN0ZWQ6IENvbGxlY3Rpb248SywgVj4pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIFxyXG4gIC8qKiBDb2xsZWN0b3Igb3B0aW9ucyAqL1xyXG4gIHB1YmxpYyBvcHRpb25zOiBDb2xsZWN0b3JPcHRpb25zPFY+O1xyXG4gIFxyXG4gIC8qKiBOdW1iZXIgb2YgaXRlbXMgcHJvY2Vzc2VkICovXHJcbiAgcHJpdmF0ZSBfcHJvY2Vzc2VkQ291bnQgPSAwO1xyXG4gIFxyXG4gIC8qKiBUaW1lb3V0IGZvciB0aW1lIGxpbWl0ICovXHJcbiAgcHJpdmF0ZSBfdGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcclxuICBcclxuICAvKiogVGltZW91dCBmb3IgaWRsZSBsaW1pdCAqL1xyXG4gIHByaXZhdGUgX2lkbGVUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IGFueSwgb3B0aW9uczogQ29sbGVjdG9yT3B0aW9uczxWPiA9IHt9KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5maWx0ZXIgPSAob3B0aW9ucy5maWx0ZXIgYXMgYW55KSA/PyAoKCkgPT4gdHJ1ZSk7XHJcbiAgICBcclxuICAgIHRoaXMuaGFuZGxlQ29sbGVjdCA9IHRoaXMuaGFuZGxlQ29sbGVjdC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5oYW5kbGVEaXNwb3NlID0gdGhpcy5oYW5kbGVEaXNwb3NlLmJpbmQodGhpcyk7XHJcbiAgICBcclxuICAgIGlmIChvcHRpb25zLnRpbWUpIHtcclxuICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdG9wKCd0aW1lJyksIG9wdGlvbnMudGltZSk7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pZGxlKSB7XHJcbiAgICAgIHRoaXMuX2lkbGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnN0b3AoJ2lkbGUnKSwgb3B0aW9ucy5pZGxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBhbiBpdGVtIGJlaW5nIGNvbGxlY3RlZFxyXG4gICAqL1xyXG4gIGFzeW5jIGhhbmRsZUNvbGxlY3QoaXRlbTogVik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcclxuICAgIFxyXG4gICAgdGhpcy5fcHJvY2Vzc2VkQ291bnQrKztcclxuICAgIFxyXG4gICAgY29uc3QgZmlsdGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5maWx0ZXIoaXRlbSwgdGhpcy5jb2xsZWN0ZWQpO1xyXG4gICAgaWYgKCFmaWx0ZXJSZXN1bHQpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb2xsZWN0KGl0ZW0pO1xyXG4gICAgaWYgKGtleSA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICB0aGlzLmNvbGxlY3RlZC5zZXQoa2V5LCBpdGVtKTtcclxuICAgIHRoaXMuZW1pdCgnY29sbGVjdCcsIGl0ZW0pO1xyXG4gICAgXHJcbiAgICAvLyBSZXNldCBpZGxlIHRpbWVyXHJcbiAgICBpZiAodGhpcy5faWRsZVRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KTtcclxuICAgICAgdGhpcy5faWRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RvcCgnaWRsZScpLCB0aGlzLm9wdGlvbnMuaWRsZSEpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBDaGVjayBsaW1pdHNcclxuICAgIGlmICh0aGlzLm9wdGlvbnMubWF4ICYmIHRoaXMuY29sbGVjdGVkLnNpemUgPj0gdGhpcy5vcHRpb25zLm1heCkge1xyXG4gICAgICB0aGlzLnN0b3AoJ2xpbWl0Jyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1heFByb2Nlc3NlZCAmJiB0aGlzLl9wcm9jZXNzZWRDb3VudCA+PSB0aGlzLm9wdGlvbnMubWF4UHJvY2Vzc2VkKSB7XHJcbiAgICAgIHRoaXMuc3RvcCgncHJvY2Vzc2VkTGltaXQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBhbiBpdGVtIGJlaW5nIGRpc3Bvc2VkXHJcbiAgICovXHJcbiAgaGFuZGxlRGlzcG9zZShpdGVtOiBWKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNwb3NlKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZGlzcG9zZShpdGVtKTtcclxuICAgIGlmIChrZXkgPT09IG51bGwpIHJldHVybjtcclxuICAgIFxyXG4gICAgaWYgKHRoaXMuY29sbGVjdGVkLmhhcyhrZXkpKSB7XHJcbiAgICAgIHRoaXMuY29sbGVjdGVkLmRlbGV0ZShrZXkpO1xyXG4gICAgICB0aGlzLmVtaXQoJ2Rpc3Bvc2UnLCBpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUga2V5IGZvciBhbiBpdGVtXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgY29sbGVjdChpdGVtOiBWKTogSyB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUga2V5IGZvciBkaXNwb3NpbmcgYW4gaXRlbVxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGRpc3Bvc2UoaXRlbTogVik6IEsgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBTdG9wIHRoZSBjb2xsZWN0b3JcclxuICAgKi9cclxuICBzdG9wKHJlYXNvbiA9ICd1c2VyJyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcclxuICAgIFxyXG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XHJcbiAgICB0aGlzLmVuZFJlYXNvbiA9IHJlYXNvbjtcclxuICAgIFxyXG4gICAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xyXG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pZGxlVGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpO1xyXG4gICAgICB0aGlzLl9pZGxlVGltZW91dCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuZW1pdCgnZW5kJywgdGhpcy5jb2xsZWN0ZWQsIHJlYXNvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCB0aGUgY29sbGVjdG9yJ3MgdGltZXJcclxuICAgKi9cclxuICByZXNldFRpbWVyKG9wdGlvbnM6IENvbGxlY3RvclJlc2V0VGltZXJPcHRpb25zID0ge30pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcclxuICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faWRsZVRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2lkbGVUaW1lb3V0KTtcclxuICAgICAgdGhpcy5faWRsZVRpbWVvdXQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAob3B0aW9ucy50aW1lID8/IHRoaXMub3B0aW9ucy50aW1lKSB7XHJcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RvcCgndGltZScpLCBvcHRpb25zLnRpbWUgPz8gdGhpcy5vcHRpb25zLnRpbWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaWRsZSA/PyB0aGlzLm9wdGlvbnMuaWRsZSkge1xyXG4gICAgICB0aGlzLl9pZGxlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdG9wKCdpZGxlJyksIG9wdGlvbnMuaWRsZSA/PyB0aGlzLm9wdGlvbnMuaWRsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayB0aGUgZW5kIGNvbmRpdGlvbnNcclxuICAgKi9cclxuICBjaGVja0VuZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuZW5kUmVhc29uO1xyXG4gICAgaWYgKHJlYXNvbikge1xyXG4gICAgICB0aGlzLnN0b3AocmVhc29uKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIG5leHQgaXRlbVxyXG4gICAqL1xyXG4gIGdldCBuZXh0KCk6IFByb21pc2U8Vj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZW5kZWQpIHtcclxuICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb2xsZWN0b3IgaGFzIGVuZGVkJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjb2xsZWN0Jywgb25Db2xsZWN0KTtcclxuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbkVuZCk7XHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBvbkNvbGxlY3QgPSAoaXRlbTogVikgPT4ge1xyXG4gICAgICAgIGNsZWFudXAoKTtcclxuICAgICAgICByZXNvbHZlKGl0ZW0pO1xyXG4gICAgICB9O1xyXG4gICAgICBcclxuICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgY2xlYW51cCgpO1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvbGxlY3RvciBlbmRlZCcpKTtcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMub24oJ2NvbGxlY3QnLCBvbkNvbGxlY3QpO1xyXG4gICAgICB0aGlzLm9uKCdlbmQnLCBvbkVuZCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNZXNzYWdlIGNvbGxlY3RvciBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VDb2xsZWN0b3JPcHRpb25zIGV4dGVuZHMgQ29sbGVjdG9yT3B0aW9uczxhbnk+IHtcclxuICAvKiogQ2hhbm5lbCB0byBjb2xsZWN0IG1lc3NhZ2VzIGZyb20gKi9cclxuICBjaGFubmVsSWQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb2xsZWN0b3IgZm9yIG1lc3NhZ2VzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTWVzc2FnZUNvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvcjxzdHJpbmcsIGFueT4ge1xyXG4gIHB1YmxpYyByZWFkb25seSBjaGFubmVsSWQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIYW5kbGVyOiAobWVzc2FnZTogYW55KSA9PiB2b2lkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IGFueSwgY2hhbm5lbElkOiBzdHJpbmcsIG9wdGlvbnM6IE1lc3NhZ2VDb2xsZWN0b3JPcHRpb25zID0ge30pIHtcclxuICAgIHN1cGVyKGNsaWVudCwgb3B0aW9ucyk7XHJcbiAgICB0aGlzLmNoYW5uZWxJZCA9IGNoYW5uZWxJZDtcclxuICAgIFxyXG4gICAgLy8gR2V0IGJvdCdzIHVzZXIgSUQgdG8gZmlsdGVyIG91dCBib3QncyBvd24gbWVzc2FnZXNcclxuICAgIGNvbnN0IGJvdFVzZXJJZCA9IGNsaWVudC51c2VyPy5pZDtcclxuICAgIFxyXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKG1lc3NhZ2UuY2hhbm5lbF9pZCA9PT0gdGhpcy5jaGFubmVsSWQgfHwgbWVzc2FnZS5jaGFubmVsSWQgPT09IHRoaXMuY2hhbm5lbElkKSB7XHJcbiAgICAgICAgLy8gQXV0b21hdGljYWxseSBmaWx0ZXIgb3V0IGJvdCdzIG93biBtZXNzYWdlc1xyXG4gICAgICAgIGNvbnN0IGF1dGhvcklkID0gbWVzc2FnZS5hdXRob3I/LmlkIHx8IG1lc3NhZ2UuYXV0aG9yX2lkO1xyXG4gICAgICAgIGlmIChib3RVc2VySWQgJiYgYXV0aG9ySWQgPT09IGJvdFVzZXJJZCkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFsc28gZmlsdGVyIGJ5IGFwcGxpY2F0aW9uX2lkIChib3QgbWVzc2FnZXMgaGF2ZSB0aGlzKVxyXG4gICAgICAgIGlmIChtZXNzYWdlLmFwcGxpY2F0aW9uX2lkIHx8IG1lc3NhZ2UuYXBwbGljYXRpb25JZCkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaGFuZGxlQ29sbGVjdChtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgY2xpZW50Lm9uKCdtZXNzYWdlQ3JlYXRlJywgdGhpcy5tZXNzYWdlSGFuZGxlcik7XHJcbiAgICBcclxuICAgIHRoaXMub25jZSgnZW5kJywgKCkgPT4ge1xyXG4gICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoJ21lc3NhZ2VDcmVhdGUnLCB0aGlzLm1lc3NhZ2VIYW5kbGVyKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29sbGVjdChtZXNzYWdlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiBtZXNzYWdlLmlkID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKG1lc3NhZ2U6IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIG1lc3NhZ2UuaWQgPz8gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmFjdGlvbiBjb2xsZWN0b3Igb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvbkNvbGxlY3Rvck9wdGlvbnMgZXh0ZW5kcyBDb2xsZWN0b3JPcHRpb25zPGFueT4ge1xyXG4gIC8qKiBDaGFubmVsIHRvIGNvbGxlY3QgaW50ZXJhY3Rpb25zIGZyb20gKi9cclxuICBjaGFubmVsSWQ/OiBzdHJpbmc7XHJcbiAgLyoqIEd1aWxkIHRvIGNvbGxlY3QgaW50ZXJhY3Rpb25zIGZyb20gKi9cclxuICBndWlsZElkPzogc3RyaW5nO1xyXG4gIC8qKiBNZXNzYWdlIHRvIGNvbGxlY3QgaW50ZXJhY3Rpb25zIGZyb20gKi9cclxuICBtZXNzYWdlSWQ/OiBzdHJpbmc7XHJcbiAgLyoqIEludGVyYWN0aW9uIHR5cGVzIHRvIGNvbGxlY3QgKi9cclxuICBpbnRlcmFjdGlvblR5cGU/OiBudW1iZXIgfCBudW1iZXJbXTtcclxuICAvKiogQ29tcG9uZW50IHR5cGVzIHRvIGNvbGxlY3QgKi9cclxuICBjb21wb25lbnRUeXBlPzogbnVtYmVyIHwgbnVtYmVyW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb2xsZWN0b3IgZm9yIGludGVyYWN0aW9ucyAoYnV0dG9ucywgc2VsZWN0IG1lbnVzLCBldGMuKVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uQ29sbGVjdG9yIGV4dGVuZHMgQ29sbGVjdG9yPHN0cmluZywgYW55PiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJZD86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgZ3VpbGRJZD86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZUlkPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmFjdGlvblR5cGU/OiBudW1iZXJbXTtcclxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50VHlwZT86IG51bWJlcltdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJhY3Rpb25IYW5kbGVyOiAoaW50ZXJhY3Rpb246IGFueSkgPT4gdm9pZDtcclxuXHJcbiAgY29uc3RydWN0b3IoY2xpZW50OiBhbnksIG9wdGlvbnM6IEludGVyYWN0aW9uQ29sbGVjdG9yT3B0aW9ucyA9IHt9KSB7XHJcbiAgICBzdXBlcihjbGllbnQsIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5jaGFubmVsSWQgPSBvcHRpb25zLmNoYW5uZWxJZDtcclxuICAgIHRoaXMuZ3VpbGRJZCA9IG9wdGlvbnMuZ3VpbGRJZDtcclxuICAgIHRoaXMubWVzc2FnZUlkID0gb3B0aW9ucy5tZXNzYWdlSWQ7XHJcbiAgICB0aGlzLmludGVyYWN0aW9uVHlwZSA9IG9wdGlvbnMuaW50ZXJhY3Rpb25UeXBlIFxyXG4gICAgICA/IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmFjdGlvblR5cGUpID8gb3B0aW9ucy5pbnRlcmFjdGlvblR5cGUgOiBbb3B0aW9ucy5pbnRlcmFjdGlvblR5cGVdXHJcbiAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jb21wb25lbnRUeXBlID0gb3B0aW9ucy5jb21wb25lbnRUeXBlXHJcbiAgICAgID8gQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbXBvbmVudFR5cGUpID8gb3B0aW9ucy5jb21wb25lbnRUeXBlIDogW29wdGlvbnMuY29tcG9uZW50VHlwZV1cclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBcclxuICAgIHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyID0gKGludGVyYWN0aW9uOiBhbnkpID0+IHtcclxuICAgICAgLy8gRmlsdGVyIGJ5IGNoYW5uZWxcclxuICAgICAgaWYgKHRoaXMuY2hhbm5lbElkICYmIGludGVyYWN0aW9uLmNoYW5uZWxJZCAhPT0gdGhpcy5jaGFubmVsSWQpIHJldHVybjtcclxuICAgICAgLy8gRmlsdGVyIGJ5IGd1aWxkXHJcbiAgICAgIGlmICh0aGlzLmd1aWxkSWQgJiYgaW50ZXJhY3Rpb24uZ3VpbGRJZCAhPT0gdGhpcy5ndWlsZElkKSByZXR1cm47XHJcbiAgICAgIC8vIEZpbHRlciBieSBtZXNzYWdlXHJcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VJZCAmJiBpbnRlcmFjdGlvbi5tZXNzYWdlPy5pZCAhPT0gdGhpcy5tZXNzYWdlSWQpIHJldHVybjtcclxuICAgICAgLy8gRmlsdGVyIGJ5IGludGVyYWN0aW9uIHR5cGVcclxuICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25UeXBlICYmICF0aGlzLmludGVyYWN0aW9uVHlwZS5pbmNsdWRlcyhpbnRlcmFjdGlvbi50eXBlKSkgcmV0dXJuO1xyXG4gICAgICAvLyBGaWx0ZXIgYnkgY29tcG9uZW50IHR5cGVcclxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50VHlwZSAmJiBpbnRlcmFjdGlvbi5jb21wb25lbnRUeXBlICYmICF0aGlzLmNvbXBvbmVudFR5cGUuaW5jbHVkZXMoaW50ZXJhY3Rpb24uY29tcG9uZW50VHlwZSkpIHJldHVybjtcclxuICAgICAgXHJcbiAgICAgIHRoaXMuaGFuZGxlQ29sbGVjdChpbnRlcmFjdGlvbik7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICBjbGllbnQub24oJ2ludGVyYWN0aW9uQ3JlYXRlJywgdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIpO1xyXG4gICAgXHJcbiAgICB0aGlzLm9uY2UoJ2VuZCcsICgpID0+IHtcclxuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKCdpbnRlcmFjdGlvbkNyZWF0ZScsIHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29sbGVjdChpbnRlcmFjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gaW50ZXJhY3Rpb24uaWQgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoaW50ZXJhY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIGludGVyYWN0aW9uLmlkID8/IG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVhY3Rpb24gY29sbGVjdG9yIG9wdGlvbnNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3Rpb25Db2xsZWN0b3JPcHRpb25zIGV4dGVuZHMgQ29sbGVjdG9yT3B0aW9uczxhbnk+IHtcclxuICAvKiogTWVzc2FnZSB0byBjb2xsZWN0IHJlYWN0aW9ucyBmcm9tICovXHJcbiAgbWVzc2FnZUlkOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb2xsZWN0b3IgZm9yIHJlYWN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlYWN0aW9uQ29sbGVjdG9yIGV4dGVuZHMgQ29sbGVjdG9yPHN0cmluZywgYW55PiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VJZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhY3Rpb25IYW5kbGVyOiAocmVhY3Rpb246IGFueSkgPT4gdm9pZDtcclxuXHJcbiAgY29uc3RydWN0b3IoY2xpZW50OiBhbnksIG1lc3NhZ2VJZDogc3RyaW5nLCBvcHRpb25zOiBSZWFjdGlvbkNvbGxlY3Rvck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKGNsaWVudCwgb3B0aW9ucyk7XHJcbiAgICB0aGlzLm1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDtcclxuICAgIFxyXG4gICAgdGhpcy5yZWFjdGlvbkhhbmRsZXIgPSAocmVhY3Rpb246IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVhY3Rpb24ubWVzc2FnZV9pZCA9PT0gdGhpcy5tZXNzYWdlSWQgfHwgcmVhY3Rpb24ubWVzc2FnZUlkID09PSB0aGlzLm1lc3NhZ2VJZCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ29sbGVjdChyZWFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIGNsaWVudC5vbignbWVzc2FnZVJlYWN0aW9uQWRkJywgdGhpcy5yZWFjdGlvbkhhbmRsZXIpO1xyXG4gICAgXHJcbiAgICB0aGlzLm9uY2UoJ2VuZCcsICgpID0+IHtcclxuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlUmVhY3Rpb25BZGQnLCB0aGlzLnJlYWN0aW9uSGFuZGxlcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbGxlY3QocmVhY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgLy8gS2V5IGlzIGVtb2ppIGlkZW50aWZpZXJcclxuICAgIHJldHVybiByZWFjdGlvbi5lbW9qaT8uaWQgPz8gcmVhY3Rpb24uZW1vamk/Lm5hbWUgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UocmVhY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHJlYWN0aW9uLmVtb2ppPy5pZCA/PyByZWFjdGlvbi5lbW9qaT8ubmFtZSA/PyBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEF3YWl0IG1lc3NhZ2VzIGhlbHBlclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGF3YWl0TWVzc2FnZXMoXHJcbiAgY2xpZW50OiBhbnksXHJcbiAgY2hhbm5lbElkOiBzdHJpbmcsXHJcbiAgb3B0aW9uczogTWVzc2FnZUNvbGxlY3Rvck9wdGlvbnMgPSB7fVxyXG4pOiBQcm9taXNlPENvbGxlY3Rpb248c3RyaW5nLCBhbnk+PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBNZXNzYWdlQ29sbGVjdG9yKGNsaWVudCwgY2hhbm5lbElkLCBvcHRpb25zKTtcclxuICAgIFxyXG4gICAgY29sbGVjdG9yLm9uY2UoJ2VuZCcsIChjb2xsZWN0ZWQsIHJlYXNvbikgPT4ge1xyXG4gICAgICBpZiAob3B0aW9ucy5tYXggJiYgY29sbGVjdGVkLnNpemUgPCBvcHRpb25zLm1heCkge1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbGxlY3RvciBlbmRlZCB3aXRoIHJlYXNvbjogJHtyZWFzb259YCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoY29sbGVjdGVkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBd2FpdCByZWFjdGlvbnMgaGVscGVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXdhaXRSZWFjdGlvbnMoXHJcbiAgY2xpZW50OiBhbnksXHJcbiAgbWVzc2FnZUlkOiBzdHJpbmcsXHJcbiAgb3B0aW9uczogUmVhY3Rpb25Db2xsZWN0b3JPcHRpb25zXHJcbik6IFByb21pc2U8Q29sbGVjdGlvbjxzdHJpbmcsIGFueT4+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgY29uc3QgY29sbGVjdG9yID0gbmV3IFJlYWN0aW9uQ29sbGVjdG9yKGNsaWVudCwgbWVzc2FnZUlkLCBvcHRpb25zKTtcclxuICAgIFxyXG4gICAgY29sbGVjdG9yLm9uY2UoJ2VuZCcsIChjb2xsZWN0ZWQsIHJlYXNvbikgPT4ge1xyXG4gICAgICBpZiAob3B0aW9ucy5tYXggJiYgY29sbGVjdGVkLnNpemUgPCBvcHRpb25zLm1heCkge1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbGxlY3RvciBlbmRlZCB3aXRoIHJlYXNvbjogJHtyZWFzb259YCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoY29sbGVjdGVkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbGxlY3RvcjtcclxuIl19
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Data resolver utilities for handling various data types
3
+ */
4
+ export type BufferResolvable = Buffer | string;
5
+ export type Base64Resolvable = Buffer | string;
6
+ /**
7
+ * Resolves various data types to usable formats
8
+ */
9
+ export declare class DataResolver {
10
+ /**
11
+ * Resolves a BufferResolvable to a Buffer
12
+ * @param resource The resource to resolve
13
+ */
14
+ static resolveBuffer(resource: BufferResolvable): Promise<Buffer>;
15
+ /**
16
+ * Resolves a Base64Resolvable to a base64 string
17
+ * @param resource The resource to resolve
18
+ * @param mimeType The MIME type for the data URI
19
+ */
20
+ static resolveBase64(resource: Base64Resolvable, mimeType?: string): Promise<string>;
21
+ /**
22
+ * Resolves a file to a name and buffer
23
+ * @param resource The file resource
24
+ */
25
+ static resolveFile(resource: BufferResolvable | {
26
+ name?: string;
27
+ attachment: BufferResolvable;
28
+ }): Promise<{
29
+ name: string;
30
+ data: Buffer;
31
+ }>;
32
+ /**
33
+ * Resolves multiple files
34
+ * @param resources The file resources
35
+ */
36
+ static resolveFiles(resources: (BufferResolvable | {
37
+ name?: string;
38
+ attachment: BufferResolvable;
39
+ })[]): Promise<{
40
+ name: string;
41
+ data: Buffer;
42
+ }[]>;
43
+ /**
44
+ * Resolves a color to a number
45
+ * @param color The color to resolve
46
+ */
47
+ static resolveColor(color: number | string | [number, number, number] | null): number | null;
48
+ /**
49
+ * Resolves a string to a snowflake ID
50
+ * @param value The value to resolve
51
+ */
52
+ static resolveSnowflake(value: string | number | {
53
+ id: string | number;
54
+ }): string;
55
+ /**
56
+ * Resolves an image to a base64 data URI
57
+ * @param image The image to resolve
58
+ */
59
+ static resolveImage(image: BufferResolvable): Promise<string>;
60
+ }
61
+ export default DataResolver;