@jubbio/core 1.3.1 → 1.3.3
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.
- package/dist/cjs/Client.d.ts +157 -0
- package/dist/cjs/Client.js +640 -0
- package/dist/cjs/builders/ActionRowBuilder.d.ts +53 -0
- package/dist/cjs/builders/ActionRowBuilder.js +68 -0
- package/dist/cjs/builders/ButtonBuilder.d.ts +77 -0
- package/dist/cjs/builders/ButtonBuilder.js +96 -0
- package/dist/cjs/builders/EmbedBuilder.d.ts +157 -0
- package/dist/cjs/builders/EmbedBuilder.js +208 -0
- package/dist/cjs/builders/ModalBuilder.d.ts +122 -0
- package/dist/cjs/builders/ModalBuilder.js +162 -0
- package/dist/cjs/builders/SelectMenuBuilder.d.ts +123 -0
- package/dist/cjs/builders/SelectMenuBuilder.js +165 -0
- package/dist/cjs/builders/SlashCommandBuilder.d.ts +197 -0
- package/dist/cjs/builders/SlashCommandBuilder.js +324 -0
- package/dist/cjs/builders/index.d.ts +9 -0
- package/dist/cjs/builders/index.js +26 -0
- package/dist/cjs/enums.d.ts +191 -0
- package/dist/cjs/enums.js +211 -0
- package/dist/cjs/index.d.ts +25 -0
- package/dist/cjs/index.js +130 -0
- package/dist/cjs/managers/BaseManager.d.ts +69 -0
- package/dist/cjs/managers/BaseManager.js +106 -0
- package/dist/cjs/managers/ChannelManager.d.ts +95 -0
- package/dist/cjs/managers/ChannelManager.js +205 -0
- package/dist/cjs/managers/GuildMemberManager.d.ts +74 -0
- package/dist/cjs/managers/GuildMemberManager.js +157 -0
- package/dist/cjs/managers/RoleManager.d.ts +84 -0
- package/dist/cjs/managers/RoleManager.js +207 -0
- package/dist/cjs/managers/index.d.ts +7 -0
- package/dist/cjs/managers/index.js +24 -0
- package/dist/cjs/rest/REST.d.ts +527 -0
- package/dist/cjs/rest/REST.js +904 -0
- package/dist/cjs/rest/index.d.ts +1 -0
- package/dist/cjs/rest/index.js +18 -0
- package/dist/cjs/sharding/ShardingManager.d.ts +179 -0
- package/dist/cjs/sharding/ShardingManager.js +375 -0
- package/dist/cjs/sharding/index.d.ts +4 -0
- package/dist/cjs/sharding/index.js +21 -0
- package/dist/cjs/structures/Channel.d.ts +122 -0
- package/dist/cjs/structures/Channel.js +240 -0
- package/dist/cjs/structures/Collection.d.ts +53 -0
- package/dist/cjs/structures/Collection.js +115 -0
- package/dist/cjs/structures/Guild.d.ts +59 -0
- package/dist/cjs/structures/Guild.js +94 -0
- package/dist/cjs/structures/GuildMember.d.ts +174 -0
- package/dist/cjs/structures/GuildMember.js +311 -0
- package/dist/cjs/structures/Interaction.d.ts +245 -0
- package/dist/cjs/structures/Interaction.js +450 -0
- package/dist/cjs/structures/Message.d.ts +98 -0
- package/dist/cjs/structures/Message.js +195 -0
- package/dist/cjs/structures/User.d.ts +37 -0
- package/dist/cjs/structures/User.js +65 -0
- package/dist/cjs/structures/index.d.ts +7 -0
- package/dist/cjs/structures/index.js +25 -0
- package/dist/cjs/structures.d.ts +1 -0
- package/dist/cjs/structures.js +19 -0
- package/dist/cjs/types.d.ts +255 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/utils/BitField.d.ts +66 -0
- package/dist/cjs/utils/BitField.js +138 -0
- package/dist/cjs/utils/Collection.d.ts +116 -0
- package/dist/cjs/utils/Collection.js +265 -0
- package/dist/cjs/utils/Collector.d.ts +152 -0
- package/dist/cjs/utils/Collector.js +314 -0
- package/dist/cjs/utils/DataResolver.d.ts +61 -0
- package/dist/cjs/utils/DataResolver.js +146 -0
- package/dist/cjs/utils/Formatters.d.ts +145 -0
- package/dist/cjs/utils/Formatters.js +213 -0
- package/dist/cjs/utils/IntentsBitField.d.ts +85 -0
- package/dist/cjs/utils/IntentsBitField.js +99 -0
- package/dist/cjs/utils/Partials.d.ts +104 -0
- package/dist/cjs/utils/Partials.js +148 -0
- package/dist/cjs/utils/PermissionsBitField.d.ts +118 -0
- package/dist/cjs/utils/PermissionsBitField.js +145 -0
- package/dist/cjs/utils/SnowflakeUtil.d.ts +63 -0
- package/dist/cjs/utils/SnowflakeUtil.js +93 -0
- package/dist/cjs/utils/Sweepers.d.ts +119 -0
- package/dist/cjs/utils/Sweepers.js +249 -0
- package/dist/cjs/utils/index.d.ts +13 -0
- package/dist/cjs/utils/index.js +30 -0
- package/dist/esm/Client.js +634 -0
- package/dist/esm/builders/ActionRowBuilder.js +64 -0
- package/dist/esm/builders/ButtonBuilder.js +92 -0
- package/dist/esm/builders/EmbedBuilder.js +204 -0
- package/dist/esm/builders/ModalBuilder.js +157 -0
- package/dist/esm/builders/SelectMenuBuilder.js +161 -0
- package/dist/esm/builders/SlashCommandBuilder.js +311 -0
- package/dist/esm/builders/index.js +10 -0
- package/dist/esm/enums.js +208 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/managers/BaseManager.js +100 -0
- package/dist/esm/managers/ChannelManager.js +200 -0
- package/dist/esm/managers/GuildMemberManager.js +153 -0
- package/dist/esm/managers/RoleManager.js +203 -0
- package/dist/esm/managers/index.js +8 -0
- package/dist/esm/rest/REST.js +900 -0
- package/dist/esm/rest/index.js +2 -0
- package/dist/esm/sharding/ShardingManager.js +366 -0
- package/dist/esm/sharding/index.js +5 -0
- package/dist/esm/structures/Channel.js +232 -0
- package/dist/esm/structures/Collection.js +111 -0
- package/dist/esm/structures/Guild.js +90 -0
- package/dist/esm/structures/GuildMember.js +306 -0
- package/dist/esm/structures/Interaction.js +438 -0
- package/dist/esm/structures/Message.js +191 -0
- package/dist/esm/structures/User.js +61 -0
- package/dist/esm/structures/index.js +9 -0
- package/dist/esm/structures.js +3 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils/BitField.js +134 -0
- package/dist/esm/utils/Collection.js +261 -0
- package/dist/esm/utils/Collector.js +305 -0
- package/dist/esm/utils/DataResolver.js +142 -0
- package/dist/esm/utils/Formatters.js +191 -0
- package/dist/esm/utils/IntentsBitField.js +93 -0
- package/dist/esm/utils/Partials.js +137 -0
- package/dist/esm/utils/PermissionsBitField.js +141 -0
- package/dist/esm/utils/SnowflakeUtil.js +89 -0
- package/dist/esm/utils/Sweepers.js +245 -0
- package/dist/esm/utils/index.js +14 -0
- package/package.json +14 -4
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { User } from './User';
|
|
2
|
+
/**
|
|
3
|
+
* Permission flags - permission bits
|
|
4
|
+
* Must match community-service/internal/guild/models/permissions.go (truth of source)
|
|
5
|
+
*/
|
|
6
|
+
export const PermissionFlags = {
|
|
7
|
+
// General (0-9)
|
|
8
|
+
CreateInstantInvite: 1n << 0n,
|
|
9
|
+
KickMembers: 1n << 1n,
|
|
10
|
+
BanMembers: 1n << 2n,
|
|
11
|
+
Administrator: 1n << 3n,
|
|
12
|
+
ManageChannels: 1n << 4n,
|
|
13
|
+
ManageGuild: 1n << 5n,
|
|
14
|
+
AddReactions: 1n << 6n,
|
|
15
|
+
ViewAuditLog: 1n << 7n,
|
|
16
|
+
ViewGuildInsights: 1n << 8n,
|
|
17
|
+
Stream: 1n << 9n,
|
|
18
|
+
ViewChannel: 1n << 10n,
|
|
19
|
+
// Messages (11-19)
|
|
20
|
+
SendMessages: 1n << 11n,
|
|
21
|
+
SendTTSMessages: 1n << 12n,
|
|
22
|
+
ManageMessages: 1n << 13n,
|
|
23
|
+
EmbedLinks: 1n << 14n,
|
|
24
|
+
AttachFiles: 1n << 15n,
|
|
25
|
+
ReadMessageHistory: 1n << 16n,
|
|
26
|
+
UseExternalEmojis: 1n << 17n,
|
|
27
|
+
UseSlashCommands: 1n << 18n,
|
|
28
|
+
MentionEveryone: 1n << 19n,
|
|
29
|
+
// Voice (20-27)
|
|
30
|
+
Connect: 1n << 20n,
|
|
31
|
+
Speak: 1n << 21n,
|
|
32
|
+
MuteMembers: 1n << 22n,
|
|
33
|
+
DeafenMembers: 1n << 23n,
|
|
34
|
+
MoveMembers: 1n << 24n,
|
|
35
|
+
UseVAD: 1n << 25n,
|
|
36
|
+
ChangeCodec: 1n << 26n,
|
|
37
|
+
AudioQualityAdmin: 1n << 27n,
|
|
38
|
+
// Video and Screen Sharing (28-37)
|
|
39
|
+
VideoCall: 1n << 28n,
|
|
40
|
+
ShareScreen: 1n << 29n,
|
|
41
|
+
ShareCamera: 1n << 30n,
|
|
42
|
+
ControlQuality: 1n << 31n,
|
|
43
|
+
RequestToSpeak: 1n << 32n,
|
|
44
|
+
ManageEvents: 1n << 33n,
|
|
45
|
+
AddMembers: 1n << 34n,
|
|
46
|
+
RemoveMembers: 1n << 35n,
|
|
47
|
+
ChangeGroupIcon: 1n << 36n,
|
|
48
|
+
ChangeDMSettings: 1n << 37n,
|
|
49
|
+
// Advanced (38-43)
|
|
50
|
+
ManageGroup: 1n << 38n,
|
|
51
|
+
UseActivities: 1n << 39n,
|
|
52
|
+
ModerateMembers: 1n << 40n,
|
|
53
|
+
ManageRoles: 1n << 41n,
|
|
54
|
+
ManageEmojis: 1n << 42n,
|
|
55
|
+
PrioritySpeaker: 1n << 43n,
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Permissions helper class
|
|
59
|
+
*/
|
|
60
|
+
export class Permissions {
|
|
61
|
+
bitfield;
|
|
62
|
+
isOwner;
|
|
63
|
+
constructor(bits = 0n, isOwner = false) {
|
|
64
|
+
if (typeof bits === 'string') {
|
|
65
|
+
this.bitfield = BigInt(bits);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.bitfield = BigInt(bits);
|
|
69
|
+
}
|
|
70
|
+
this.isOwner = isOwner;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if has a permission
|
|
74
|
+
*/
|
|
75
|
+
has(permission, checkAdmin = true) {
|
|
76
|
+
// Owner has all permissions
|
|
77
|
+
if (this.isOwner)
|
|
78
|
+
return true;
|
|
79
|
+
// Administrator has all permissions
|
|
80
|
+
if (checkAdmin && (this.bitfield & PermissionFlags.Administrator) === PermissionFlags.Administrator) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
const bit = Permissions.resolve(permission);
|
|
84
|
+
return (this.bitfield & bit) === bit;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if has any of the given permissions
|
|
88
|
+
*/
|
|
89
|
+
any(permissions, checkAdmin = true) {
|
|
90
|
+
// Owner has all permissions
|
|
91
|
+
if (this.isOwner)
|
|
92
|
+
return true;
|
|
93
|
+
// Administrator has all permissions
|
|
94
|
+
if (checkAdmin && (this.bitfield & PermissionFlags.Administrator) === PermissionFlags.Administrator) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
for (const permission of permissions) {
|
|
98
|
+
const bit = Permissions.resolve(permission);
|
|
99
|
+
if ((this.bitfield & bit) === bit)
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Return array of permission names that are missing
|
|
106
|
+
*/
|
|
107
|
+
missing(permissions, checkAdmin = true) {
|
|
108
|
+
const missing = [];
|
|
109
|
+
for (const permission of permissions) {
|
|
110
|
+
if (!this.has(permission, checkAdmin)) {
|
|
111
|
+
if (typeof permission === 'string') {
|
|
112
|
+
missing.push(permission);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Reverse lookup name from bigint
|
|
116
|
+
const name = Object.entries(PermissionFlags).find(([, v]) => v === permission)?.[0];
|
|
117
|
+
missing.push(name || permission.toString());
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return missing;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Add permissions to this bitfield. Chainable.
|
|
125
|
+
*/
|
|
126
|
+
add(...permissions) {
|
|
127
|
+
for (const permission of permissions) {
|
|
128
|
+
this.bitfield |= Permissions.resolve(permission);
|
|
129
|
+
}
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Remove permissions from this bitfield. Chainable.
|
|
134
|
+
*/
|
|
135
|
+
remove(...permissions) {
|
|
136
|
+
for (const permission of permissions) {
|
|
137
|
+
this.bitfield &= ~Permissions.resolve(permission);
|
|
138
|
+
}
|
|
139
|
+
return this;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check equality with another Permissions or bigint
|
|
143
|
+
*/
|
|
144
|
+
equals(other) {
|
|
145
|
+
if (other instanceof Permissions) {
|
|
146
|
+
return this.bitfield === other.bitfield;
|
|
147
|
+
}
|
|
148
|
+
return this.bitfield === BigInt(other);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Create a new Permissions with the same bits
|
|
152
|
+
*/
|
|
153
|
+
clone() {
|
|
154
|
+
return new Permissions(this.bitfield, this.isOwner);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Freeze this instance (immutable)
|
|
158
|
+
*/
|
|
159
|
+
freeze() {
|
|
160
|
+
return Object.freeze(this);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the raw bitfield
|
|
164
|
+
*/
|
|
165
|
+
get bits() {
|
|
166
|
+
return this.bitfield;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Convert to array of permission names
|
|
170
|
+
*/
|
|
171
|
+
toArray() {
|
|
172
|
+
const result = [];
|
|
173
|
+
for (const [name, bit] of Object.entries(PermissionFlags)) {
|
|
174
|
+
if ((this.bitfield & bit) === bit) {
|
|
175
|
+
result.push(name);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Serialize to JSON-compatible string
|
|
182
|
+
*/
|
|
183
|
+
toJSON() {
|
|
184
|
+
return this.bitfield.toString();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* String representation
|
|
188
|
+
*/
|
|
189
|
+
toString() {
|
|
190
|
+
return this.bitfield.toString();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Resolve a permission name or bigint to bigint
|
|
194
|
+
*/
|
|
195
|
+
static resolve(permission) {
|
|
196
|
+
if (typeof permission === 'bigint')
|
|
197
|
+
return permission;
|
|
198
|
+
const bit = PermissionFlags[permission];
|
|
199
|
+
if (bit === undefined) {
|
|
200
|
+
throw new Error(`Unknown permission: ${permission}`);
|
|
201
|
+
}
|
|
202
|
+
return bit;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Represents a guild member
|
|
207
|
+
*/
|
|
208
|
+
export class GuildMember {
|
|
209
|
+
/** Reference to the client */
|
|
210
|
+
client;
|
|
211
|
+
/** Reference to the guild */
|
|
212
|
+
guild;
|
|
213
|
+
/** The user this member represents */
|
|
214
|
+
user;
|
|
215
|
+
/** Member's nickname */
|
|
216
|
+
nickname;
|
|
217
|
+
/** Member's guild avatar */
|
|
218
|
+
avatar;
|
|
219
|
+
/** Role IDs */
|
|
220
|
+
roles;
|
|
221
|
+
/** Join timestamp */
|
|
222
|
+
joinedTimestamp;
|
|
223
|
+
/** Voice state */
|
|
224
|
+
voice;
|
|
225
|
+
/** Member permissions */
|
|
226
|
+
permissions;
|
|
227
|
+
constructor(client, guild, data) {
|
|
228
|
+
this.client = client;
|
|
229
|
+
this.guild = guild;
|
|
230
|
+
this.user = data.user ? new User(data.user) : new User({ id: '0', username: 'Unknown' });
|
|
231
|
+
this.nickname = data.nick;
|
|
232
|
+
this.avatar = data.avatar;
|
|
233
|
+
this.roles = data.roles;
|
|
234
|
+
this.joinedTimestamp = new Date(data.joined_at).getTime();
|
|
235
|
+
this.voice = {
|
|
236
|
+
channelId: data.voice?.channel_id,
|
|
237
|
+
selfMute: data.voice?.self_mute ?? false,
|
|
238
|
+
selfDeaf: data.voice?.self_deaf ?? false
|
|
239
|
+
};
|
|
240
|
+
// Check if user is guild owner
|
|
241
|
+
const isOwner = guild.ownerId === this.user.id;
|
|
242
|
+
// Parse permissions from interaction data
|
|
243
|
+
this.permissions = new Permissions(data.permissions || '0', isOwner);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get the member's ID
|
|
247
|
+
*/
|
|
248
|
+
get id() {
|
|
249
|
+
return this.user.id;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get the display name (nickname or username)
|
|
253
|
+
*/
|
|
254
|
+
get displayName() {
|
|
255
|
+
return this.nickname || this.user.displayName || this.user.username;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get the join date
|
|
259
|
+
*/
|
|
260
|
+
get joinedAt() {
|
|
261
|
+
return new Date(this.joinedTimestamp);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check if member is in a voice channel
|
|
265
|
+
*/
|
|
266
|
+
get inVoiceChannel() {
|
|
267
|
+
return !!this.voice.channelId;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get the member's avatar URL
|
|
271
|
+
*/
|
|
272
|
+
avatarURL() {
|
|
273
|
+
return this.avatar || null;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get the display avatar URL (member avatar or user avatar)
|
|
277
|
+
*/
|
|
278
|
+
displayAvatarURL() {
|
|
279
|
+
return this.avatar || this.user.displayAvatarURL();
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Convert to string (mention format)
|
|
283
|
+
*/
|
|
284
|
+
toString() {
|
|
285
|
+
return `<@${this.id}>`;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Update member data
|
|
289
|
+
*/
|
|
290
|
+
_patch(data) {
|
|
291
|
+
if (data.nick !== undefined)
|
|
292
|
+
this.nickname = data.nick;
|
|
293
|
+
if (data.avatar !== undefined)
|
|
294
|
+
this.avatar = data.avatar;
|
|
295
|
+
if (data.roles !== undefined)
|
|
296
|
+
this.roles = data.roles;
|
|
297
|
+
if (data.voice !== undefined) {
|
|
298
|
+
this.voice = {
|
|
299
|
+
channelId: data.voice.channel_id,
|
|
300
|
+
selfMute: data.voice.self_mute ?? false,
|
|
301
|
+
selfDeaf: data.voice.self_deaf ?? false
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpbGRNZW1iZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RydWN0dXJlcy9HdWlsZE1lbWJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSTlCOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixnQkFBZ0I7SUFDaEIsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUU7SUFDN0IsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFO0lBQ3JCLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRTtJQUNwQixhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUU7SUFDdkIsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFO0lBQ3hCLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRTtJQUNyQixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUU7SUFDdEIsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFO0lBQ3RCLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFO0lBQzNCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRTtJQUNoQixXQUFXLEVBQUUsRUFBRSxJQUFJLEdBQUc7SUFFdEIsbUJBQW1CO0lBQ25CLFlBQVksRUFBRSxFQUFFLElBQUksR0FBRztJQUN2QixlQUFlLEVBQUUsRUFBRSxJQUFJLEdBQUc7SUFDMUIsY0FBYyxFQUFFLEVBQUUsSUFBSSxHQUFHO0lBQ3pCLFVBQVUsRUFBRSxFQUFFLElBQUksR0FBRztJQUNyQixXQUFXLEVBQUUsRUFBRSxJQUFJLEdBQUc7SUFDdEIsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEdBQUc7SUFDN0IsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEdBQUc7SUFDNUIsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEdBQUc7SUFDM0IsZUFBZSxFQUFFLEVBQUUsSUFBSSxHQUFHO0lBRTFCLGdCQUFnQjtJQUNoQixPQUFPLEVBQUUsRUFB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QUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLO2FBQ3hDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBJR3VpbGRNZW1iZXIgfSBmcm9tICcuLi90eXBlcyc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL1VzZXInO1xyXG5pbXBvcnQgeyBHdWlsZCB9IGZyb20gJy4vR3VpbGQnO1xyXG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL0NsaWVudCc7XHJcblxyXG4vKipcclxuICogUGVybWlzc2lvbiBmbGFncyAtIHBlcm1pc3Npb24gYml0c1xyXG4gKiBNdXN0IG1hdGNoIGNvbW11bml0eS1zZXJ2aWNlL2ludGVybmFsL2d1aWxkL21vZGVscy9wZXJtaXNzaW9ucy5nbyAodHJ1dGggb2Ygc291cmNlKVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBlcm1pc3Npb25GbGFncyA9IHtcclxuICAvLyBHZW5lcmFsICgwLTkpXHJcbiAgQ3JlYXRlSW5zdGFudEludml0ZTogMW4gPDwgMG4sXHJcbiAgS2lja01lbWJlcnM6IDFuIDw8IDFuLFxyXG4gIEJhbk1lbWJlcnM6IDFuIDw8IDJuLFxyXG4gIEFkbWluaXN0cmF0b3I6IDFuIDw8IDNuLFxyXG4gIE1hbmFnZUNoYW5uZWxzOiAxbiA8PCA0bixcclxuICBNYW5hZ2VHdWlsZDogMW4gPDwgNW4sXHJcbiAgQWRkUmVhY3Rpb25zOiAxbiA8PCA2bixcclxuICBWaWV3QXVkaXRMb2c6IDFuIDw8IDduLFxyXG4gIFZpZXdHdWlsZEluc2lnaHRzOiAxbiA8PCA4bixcclxuICBTdHJlYW06IDFuIDw8IDluLFxyXG4gIFZpZXdDaGFubmVsOiAxbiA8PCAxMG4sXHJcblxyXG4gIC8vIE1lc3NhZ2VzICgxMS0xOSlcclxuICBTZW5kTWVzc2FnZXM6IDFuIDw8IDExbixcclxuICBTZW5kVFRTTWVzc2FnZXM6IDFuIDw8IDEybixcclxuICBNYW5hZ2VNZXNzYWdlczogMW4gPDwgMTNuLFxyXG4gIEVtYmVkTGlua3M6IDFuIDw8IDE0bixcclxuICBBdHRhY2hGaWxlczogMW4gPDwgMTVuLFxyXG4gIFJlYWRNZXNzYWdlSGlzdG9yeTogMW4gPDwgMTZuLFxyXG4gIFVzZUV4dGVybmFsRW1vamlzOiAxbiA8PCAxN24sXHJcbiAgVXNlU2xhc2hDb21tYW5kczogMW4gPDwgMThuLFxyXG4gIE1lbnRpb25FdmVyeW9uZTogMW4gPDwgMTluLFxyXG5cclxuICAvLyBWb2ljZSAoMjAtMjcpXHJcbiAgQ29ubmVjdDogMW4gPDwgMjBuLFxyXG4gIFNwZWFrOiAxbiA8PCAyMW4sXHJcbiAgTXV0ZU1lbWJlcnM6IDFuIDw8IDIybixcclxuICBEZWFmZW5NZW1iZXJzOiAxbiA8PCAyM24sXHJcbiAgTW92ZU1lbWJlcnM6IDFuIDw8IDI0bixcclxuICBVc2VWQUQ6IDFuIDw8IDI1bixcclxuICBDaGFuZ2VDb2RlYzogMW4gPDwgMjZuLFxyXG4gIEF1ZGlvUXVhbGl0eUFkbWluOiAxbiA8PCAyN24sXHJcblxyXG4gIC8vIFZpZGVvIGFuZCBTY3JlZW4gU2hhcmluZyAoMjgtMzcpXHJcbiAgVmlkZW9DYWxsOiAxbiA8PCAyOG4sXHJcbiAgU2hhcmVTY3JlZW46IDFuIDw8IDI5bixcclxuICBTaGFyZUNhbWVyYTogMW4gPDwgMzBuLFxyXG4gIENvbnRyb2xRdWFsaXR5OiAxbiA8PCAzMW4sXHJcbiAgUmVxdWVzdFRvU3BlYWs6IDFuIDw8IDMybixcclxuICBNYW5hZ2VFdmVudHM6IDFuIDw8IDMzbixcclxuICBBZGRNZW1iZXJzOiAxbiA8PCAzNG4sXHJcbiAgUmVtb3ZlTWVtYmVyczogMW4gPDwgMzVuLFxyXG4gIENoYW5nZUdyb3VwSWNvbjogMW4gPDwgMzZuLFxyXG4gIENoYW5nZURNU2V0dGluZ3M6IDFuIDw8IDM3bixcclxuXHJcbiAgLy8gQWR2YW5jZWQgKDM4LTQzKVxyXG4gIE1hbmFnZUdyb3VwOiAxbiA8PCAzOG4sXHJcbiAgVXNlQWN0aXZpdGllczogMW4gPDwgMzluLFxyXG4gIE1vZGVyYXRlTWVtYmVyczogMW4gPDwgNDBuLFxyXG4gIE1hbmFnZVJvbGVzOiAxbiA8PCA0MW4sXHJcbiAgTWFuYWdlRW1vamlzOiAxbiA8PCA0Mm4sXHJcbiAgUHJpb3JpdHlTcGVha2VyOiAxbiA8PCA0M24sXHJcbn0gYXMgY29uc3Q7XHJcblxyXG4vKipcclxuICogUGVybWlzc2lvbnMgaGVscGVyIGNsYXNzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbnMge1xyXG4gIHByaXZhdGUgYml0ZmllbGQ6IGJpZ2ludDtcclxuICBwcml2YXRlIGlzT3duZXI6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGJpdHM6IHN0cmluZyB8IGJpZ2ludCB8IG51bWJlciA9IDBuLCBpc093bmVyID0gZmFsc2UpIHtcclxuICAgIGlmICh0eXBlb2YgYml0cyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5iaXRmaWVsZCA9IEJpZ0ludChiaXRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYml0ZmllbGQgPSBCaWdJbnQoYml0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzT3duZXIgPSBpc093bmVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgaGFzIGEgcGVybWlzc2lvblxyXG4gICAqL1xyXG4gIGhhcyhwZXJtaXNzaW9uOiBzdHJpbmcgfCBiaWdpbnQsIGNoZWNrQWRtaW4gPSB0cnVlKTogYm9vbGVhbiB7XHJcbiAgICAvLyBPd25lciBoYXMgYWxsIHBlcm1pc3Npb25zXHJcbiAgICBpZiAodGhpcy5pc093bmVyKSByZXR1cm4gdHJ1ZTtcclxuICAgIFxyXG4gICAgLy8gQWRtaW5pc3RyYXRvciBoYXMgYWxsIHBlcm1pc3Npb25zXHJcbiAgICBpZiAoY2hlY2tBZG1pbiAmJiAodGhpcy5iaXRmaWVsZCAmIFBlcm1pc3Npb25GbGFncy5BZG1pbmlzdHJhdG9yKSA9PT0gUGVybWlzc2lvbkZsYWdzLkFkbWluaXN0cmF0b3IpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IGJpdCA9IFBlcm1pc3Npb25zLnJlc29sdmUocGVybWlzc2lvbik7XHJcbiAgICByZXR1cm4gKHRoaXMuYml0ZmllbGQgJiBiaXQpID09PSBiaXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBoYXMgYW55IG9mIHRoZSBnaXZlbiBwZXJtaXNzaW9uc1xyXG4gICAqL1xyXG4gIGFueShwZXJtaXNzaW9uczogKHN0cmluZyB8IGJpZ2ludClbXSwgY2hlY2tBZG1pbiA9IHRydWUpOiBib29sZWFuIHtcclxuICAgIC8vIE93bmVyIGhhcyBhbGwgcGVybWlzc2lvbnNcclxuICAgIGlmICh0aGlzLmlzT3duZXIpIHJldHVybiB0cnVlO1xyXG4gICAgXHJcbiAgICAvLyBBZG1pbmlzdHJhdG9yIGhhcyBhbGwgcGVybWlzc2lvbnNcclxuICAgIGlmIChjaGVja0FkbWluICYmICh0aGlzLmJpdGZpZWxkICYgUGVybWlzc2lvbkZsYWdzLkFkbWluaXN0cmF0b3IpID09PSBQZXJtaXNzaW9uRmxhZ3MuQWRtaW5pc3RyYXRvcikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XHJcbiAgICAgIGNvbnN0IGJpdCA9IFBlcm1pc3Npb25zLnJlc29sdmUocGVybWlzc2lvbik7XHJcbiAgICAgIGlmICgodGhpcy5iaXRmaWVsZCAmIGJpdCkgPT09IGJpdCkgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBhcnJheSBvZiBwZXJtaXNzaW9uIG5hbWVzIHRoYXQgYXJlIG1pc3NpbmdcclxuICAgKi9cclxuICBtaXNzaW5nKHBlcm1pc3Npb25zOiAoc3RyaW5nIHwgYmlnaW50KVtdLCBjaGVja0FkbWluID0gdHJ1ZSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IG1pc3Npbmc6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgcGVybWlzc2lvbnMpIHtcclxuICAgICAgaWYgKCF0aGlzLmhhcyhwZXJtaXNzaW9uLCBjaGVja0FkbWluKSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGVybWlzc2lvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIG1pc3NpbmcucHVzaChwZXJtaXNzaW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gUmV2ZXJzZSBsb29rdXAgbmFtZSBmcm9tIGJpZ2ludFxyXG4gICAgICAgICAgY29uc3QgbmFtZSA9IE9iamVjdC5lbnRyaWVzKFBlcm1pc3Npb25GbGFncykuZmluZCgoWywgdl0pID0+IHYgPT09IHBlcm1pc3Npb24pPy5bMF07XHJcbiAgICAgICAgICBtaXNzaW5nLnB1c2gobmFtZSB8fCBwZXJtaXNzaW9uLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1pc3Npbmc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgcGVybWlzc2lvbnMgdG8gdGhpcyBiaXRmaWVsZC4gQ2hhaW5hYmxlLlxyXG4gICAqL1xyXG4gIGFkZCguLi5wZXJtaXNzaW9uczogKHN0cmluZyB8IGJpZ2ludClbXSk6IHRoaXMge1xyXG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XHJcbiAgICAgIHRoaXMuYml0ZmllbGQgfD0gUGVybWlzc2lvbnMucmVzb2x2ZShwZXJtaXNzaW9uKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHBlcm1pc3Npb25zIGZyb20gdGhpcyBiaXRmaWVsZC4gQ2hhaW5hYmxlLlxyXG4gICAqL1xyXG4gIHJlbW92ZSguLi5wZXJtaXNzaW9uczogKHN0cmluZyB8IGJpZ2ludClbXSk6IHRoaXMge1xyXG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XHJcbiAgICAgIHRoaXMuYml0ZmllbGQgJj0gflBlcm1pc3Npb25zLnJlc29sdmUocGVybWlzc2lvbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGVxdWFsaXR5IHdpdGggYW5vdGhlciBQZXJtaXNzaW9ucyBvciBiaWdpbnRcclxuICAgKi9cclxuICBlcXVhbHMob3RoZXI6IFBlcm1pc3Npb25zIHwgYmlnaW50IHwgc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBQZXJtaXNzaW9ucykge1xyXG4gICAgICByZXR1cm4gdGhpcy5iaXRmaWVsZCA9PT0gb3RoZXIuYml0ZmllbGQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5iaXRmaWVsZCA9PT0gQmlnSW50KG90aGVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG5ldyBQZXJtaXNzaW9ucyB3aXRoIHRoZSBzYW1lIGJpdHNcclxuICAgKi9cclxuICBjbG9uZSgpOiBQZXJtaXNzaW9ucyB7XHJcbiAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25zKHRoaXMuYml0ZmllbGQsIHRoaXMuaXNPd25lcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGcmVlemUgdGhpcyBpbnN0YW5jZSAoaW1tdXRhYmxlKVxyXG4gICAqL1xyXG4gIGZyZWV6ZSgpOiBSZWFkb25seTx0aGlzPiB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcmF3IGJpdGZpZWxkXHJcbiAgICovXHJcbiAgZ2V0IGJpdHMoKTogYmlnaW50IHtcclxuICAgIHJldHVybiB0aGlzLmJpdGZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCB0byBhcnJheSBvZiBwZXJtaXNzaW9uIG5hbWVzXHJcbiAgICovXHJcbiAgdG9BcnJheSgpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBiaXRdIG9mIE9iamVjdC5lbnRyaWVzKFBlcm1pc3Npb25GbGFncykpIHtcclxuICAgICAgaWYgKCh0aGlzLmJpdGZpZWxkICYgYml0KSA9PT0gYml0KSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gobmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXJpYWxpemUgdG8gSlNPTi1jb21wYXRpYmxlIHN0cmluZ1xyXG4gICAqL1xyXG4gIHRvSlNPTigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYml0ZmllbGQudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0cmluZyByZXByZXNlbnRhdGlvblxyXG4gICAqL1xyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iaXRmaWVsZC50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZSBhIHBlcm1pc3Npb24gbmFtZSBvciBiaWdpbnQgdG8gYmlnaW50XHJcbiAgICovXHJcbiAgc3RhdGljIHJlc29sdmUocGVybWlzc2lvbjogc3RyaW5nIHwgYmlnaW50KTogYmlnaW50IHtcclxuICAgIGlmICh0eXBlb2YgcGVybWlzc2lvbiA9PT0gJ2JpZ2ludCcpIHJldHVybiBwZXJtaXNzaW9uO1xyXG4gICAgY29uc3QgYml0ID0gUGVybWlzc2lvbkZsYWdzW3Blcm1pc3Npb24gYXMga2V5b2YgdHlwZW9mIFBlcm1pc3Npb25GbGFnc107XHJcbiAgICBpZiAoYml0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBlcm1pc3Npb246ICR7cGVybWlzc2lvbn1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiBiaXQ7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGd1aWxkIG1lbWJlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEd1aWxkTWVtYmVyIHtcclxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBjbGllbnQgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XHJcbiAgXHJcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgZ3VpbGQgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgZ3VpbGQ6IEd1aWxkO1xyXG4gIFxyXG4gIC8qKiBUaGUgdXNlciB0aGlzIG1lbWJlciByZXByZXNlbnRzICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IFVzZXI7XHJcbiAgXHJcbiAgLyoqIE1lbWJlcidzIG5pY2tuYW1lICovXHJcbiAgcHVibGljIG5pY2tuYW1lPzogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBNZW1iZXIncyBndWlsZCBhdmF0YXIgKi9cclxuICBwdWJsaWMgYXZhdGFyPzogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBSb2xlIElEcyAqL1xyXG4gIHB1YmxpYyByb2xlczogc3RyaW5nW107XHJcbiAgXHJcbiAgLyoqIEpvaW4gdGltZXN0YW1wICovXHJcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZFRpbWVzdGFtcDogbnVtYmVyO1xyXG4gIFxyXG4gIC8qKiBWb2ljZSBzdGF0ZSAqL1xyXG4gIHB1YmxpYyB2b2ljZToge1xyXG4gICAgY2hhbm5lbElkPzogc3RyaW5nO1xyXG4gICAgc2VsZk11dGU6IGJvb2xlYW47XHJcbiAgICBzZWxmRGVhZjogYm9vbGVhbjtcclxuICB9O1xyXG4gIFxyXG4gIC8qKiBNZW1iZXIgcGVybWlzc2lvbnMgKi9cclxuICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgZ3VpbGQ6IEd1aWxkLCBkYXRhOiBBUElHdWlsZE1lbWJlcikge1xyXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XHJcbiAgICB0aGlzLmd1aWxkID0gZ3VpbGQ7XHJcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgPyBuZXcgVXNlcihkYXRhLnVzZXIpIDogbmV3IFVzZXIoeyBpZDogJzAnLCB1c2VybmFtZTogJ1Vua25vd24nIH0pO1xyXG4gICAgdGhpcy5uaWNrbmFtZSA9IGRhdGEubmljaztcclxuICAgIHRoaXMuYXZhdGFyID0gZGF0YS5hdmF0YXI7XHJcbiAgICB0aGlzLnJvbGVzID0gZGF0YS5yb2xlcztcclxuICAgIHRoaXMuam9pbmVkVGltZXN0YW1wID0gbmV3IERhdGUoZGF0YS5qb2luZWRfYXQpLmdldFRpbWUoKTtcclxuICAgIHRoaXMudm9pY2UgPSB7XHJcbiAgICAgIGNoYW5uZWxJZDogZGF0YS52b2ljZT8uY2hhbm5lbF9pZCxcclxuICAgICAgc2VsZk11dGU6IGRhdGEudm9pY2U/LnNlbGZfbXV0ZSA/PyBmYWxzZSxcclxuICAgICAgc2VsZkRlYWY6IGRhdGEudm9pY2U/LnNlbGZfZGVhZiA/PyBmYWxzZVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBpcyBndWlsZCBvd25lclxyXG4gICAgY29uc3QgaXNPd25lciA9IGd1aWxkLm93bmVySWQgPT09IHRoaXMudXNlci5pZDtcclxuICAgIFxyXG4gICAgLy8gUGFyc2UgcGVybWlzc2lvbnMgZnJvbSBpbnRlcmFjdGlvbiBkYXRhXHJcbiAgICB0aGlzLnBlcm1pc3Npb25zID0gbmV3IFBlcm1pc3Npb25zKGRhdGEucGVybWlzc2lvbnMgfHwgJzAnLCBpc093bmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbWVtYmVyJ3MgSURcclxuICAgKi9cclxuICBnZXQgaWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXIuaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSAobmlja25hbWUgb3IgdXNlcm5hbWUpXHJcbiAgICovXHJcbiAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uaWNrbmFtZSB8fCB0aGlzLnVzZXIuZGlzcGxheU5hbWUgfHwgdGhpcy51c2VyLnVzZXJuYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBqb2luIGRhdGVcclxuICAgKi9cclxuICBnZXQgam9pbmVkQXQoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5qb2luZWRUaW1lc3RhbXApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgbWVtYmVyIGlzIGluIGEgdm9pY2UgY2hhbm5lbFxyXG4gICAqL1xyXG4gIGdldCBpblZvaWNlQ2hhbm5lbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudm9pY2UuY2hhbm5lbElkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBtZW1iZXIncyBhdmF0YXIgVVJMXHJcbiAgICovXHJcbiAgYXZhdGFyVVJMKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuYXZhdGFyIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGRpc3BsYXkgYXZhdGFyIFVSTCAobWVtYmVyIGF2YXRhciBvciB1c2VyIGF2YXRhcilcclxuICAgKi9cclxuICBkaXNwbGF5QXZhdGFyVVJMKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdmF0YXIgfHwgdGhpcy51c2VyLmRpc3BsYXlBdmF0YXJVUkwoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgdG8gc3RyaW5nIChtZW50aW9uIGZvcm1hdClcclxuICAgKi9cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGA8QCR7dGhpcy5pZH0+YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBtZW1iZXIgZGF0YVxyXG4gICAqL1xyXG4gIF9wYXRjaChkYXRhOiBQYXJ0aWFsPEFQSUd1aWxkTWVtYmVyPik6IHZvaWQge1xyXG4gICAgaWYgKGRhdGEubmljayAhPT0gdW5kZWZpbmVkKSB0aGlzLm5pY2tuYW1lID0gZGF0YS5uaWNrO1xyXG4gICAgaWYgKGRhdGEuYXZhdGFyICE9PSB1bmRlZmluZWQpIHRoaXMuYXZhdGFyID0gZGF0YS5hdmF0YXI7XHJcbiAgICBpZiAoZGF0YS5yb2xlcyAhPT0gdW5kZWZpbmVkKSB0aGlzLnJvbGVzID0gZGF0YS5yb2xlcztcclxuICAgIGlmIChkYXRhLnZvaWNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy52b2ljZSA9IHtcclxuICAgICAgICBjaGFubmVsSWQ6IGRhdGEudm9pY2UuY2hhbm5lbF9pZCxcclxuICAgICAgICBzZWxmTXV0ZTogZGF0YS52b2ljZS5zZWxmX211dGUgPz8gZmFsc2UsXHJcbiAgICAgICAgc2VsZkRlYWY6IGRhdGEudm9pY2Uuc2VsZl9kZWFmID8/IGZhbHNlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|