@jubbio/core 1.3.3 → 1.3.4
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/Client.js +50 -10
- package/dist/rest/REST.d.ts +1 -0
- package/dist/rest/REST.js +1 -1
- package/dist/structures/Channel.d.ts +1 -1
- package/dist/structures/Channel.js +11 -4
- package/dist/structures/Guild.d.ts +1 -1
- package/dist/structures/Guild.js +7 -3
- package/dist/structures/Message.d.ts +2 -0
- package/dist/structures/Message.js +13 -33
- package/package.json +4 -14
- package/dist/cjs/Client.d.ts +0 -157
- package/dist/cjs/Client.js +0 -640
- package/dist/cjs/builders/ActionRowBuilder.d.ts +0 -53
- package/dist/cjs/builders/ActionRowBuilder.js +0 -68
- package/dist/cjs/builders/ButtonBuilder.d.ts +0 -77
- package/dist/cjs/builders/ButtonBuilder.js +0 -96
- package/dist/cjs/builders/EmbedBuilder.d.ts +0 -157
- package/dist/cjs/builders/EmbedBuilder.js +0 -208
- package/dist/cjs/builders/ModalBuilder.d.ts +0 -122
- package/dist/cjs/builders/ModalBuilder.js +0 -162
- package/dist/cjs/builders/SelectMenuBuilder.d.ts +0 -123
- package/dist/cjs/builders/SelectMenuBuilder.js +0 -165
- package/dist/cjs/builders/SlashCommandBuilder.d.ts +0 -197
- package/dist/cjs/builders/SlashCommandBuilder.js +0 -324
- package/dist/cjs/builders/index.d.ts +0 -9
- package/dist/cjs/builders/index.js +0 -26
- package/dist/cjs/enums.d.ts +0 -191
- package/dist/cjs/enums.js +0 -211
- package/dist/cjs/index.d.ts +0 -25
- package/dist/cjs/index.js +0 -130
- package/dist/cjs/managers/BaseManager.d.ts +0 -69
- package/dist/cjs/managers/BaseManager.js +0 -106
- package/dist/cjs/managers/ChannelManager.d.ts +0 -95
- package/dist/cjs/managers/ChannelManager.js +0 -205
- package/dist/cjs/managers/GuildMemberManager.d.ts +0 -74
- package/dist/cjs/managers/GuildMemberManager.js +0 -157
- package/dist/cjs/managers/RoleManager.d.ts +0 -84
- package/dist/cjs/managers/RoleManager.js +0 -207
- package/dist/cjs/managers/index.d.ts +0 -7
- package/dist/cjs/managers/index.js +0 -24
- package/dist/cjs/rest/REST.d.ts +0 -527
- package/dist/cjs/rest/REST.js +0 -904
- package/dist/cjs/rest/index.d.ts +0 -1
- package/dist/cjs/rest/index.js +0 -18
- package/dist/cjs/sharding/ShardingManager.d.ts +0 -179
- package/dist/cjs/sharding/ShardingManager.js +0 -375
- package/dist/cjs/sharding/index.d.ts +0 -4
- package/dist/cjs/sharding/index.js +0 -21
- package/dist/cjs/structures/Channel.d.ts +0 -122
- package/dist/cjs/structures/Channel.js +0 -240
- package/dist/cjs/structures/Collection.d.ts +0 -53
- package/dist/cjs/structures/Collection.js +0 -115
- package/dist/cjs/structures/Guild.d.ts +0 -59
- package/dist/cjs/structures/Guild.js +0 -94
- package/dist/cjs/structures/GuildMember.d.ts +0 -174
- package/dist/cjs/structures/GuildMember.js +0 -311
- package/dist/cjs/structures/Interaction.d.ts +0 -245
- package/dist/cjs/structures/Interaction.js +0 -450
- package/dist/cjs/structures/Message.d.ts +0 -98
- package/dist/cjs/structures/Message.js +0 -195
- package/dist/cjs/structures/User.d.ts +0 -37
- package/dist/cjs/structures/User.js +0 -65
- package/dist/cjs/structures/index.d.ts +0 -7
- package/dist/cjs/structures/index.js +0 -25
- package/dist/cjs/structures.d.ts +0 -1
- package/dist/cjs/structures.js +0 -19
- package/dist/cjs/types.d.ts +0 -255
- package/dist/cjs/types.js +0 -3
- package/dist/cjs/utils/BitField.d.ts +0 -66
- package/dist/cjs/utils/BitField.js +0 -138
- package/dist/cjs/utils/Collection.d.ts +0 -116
- package/dist/cjs/utils/Collection.js +0 -265
- package/dist/cjs/utils/Collector.d.ts +0 -152
- package/dist/cjs/utils/Collector.js +0 -314
- package/dist/cjs/utils/DataResolver.d.ts +0 -61
- package/dist/cjs/utils/DataResolver.js +0 -146
- package/dist/cjs/utils/Formatters.d.ts +0 -145
- package/dist/cjs/utils/Formatters.js +0 -213
- package/dist/cjs/utils/IntentsBitField.d.ts +0 -85
- package/dist/cjs/utils/IntentsBitField.js +0 -99
- package/dist/cjs/utils/Partials.d.ts +0 -104
- package/dist/cjs/utils/Partials.js +0 -148
- package/dist/cjs/utils/PermissionsBitField.d.ts +0 -118
- package/dist/cjs/utils/PermissionsBitField.js +0 -145
- package/dist/cjs/utils/SnowflakeUtil.d.ts +0 -63
- package/dist/cjs/utils/SnowflakeUtil.js +0 -93
- package/dist/cjs/utils/Sweepers.d.ts +0 -119
- package/dist/cjs/utils/Sweepers.js +0 -249
- package/dist/cjs/utils/index.d.ts +0 -13
- package/dist/cjs/utils/index.js +0 -30
- package/dist/esm/Client.js +0 -634
- package/dist/esm/builders/ActionRowBuilder.js +0 -64
- package/dist/esm/builders/ButtonBuilder.js +0 -92
- package/dist/esm/builders/EmbedBuilder.js +0 -204
- package/dist/esm/builders/ModalBuilder.js +0 -157
- package/dist/esm/builders/SelectMenuBuilder.js +0 -161
- package/dist/esm/builders/SlashCommandBuilder.js +0 -311
- package/dist/esm/builders/index.js +0 -10
- package/dist/esm/enums.js +0 -208
- package/dist/esm/index.js +0 -34
- package/dist/esm/managers/BaseManager.js +0 -100
- package/dist/esm/managers/ChannelManager.js +0 -200
- package/dist/esm/managers/GuildMemberManager.js +0 -153
- package/dist/esm/managers/RoleManager.js +0 -203
- package/dist/esm/managers/index.js +0 -8
- package/dist/esm/rest/REST.js +0 -900
- package/dist/esm/rest/index.js +0 -2
- package/dist/esm/sharding/ShardingManager.js +0 -366
- package/dist/esm/sharding/index.js +0 -5
- package/dist/esm/structures/Channel.js +0 -232
- package/dist/esm/structures/Collection.js +0 -111
- package/dist/esm/structures/Guild.js +0 -90
- package/dist/esm/structures/GuildMember.js +0 -306
- package/dist/esm/structures/Interaction.js +0 -438
- package/dist/esm/structures/Message.js +0 -191
- package/dist/esm/structures/User.js +0 -61
- package/dist/esm/structures/index.js +0 -9
- package/dist/esm/structures.js +0 -3
- package/dist/esm/types.js +0 -2
- package/dist/esm/utils/BitField.js +0 -134
- package/dist/esm/utils/Collection.js +0 -261
- package/dist/esm/utils/Collector.js +0 -305
- package/dist/esm/utils/DataResolver.js +0 -142
- package/dist/esm/utils/Formatters.js +0 -191
- package/dist/esm/utils/IntentsBitField.js +0 -93
- package/dist/esm/utils/Partials.js +0 -137
- package/dist/esm/utils/PermissionsBitField.js +0 -141
- package/dist/esm/utils/SnowflakeUtil.js +0 -89
- package/dist/esm/utils/Sweepers.js +0 -245
- package/dist/esm/utils/index.js +0 -14
package/dist/cjs/Client.js
DELETED
|
@@ -1,640 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.GatewayIntentBits = exports.Client = void 0;
|
|
7
|
-
const events_1 = require("events");
|
|
8
|
-
const ws_1 = __importDefault(require("ws"));
|
|
9
|
-
const enums_1 = require("./enums");
|
|
10
|
-
Object.defineProperty(exports, "GatewayIntentBits", { enumerable: true, get: function () { return enums_1.GatewayIntentBits; } });
|
|
11
|
-
const Collection_1 = require("./structures/Collection");
|
|
12
|
-
const User_1 = require("./structures/User");
|
|
13
|
-
const Guild_1 = require("./structures/Guild");
|
|
14
|
-
const Message_1 = require("./structures/Message");
|
|
15
|
-
const Interaction_1 = require("./structures/Interaction");
|
|
16
|
-
const REST_1 = require("./rest/REST");
|
|
17
|
-
/**
|
|
18
|
-
* Main client class
|
|
19
|
-
*/
|
|
20
|
-
class Client extends events_1.EventEmitter {
|
|
21
|
-
/** Client options */
|
|
22
|
-
options;
|
|
23
|
-
/** REST API client */
|
|
24
|
-
rest;
|
|
25
|
-
/** The bot user */
|
|
26
|
-
user = null;
|
|
27
|
-
/** Application ID */
|
|
28
|
-
applicationId = null;
|
|
29
|
-
/** Cached guilds */
|
|
30
|
-
guilds = new Collection_1.Collection();
|
|
31
|
-
/** Cached channels */
|
|
32
|
-
channels = new Collection_1.Collection();
|
|
33
|
-
/** Cached users */
|
|
34
|
-
users = new Collection_1.Collection();
|
|
35
|
-
/** Voice adapter management */
|
|
36
|
-
voice;
|
|
37
|
-
/** WebSocket connection */
|
|
38
|
-
ws = null;
|
|
39
|
-
/** Bot token */
|
|
40
|
-
token = '';
|
|
41
|
-
/** Session ID */
|
|
42
|
-
sessionId = null;
|
|
43
|
-
/** Sequence number */
|
|
44
|
-
sequence = null;
|
|
45
|
-
/** Heartbeat interval */
|
|
46
|
-
heartbeatInterval = null;
|
|
47
|
-
/** Gateway URL */
|
|
48
|
-
gatewayUrl;
|
|
49
|
-
/** Voice state update handlers (for voice adapters) */
|
|
50
|
-
voiceStateHandlers = new Map();
|
|
51
|
-
voiceServerHandlers = new Map();
|
|
52
|
-
/** Whether the client is currently in the login flow */
|
|
53
|
-
_loginState = 'idle';
|
|
54
|
-
/** Reconnect attempt counter */
|
|
55
|
-
_reconnectAttempts = 0;
|
|
56
|
-
/** Maximum reconnect attempts before giving up */
|
|
57
|
-
_maxReconnectAttempts = 5;
|
|
58
|
-
constructor(options) {
|
|
59
|
-
super();
|
|
60
|
-
this.options = options;
|
|
61
|
-
this.gatewayUrl = options.gatewayUrl || 'wss://realtime.jubbio.com/ws/bot';
|
|
62
|
-
this.rest = new REST_1.REST(options.apiUrl);
|
|
63
|
-
// Initialize voice adapter system
|
|
64
|
-
this.voice = {
|
|
65
|
-
adapters: new Map()
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Calculate intents value
|
|
70
|
-
*/
|
|
71
|
-
getIntentsValue() {
|
|
72
|
-
if (typeof this.options.intents === 'number') {
|
|
73
|
-
return this.options.intents;
|
|
74
|
-
}
|
|
75
|
-
return this.options.intents.reduce((acc, intent) => acc | intent, 0);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Gateway close code descriptions
|
|
79
|
-
*/
|
|
80
|
-
static CLOSE_CODES = {
|
|
81
|
-
4000: { message: 'Bilinmeyen hata (Unknown error)', reconnectable: true },
|
|
82
|
-
4001: { message: 'Bilinmeyen opcode gönderildi (Unknown opcode)', reconnectable: true },
|
|
83
|
-
4002: { message: 'Geçersiz payload gönderildi (Decode error)', reconnectable: true },
|
|
84
|
-
4003: { message: 'Henüz kimlik doğrulaması yapılmadı (Not authenticated)', reconnectable: true },
|
|
85
|
-
4004: { message: 'Geçersiz bot token\'ı (Authentication failed)', reconnectable: false },
|
|
86
|
-
4005: { message: 'Zaten kimlik doğrulaması yapılmış (Already authenticated)', reconnectable: true },
|
|
87
|
-
4007: { message: 'Geçersiz sequence numarası (Invalid seq)', reconnectable: true },
|
|
88
|
-
4008: { message: 'Rate limit aşıldı (Rate limited)', reconnectable: true },
|
|
89
|
-
4009: { message: 'Oturum zaman aşımına uğradı (Session timed out)', reconnectable: true },
|
|
90
|
-
4010: { message: 'Geçersiz shard yapılandırması (Invalid shard)', reconnectable: false },
|
|
91
|
-
4011: { message: 'Sharding gerekli (Sharding required)', reconnectable: false },
|
|
92
|
-
4014: { message: 'İzin verilmeyen intent\'ler istendi (Disallowed intents)', reconnectable: false },
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Login to the gateway
|
|
96
|
-
*/
|
|
97
|
-
async login(token) {
|
|
98
|
-
if (!token || typeof token !== 'string') {
|
|
99
|
-
throw new Error('Geçerli bir bot token\'ı sağlanmalıdır. Örnek: client.login(process.env.BOT_TOKEN)');
|
|
100
|
-
}
|
|
101
|
-
this.token = token.replace(/^Bot\s+/i, '');
|
|
102
|
-
this.rest.setToken(this.token);
|
|
103
|
-
this._loginState = 'connecting';
|
|
104
|
-
this._reconnectAttempts = 0;
|
|
105
|
-
return new Promise((resolve, reject) => {
|
|
106
|
-
const cleanup = () => {
|
|
107
|
-
clearTimeout(timeout);
|
|
108
|
-
this.removeListener('ready', onReady);
|
|
109
|
-
this.removeListener('error', onError);
|
|
110
|
-
this.removeListener('gatewayClose', onGatewayClose);
|
|
111
|
-
};
|
|
112
|
-
const timeout = setTimeout(() => {
|
|
113
|
-
cleanup();
|
|
114
|
-
this._loginState = 'idle';
|
|
115
|
-
reject(new Error('Gateway\'e bağlanılamadı: 30 saniye içinde READY event\'i alınamadı. ' +
|
|
116
|
-
'Olası sebepler: gateway sunucusu erişilemez, token geçersiz veya ağ sorunu.'));
|
|
117
|
-
}, 30000);
|
|
118
|
-
const onReady = () => {
|
|
119
|
-
cleanup();
|
|
120
|
-
this._loginState = 'ready';
|
|
121
|
-
this._reconnectAttempts = 0;
|
|
122
|
-
resolve(this.token);
|
|
123
|
-
};
|
|
124
|
-
const onError = (error) => {
|
|
125
|
-
cleanup();
|
|
126
|
-
this._loginState = 'idle';
|
|
127
|
-
reject(error);
|
|
128
|
-
};
|
|
129
|
-
const onGatewayClose = (code, reason) => {
|
|
130
|
-
const info = Client.CLOSE_CODES[code];
|
|
131
|
-
if (info && !info.reconnectable) {
|
|
132
|
-
cleanup();
|
|
133
|
-
this._loginState = 'idle';
|
|
134
|
-
reject(new Error(`Gateway bağlantısı reddedildi [${code}]: ${info.message}${reason ? ' - ' + reason : ''}`));
|
|
135
|
-
}
|
|
136
|
-
// Reconnectable codes: login promise stays alive, connect() will retry
|
|
137
|
-
};
|
|
138
|
-
this.once('ready', onReady);
|
|
139
|
-
this.once('error', onError);
|
|
140
|
-
this.on('gatewayClose', onGatewayClose);
|
|
141
|
-
this.connect();
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Connect to the gateway
|
|
146
|
-
*/
|
|
147
|
-
connect() {
|
|
148
|
-
this.ws = new ws_1.default(this.gatewayUrl);
|
|
149
|
-
this.ws.on('open', () => {
|
|
150
|
-
this.emit('debug', 'WebSocket bağlantısı açıldı');
|
|
151
|
-
this._reconnectAttempts = 0;
|
|
152
|
-
});
|
|
153
|
-
this.ws.on('message', (data) => {
|
|
154
|
-
this.handleMessage(data.toString());
|
|
155
|
-
});
|
|
156
|
-
this.ws.on('close', (code, reason) => {
|
|
157
|
-
const reasonStr = reason?.toString() || '';
|
|
158
|
-
const info = Client.CLOSE_CODES[code];
|
|
159
|
-
if (info) {
|
|
160
|
-
this.emit('debug', `Gateway bağlantısı kapandı [${code}]: ${info.message}${reasonStr ? ' - ' + reasonStr : ''}`);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
this.emit('debug', `WebSocket kapandı: ${code} - ${reasonStr}`);
|
|
164
|
-
}
|
|
165
|
-
this.cleanup();
|
|
166
|
-
// Emit gatewayClose so login() can handle non-reconnectable codes
|
|
167
|
-
this.emit('gatewayClose', code, reasonStr);
|
|
168
|
-
// Non-reconnectable codes: don't retry
|
|
169
|
-
if (info && !info.reconnectable) {
|
|
170
|
-
this.emit('debug', `Kod ${code} yeniden bağlanılamaz, bağlantı sonlandırılıyor.`);
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
// Normal close: don't retry
|
|
174
|
-
if (code === 1000) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
// Reconnectable: retry with backoff
|
|
178
|
-
this._reconnectAttempts++;
|
|
179
|
-
if (this._reconnectAttempts > this._maxReconnectAttempts) {
|
|
180
|
-
this.emit('debug', `Maksimum yeniden bağlanma denemesi aşıldı (${this._maxReconnectAttempts})`);
|
|
181
|
-
this.emit('error', new Error(`Gateway bağlantısı ${this._maxReconnectAttempts} denemeden sonra kurulamadı. Son kapanma kodu: ${code}`));
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
const delay = Math.min(1000 * Math.pow(2, this._reconnectAttempts - 1), 30000);
|
|
185
|
-
this.emit('debug', `Yeniden bağlanılıyor (deneme ${this._reconnectAttempts}/${this._maxReconnectAttempts}), ${delay}ms sonra...`);
|
|
186
|
-
setTimeout(() => this.connect(), delay);
|
|
187
|
-
});
|
|
188
|
-
this.ws.on('error', (error) => {
|
|
189
|
-
this.emit('debug', `WebSocket hatası: ${error.message}`);
|
|
190
|
-
this.emit('error', error);
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Handle incoming gateway message
|
|
195
|
-
*/
|
|
196
|
-
handleMessage(data) {
|
|
197
|
-
// Handle multiple messages in one frame
|
|
198
|
-
const messages = data.split('\n').filter(m => m.trim());
|
|
199
|
-
for (const msg of messages) {
|
|
200
|
-
try {
|
|
201
|
-
const payload = JSON.parse(msg);
|
|
202
|
-
this.handlePayload(payload);
|
|
203
|
-
}
|
|
204
|
-
catch (e) {
|
|
205
|
-
this.emit('debug', `Failed to parse message: ${msg}`);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Handle gateway payload
|
|
211
|
-
*/
|
|
212
|
-
handlePayload(payload) {
|
|
213
|
-
if (payload.s) {
|
|
214
|
-
this.sequence = payload.s;
|
|
215
|
-
}
|
|
216
|
-
switch (payload.op) {
|
|
217
|
-
case enums_1.GatewayOpcodes.Hello:
|
|
218
|
-
this.handleHello(payload.d);
|
|
219
|
-
break;
|
|
220
|
-
case enums_1.GatewayOpcodes.Dispatch:
|
|
221
|
-
this.handleDispatch(payload.t, payload.d);
|
|
222
|
-
break;
|
|
223
|
-
case enums_1.GatewayOpcodes.HeartbeatAck:
|
|
224
|
-
this.emit('debug', 'Heartbeat acknowledged');
|
|
225
|
-
break;
|
|
226
|
-
case enums_1.GatewayOpcodes.InvalidSession:
|
|
227
|
-
this.emit('debug', 'Geçersiz oturum, yeniden kimlik doğrulanıyor...');
|
|
228
|
-
// InvalidSession may carry error data from sendError()
|
|
229
|
-
if (payload.d && typeof payload.d === 'object' && payload.d.code && payload.d.message) {
|
|
230
|
-
this.emit('debug', `Sunucu hatası [${payload.d.code}]: ${payload.d.message}`);
|
|
231
|
-
const info = Client.CLOSE_CODES[payload.d.code];
|
|
232
|
-
if (info && !info.reconnectable) {
|
|
233
|
-
this.emit('error', new Error(`Gateway hatası [${payload.d.code}]: ${info.message}`));
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
setTimeout(() => this.identify(), 5000);
|
|
238
|
-
break;
|
|
239
|
-
case enums_1.GatewayOpcodes.Reconnect:
|
|
240
|
-
this.emit('debug', 'Reconnect requested');
|
|
241
|
-
this.ws?.close();
|
|
242
|
-
setTimeout(() => this.connect(), 1000);
|
|
243
|
-
break;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Handle Hello payload
|
|
248
|
-
*/
|
|
249
|
-
handleHello(data) {
|
|
250
|
-
this.emit('debug', `Received Hello, heartbeat interval: ${data.heartbeat_interval}ms`);
|
|
251
|
-
this.startHeartbeat(data.heartbeat_interval);
|
|
252
|
-
this.identify();
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Handle Dispatch events
|
|
256
|
-
*/
|
|
257
|
-
handleDispatch(eventType, data) {
|
|
258
|
-
this.emit('debug', `Dispatch: ${eventType}`);
|
|
259
|
-
switch (eventType) {
|
|
260
|
-
case 'READY':
|
|
261
|
-
this.handleReady(data);
|
|
262
|
-
break;
|
|
263
|
-
case 'GUILD_CREATE':
|
|
264
|
-
this.handleGuildCreate(data);
|
|
265
|
-
break;
|
|
266
|
-
case 'GUILD_UPDATE':
|
|
267
|
-
this.handleGuildUpdate(data);
|
|
268
|
-
break;
|
|
269
|
-
case 'GUILD_DELETE':
|
|
270
|
-
this.handleGuildDelete(data);
|
|
271
|
-
break;
|
|
272
|
-
case 'MESSAGE_CREATE':
|
|
273
|
-
this.handleMessageCreate(data);
|
|
274
|
-
break;
|
|
275
|
-
case 'MESSAGE_UPDATE':
|
|
276
|
-
this.emit('messageUpdate', data);
|
|
277
|
-
break;
|
|
278
|
-
case 'MESSAGE_DELETE':
|
|
279
|
-
this.emit('messageDelete', data);
|
|
280
|
-
break;
|
|
281
|
-
case 'MESSAGE_DELETE_BULK':
|
|
282
|
-
this.emit('messageDeleteBulk', data);
|
|
283
|
-
break;
|
|
284
|
-
case 'CHANNEL_CREATE': {
|
|
285
|
-
// Update guild channel cache
|
|
286
|
-
const guildId = data.guild_id;
|
|
287
|
-
const channelId = data.id || data.channel_id;
|
|
288
|
-
if (guildId && channelId) {
|
|
289
|
-
const guild = this.guilds.get(guildId);
|
|
290
|
-
if (guild) {
|
|
291
|
-
guild.channels.set(channelId, data);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
this.emit('channelCreate', data);
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
case 'CHANNEL_UPDATE': {
|
|
298
|
-
const guildId = data.guild_id;
|
|
299
|
-
const channelId = data.id || data.channel_id;
|
|
300
|
-
if (guildId && channelId) {
|
|
301
|
-
const guild = this.guilds.get(guildId);
|
|
302
|
-
if (guild) {
|
|
303
|
-
guild.channels.set(channelId, data);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
this.emit('channelUpdate', data);
|
|
307
|
-
break;
|
|
308
|
-
}
|
|
309
|
-
case 'CHANNEL_DELETE': {
|
|
310
|
-
const guildId = data.guild_id;
|
|
311
|
-
const channelId = data.id || data.channel_id;
|
|
312
|
-
if (guildId && channelId) {
|
|
313
|
-
const guild = this.guilds.get(guildId);
|
|
314
|
-
if (guild) {
|
|
315
|
-
guild.channels.delete(channelId);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
this.emit('channelDelete', data);
|
|
319
|
-
break;
|
|
320
|
-
}
|
|
321
|
-
case 'GUILD_MEMBER_ADD': {
|
|
322
|
-
const guild = this.guilds.get(String(data.guild_id));
|
|
323
|
-
if (guild && data.user) {
|
|
324
|
-
const member = guild._addMember(data);
|
|
325
|
-
this.emit('guildMemberAdd', member);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
this.emit('guildMemberAdd', data);
|
|
329
|
-
}
|
|
330
|
-
break;
|
|
331
|
-
}
|
|
332
|
-
case 'GUILD_MEMBER_UPDATE': {
|
|
333
|
-
const guild = this.guilds.get(String(data.guild_id));
|
|
334
|
-
const rawUserId = data.user?.id || data.user_id;
|
|
335
|
-
if (guild && rawUserId) {
|
|
336
|
-
const existing = guild.members.get(String(rawUserId));
|
|
337
|
-
if (existing) {
|
|
338
|
-
existing._patch(data);
|
|
339
|
-
this.emit('guildMemberUpdate', existing);
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
this.emit('guildMemberUpdate', data);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
this.emit('guildMemberUpdate', data);
|
|
347
|
-
}
|
|
348
|
-
break;
|
|
349
|
-
}
|
|
350
|
-
case 'GUILD_MEMBER_REMOVE': {
|
|
351
|
-
const guild = this.guilds.get(String(data.guild_id));
|
|
352
|
-
const rawUserId = data.user?.id || data.user_id;
|
|
353
|
-
if (guild && rawUserId) {
|
|
354
|
-
const userId = String(rawUserId);
|
|
355
|
-
const member = guild.members.get(userId);
|
|
356
|
-
guild.members.delete(userId);
|
|
357
|
-
this.emit('guildMemberRemove', member || data);
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
this.emit('guildMemberRemove', data);
|
|
361
|
-
}
|
|
362
|
-
break;
|
|
363
|
-
}
|
|
364
|
-
case 'GUILD_ROLE_CREATE':
|
|
365
|
-
this.emit('roleCreate', data);
|
|
366
|
-
break;
|
|
367
|
-
case 'GUILD_ROLE_UPDATE':
|
|
368
|
-
this.emit('roleUpdate', data);
|
|
369
|
-
break;
|
|
370
|
-
case 'GUILD_ROLE_DELETE':
|
|
371
|
-
this.emit('roleDelete', data);
|
|
372
|
-
break;
|
|
373
|
-
case 'GUILD_BAN_ADD':
|
|
374
|
-
this.emit('guildBanAdd', data);
|
|
375
|
-
break;
|
|
376
|
-
case 'GUILD_BAN_REMOVE':
|
|
377
|
-
this.emit('guildBanRemove', data);
|
|
378
|
-
break;
|
|
379
|
-
case 'INVITE_CREATE':
|
|
380
|
-
this.emit('inviteCreate', data);
|
|
381
|
-
break;
|
|
382
|
-
case 'INVITE_DELETE':
|
|
383
|
-
this.emit('inviteDelete', data);
|
|
384
|
-
break;
|
|
385
|
-
case 'TYPING_START':
|
|
386
|
-
this.emit('typingStart', data);
|
|
387
|
-
break;
|
|
388
|
-
case 'PRESENCE_UPDATE':
|
|
389
|
-
this.emit('presenceUpdate', data);
|
|
390
|
-
break;
|
|
391
|
-
case 'INTERACTION_CREATE':
|
|
392
|
-
this.handleInteractionCreate(data);
|
|
393
|
-
break;
|
|
394
|
-
case 'VOICE_STATE_UPDATE':
|
|
395
|
-
this.handleVoiceStateUpdate(data);
|
|
396
|
-
break;
|
|
397
|
-
case 'VOICE_SERVER_UPDATE':
|
|
398
|
-
this.handleVoiceServerUpdate(data);
|
|
399
|
-
break;
|
|
400
|
-
default:
|
|
401
|
-
// Emit raw event for unhandled types
|
|
402
|
-
this.emit('raw', { t: eventType, d: data });
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
/**
|
|
406
|
-
* Handle Ready event
|
|
407
|
-
*/
|
|
408
|
-
handleReady(data) {
|
|
409
|
-
this.sessionId = data.session_id;
|
|
410
|
-
this.user = new User_1.User(data.user);
|
|
411
|
-
// Handle both string and number application IDs
|
|
412
|
-
this.applicationId = data.application?.id ? String(data.application.id) : null;
|
|
413
|
-
if (this.applicationId) {
|
|
414
|
-
this.rest.setApplicationId(this.applicationId);
|
|
415
|
-
}
|
|
416
|
-
// Cache guilds (as unavailable initially)
|
|
417
|
-
if (data.guilds) {
|
|
418
|
-
for (const guild of data.guilds) {
|
|
419
|
-
this.guilds.set(String(guild.id), new Guild_1.Guild(this, guild));
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
// Setup voice adapters for each guild
|
|
423
|
-
this.setupVoiceAdapters();
|
|
424
|
-
console.log(`✅ Bot hazır! User: ${this.user.username} (${this.user.id}), App: ${this.applicationId}`);
|
|
425
|
-
this.emit('ready', this);
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Setup voice adapters for all guilds
|
|
429
|
-
*/
|
|
430
|
-
setupVoiceAdapters() {
|
|
431
|
-
for (const [guildId] of this.guilds) {
|
|
432
|
-
this.createVoiceAdapter(guildId);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Create a voice adapter for a guild
|
|
437
|
-
*/
|
|
438
|
-
createVoiceAdapter(guildId) {
|
|
439
|
-
const adapter = (methods) => {
|
|
440
|
-
// Store handlers for this guild
|
|
441
|
-
this.voiceStateHandlers.set(guildId, methods.onVoiceStateUpdate);
|
|
442
|
-
this.voiceServerHandlers.set(guildId, methods.onVoiceServerUpdate);
|
|
443
|
-
return {
|
|
444
|
-
sendPayload: (payload) => {
|
|
445
|
-
if (this.ws?.readyState === ws_1.default.OPEN) {
|
|
446
|
-
this.ws.send(JSON.stringify(payload));
|
|
447
|
-
return true;
|
|
448
|
-
}
|
|
449
|
-
return false;
|
|
450
|
-
},
|
|
451
|
-
destroy: () => {
|
|
452
|
-
this.voiceStateHandlers.delete(guildId);
|
|
453
|
-
this.voiceServerHandlers.delete(guildId);
|
|
454
|
-
}
|
|
455
|
-
};
|
|
456
|
-
};
|
|
457
|
-
this.voice.adapters.set(guildId, adapter);
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Handle Guild Create event
|
|
461
|
-
*/
|
|
462
|
-
handleGuildCreate(data) {
|
|
463
|
-
let guild = this.guilds.get(data.id);
|
|
464
|
-
if (guild) {
|
|
465
|
-
guild._patch(data);
|
|
466
|
-
}
|
|
467
|
-
else {
|
|
468
|
-
guild = new Guild_1.Guild(this, data);
|
|
469
|
-
this.guilds.set(data.id, guild);
|
|
470
|
-
this.createVoiceAdapter(data.id);
|
|
471
|
-
}
|
|
472
|
-
this.emit('guildCreate', guild);
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Handle Guild Update event
|
|
476
|
-
*/
|
|
477
|
-
handleGuildUpdate(data) {
|
|
478
|
-
const guild = this.guilds.get(data.id);
|
|
479
|
-
if (guild) {
|
|
480
|
-
guild._patch(data);
|
|
481
|
-
this.emit('guildUpdate', guild);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* Handle Guild Delete event
|
|
486
|
-
*/
|
|
487
|
-
handleGuildDelete(data) {
|
|
488
|
-
const guild = this.guilds.get(data.id);
|
|
489
|
-
if (guild) {
|
|
490
|
-
this.guilds.delete(data.id);
|
|
491
|
-
this.voice.adapters.delete(data.id);
|
|
492
|
-
this.emit('guildDelete', guild);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
/**
|
|
496
|
-
* Handle Message Create event
|
|
497
|
-
*/
|
|
498
|
-
handleMessageCreate(data) {
|
|
499
|
-
// Backend sends user_id separately, map it to author.id for compatibility
|
|
500
|
-
if (data.user_id && data.author && !data.author.id) {
|
|
501
|
-
data.author.id = data.user_id;
|
|
502
|
-
}
|
|
503
|
-
// Cache the author
|
|
504
|
-
if (data.author) {
|
|
505
|
-
const user = new User_1.User(data.author);
|
|
506
|
-
this.users.set(user.id, user);
|
|
507
|
-
// Also cache in REST for mention resolution
|
|
508
|
-
this.rest.cacheUser(data.author);
|
|
509
|
-
}
|
|
510
|
-
const message = new Message_1.Message(this, data);
|
|
511
|
-
// Mark message as from bot if author ID matches the bot's own user ID
|
|
512
|
-
if (this.user && String(message.author.id) === String(this.user.id)) {
|
|
513
|
-
message.author.bot = true;
|
|
514
|
-
}
|
|
515
|
-
// Resolve guild member if in a guild
|
|
516
|
-
if (message.guildId) {
|
|
517
|
-
const guild = this.guilds.get(message.guildId);
|
|
518
|
-
const memberData = data.member;
|
|
519
|
-
if (memberData && guild) {
|
|
520
|
-
// Gateway sent member data with the message — cache it
|
|
521
|
-
memberData.user = data.author;
|
|
522
|
-
const member = guild._addMember(memberData);
|
|
523
|
-
message.member = member;
|
|
524
|
-
}
|
|
525
|
-
else if (memberData) {
|
|
526
|
-
// No guild in cache but member data exists
|
|
527
|
-
memberData.user = data.author;
|
|
528
|
-
const resolvedGuild = { id: message.guildId, ownerId: null };
|
|
529
|
-
message.member = new (require('./structures/GuildMember').GuildMember)(this, resolvedGuild, memberData);
|
|
530
|
-
}
|
|
531
|
-
else if (guild) {
|
|
532
|
-
// Try cache
|
|
533
|
-
const cached = guild.members?.get(String(message.author.id));
|
|
534
|
-
if (cached?.permissions?.has) {
|
|
535
|
-
message.member = cached;
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
this.emit('messageCreate', message);
|
|
540
|
-
}
|
|
541
|
-
/**
|
|
542
|
-
* Handle Interaction Create event
|
|
543
|
-
*/
|
|
544
|
-
handleInteractionCreate(data) {
|
|
545
|
-
console.log('[DEBUG] handleInteractionCreate called with:', JSON.stringify(data, null, 2));
|
|
546
|
-
// Cache the user
|
|
547
|
-
const userData = data.member?.user || data.user;
|
|
548
|
-
if (userData) {
|
|
549
|
-
const user = new User_1.User(userData);
|
|
550
|
-
this.users.set(user.id, user);
|
|
551
|
-
this.rest.cacheUser(userData);
|
|
552
|
-
}
|
|
553
|
-
const interaction = (0, Interaction_1.createInteraction)(this, data);
|
|
554
|
-
console.log('[DEBUG] Created interaction type:', interaction.constructor.name, 'customId:', interaction.customId);
|
|
555
|
-
this.emit('interactionCreate', interaction);
|
|
556
|
-
}
|
|
557
|
-
/**
|
|
558
|
-
* Handle Voice State Update event
|
|
559
|
-
*/
|
|
560
|
-
handleVoiceStateUpdate(data) {
|
|
561
|
-
const guildId = data.guild_id;
|
|
562
|
-
// Forward to voice adapter if exists
|
|
563
|
-
const handler = this.voiceStateHandlers.get(guildId);
|
|
564
|
-
if (handler) {
|
|
565
|
-
handler(data);
|
|
566
|
-
}
|
|
567
|
-
this.emit('voiceStateUpdate', data);
|
|
568
|
-
}
|
|
569
|
-
/**
|
|
570
|
-
* Handle Voice Server Update event
|
|
571
|
-
*/
|
|
572
|
-
handleVoiceServerUpdate(data) {
|
|
573
|
-
const guildId = data.guild_id;
|
|
574
|
-
// Forward to voice adapter if exists
|
|
575
|
-
const handler = this.voiceServerHandlers.get(guildId);
|
|
576
|
-
if (handler) {
|
|
577
|
-
handler({
|
|
578
|
-
token: data.token,
|
|
579
|
-
endpoint: data.endpoint,
|
|
580
|
-
room: data.room
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
this.emit('voiceServerUpdate', data);
|
|
584
|
-
}
|
|
585
|
-
/**
|
|
586
|
-
* Send Identify payload
|
|
587
|
-
*/
|
|
588
|
-
identify() {
|
|
589
|
-
const payload = {
|
|
590
|
-
op: enums_1.GatewayOpcodes.Identify,
|
|
591
|
-
d: {
|
|
592
|
-
token: `Bot ${this.token}`,
|
|
593
|
-
intents: this.getIntentsValue(),
|
|
594
|
-
shard: this.options.shards || [0, 1]
|
|
595
|
-
}
|
|
596
|
-
};
|
|
597
|
-
this.send(payload);
|
|
598
|
-
}
|
|
599
|
-
/**
|
|
600
|
-
* Start heartbeat
|
|
601
|
-
*/
|
|
602
|
-
startHeartbeat(interval) {
|
|
603
|
-
this.heartbeatInterval = setInterval(() => {
|
|
604
|
-
this.send({
|
|
605
|
-
op: enums_1.GatewayOpcodes.Heartbeat,
|
|
606
|
-
d: this.sequence
|
|
607
|
-
});
|
|
608
|
-
}, interval);
|
|
609
|
-
}
|
|
610
|
-
/**
|
|
611
|
-
* Send payload to gateway
|
|
612
|
-
*/
|
|
613
|
-
send(payload) {
|
|
614
|
-
if (this.ws?.readyState === ws_1.default.OPEN) {
|
|
615
|
-
this.ws.send(JSON.stringify(payload));
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
/**
|
|
619
|
-
* Cleanup on disconnect
|
|
620
|
-
*/
|
|
621
|
-
cleanup() {
|
|
622
|
-
if (this.heartbeatInterval) {
|
|
623
|
-
clearInterval(this.heartbeatInterval);
|
|
624
|
-
this.heartbeatInterval = null;
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
/**
|
|
628
|
-
* Destroy the client
|
|
629
|
-
*/
|
|
630
|
-
destroy() {
|
|
631
|
-
this._loginState = 'idle';
|
|
632
|
-
this._reconnectAttempts = this._maxReconnectAttempts + 1; // Prevent reconnect
|
|
633
|
-
this.cleanup();
|
|
634
|
-
this.ws?.close(1000);
|
|
635
|
-
this.ws = null;
|
|
636
|
-
this.removeAllListeners();
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
exports.Client = Client;
|
|
640
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FBc0M7QUFDdEMsNENBQTJCO0FBWTNCLG1DQUE0RDtBQXF2Qm5ELGtHQXJ2QmdCLHlCQUFpQixPQXF2QmhCO0FBcHZCMUIsd0RBQXFEO0FBQ3JELDRDQUF5QztBQUN6Qyw4Q0FBMkM7QUFDM0Msa0RBQStDO0FBQy9DLDBEQUEwRTtBQUUxRSxzQ0FBbUM7QUFjbkM7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxxQkFBWTtJQUN0QyxxQkFBcUI7SUFDTCxPQUFPLENBQWdCO0lBRXZDLHNCQUFzQjtJQUNOLElBQUksQ0FBTztJQUUzQixtQkFBbUI7SUFDWixJQUFJLEdBQWdCLElBQUksQ0FBQztJQUVoQyxxQkFBcUI7SUFDZCxhQUFhLEdBQWtCLElBQUksQ0FBQztJQUUzQyxvQkFBb0I7SUFDYixNQUFNLEdBQThCLElBQUksdUJBQVUsRUFBRSxDQUFDO0lBRTVELHNCQUFzQjtJQUNmLFFBQVEsR0FBb0MsSUFBSSx1QkFBVSxFQUFFLENBQUM7SUFFcEUsbUJBQW1CO0lBQ1osS0FBSyxHQUE2QixJQUFJLHVCQUFVLEVBQUUsQ0FBQztJQUUxRCwrQkFBK0I7SUFDeEIsS0FBSyxDQUVWO0lBRUYsMkJBQTJCO0lBQ25CLEVBQUUsR0FBcUIsSUFBSSxDQUFDO0lBRXBDLGdCQUFnQjtJQUNSLEtBQUssR0FBVyxFQUFFLENBQUM7SUFFM0IsaUJBQWlCO0lBQ1QsU0FBUyxHQUFrQixJQUFJLENBQUM7SUFFeEMsc0JBQXNCO0lBQ2QsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFFdkMseUJBQXlCO0lBQ2pCLGlCQUFpQixHQUEwQixJQUFJLENBQUM7SUFFeEQsa0JBQWtCO0lBQ1YsVUFBVSxDQUFTO0lBRTNCLHVEQUF1RDtJQUMvQyxrQkFBa0IsR0FBcUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNqRSxtQkFB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QyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQzs7QUF6dEJILHdCQTB0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcclxuaW1wb3J0IHsgXHJcbiAgQ2xpZW50T3B0aW9ucywgXHJcbiAgR2F0ZXdheVBheWxvYWQsIFxyXG4gIFJlYWR5RXZlbnREYXRhLFxyXG4gIEFQSUd1aWxkLFxyXG4gIEFQSUludGVyYWN0aW9uLFxyXG4gIEFQSU1lc3NhZ2UsXHJcbiAgQVBJVm9pY2VTZXJ2ZXJVcGRhdGUsXHJcbiAgQVBJQ2hhbm5lbCxcclxuICBBUElVc2VyXHJcbn0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7IEdhdGV3YXlPcGNvZGVzLCBHYXRld2F5SW50ZW50Qml0cyB9IGZyb20gJy4vZW51bXMnO1xyXG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL0NvbGxlY3Rpb24nO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL1VzZXInO1xyXG5pbXBvcnQgeyBHdWlsZCB9IGZyb20gJy4vc3RydWN0dXJlcy9HdWlsZCc7XHJcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL3N0cnVjdHVyZXMvTWVzc2FnZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUludGVyYWN0aW9uLCBJbnRlcmFjdGlvbiB9IGZyb20gJy4vc3RydWN0dXJlcy9JbnRlcmFjdGlvbic7XHJcbmltcG9ydCB7IEJhc2VDaGFubmVsLCBjcmVhdGVDaGFubmVsIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL0NoYW5uZWwnO1xyXG5pbXBvcnQgeyBSRVNUIH0gZnJvbSAnLi9yZXN0L1JFU1QnO1xyXG5cclxuLyoqXHJcbiAqIFZvaWNlIGFkYXB0ZXIgY3JlYXRvciB0eXBlIGZvciBAanViYmlvL3ZvaWNlIGNvbXBhdGliaWxpdHlcclxuICovXHJcbnR5cGUgVm9pY2VBZGFwdGVyQ3JlYXRvciA9IChtZXRob2RzOiB7XHJcbiAgb25Wb2ljZVNlcnZlclVwZGF0ZShkYXRhOiBhbnkpOiB2b2lkO1xyXG4gIG9uVm9pY2VTdGF0ZVVwZGF0ZShkYXRhOiBhbnkpOiB2b2lkO1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufSkgPT4ge1xyXG4gIHNlbmRQYXlsb2FkKHBheWxvYWQ6IGFueSk6IGJvb2xlYW47XHJcbiAgZGVzdHJveSgpOiB2b2lkO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE1haW4gY2xpZW50IGNsYXNzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ2xpZW50IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAvKiogQ2xpZW50IG9wdGlvbnMgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogQ2xpZW50T3B0aW9ucztcclxuICBcclxuICAvKiogUkVTVCBBUEkgY2xpZW50ICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHJlc3Q6IFJFU1Q7XHJcbiAgXHJcbiAgLyoqIFRoZSBib3QgdXNlciAqL1xyXG4gIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgXHJcbiAgLyoqIEFwcGxpY2F0aW9uIElEICovXHJcbiAgcHVibGljIGFwcGxpY2F0aW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIC8qKiBDYWNoZWQgZ3VpbGRzICovXHJcbiAgcHVibGljIGd1aWxkczogQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkPiA9IG5ldyBDb2xsZWN0aW9uKCk7XHJcbiAgXHJcbiAgLyoqIENhY2hlZCBjaGFubmVscyAqL1xyXG4gIHB1YmxpYyBjaGFubmVsczogQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VDaGFubmVsPiA9IG5ldyBDb2xsZWN0aW9uKCk7XHJcbiAgXHJcbiAgLyoqIENhY2hlZCB1c2VycyAqL1xyXG4gIHB1YmxpYyB1c2VyczogQ29sbGVjdGlvbjxzdHJpbmcsIFVzZXI+ID0gbmV3IENvbGxlY3Rpb24oKTtcclxuICBcclxuICAvKiogVm9pY2UgYWRhcHRlciBtYW5hZ2VtZW50ICovXHJcbiAgcHVibGljIHZvaWNlOiB7XHJcbiAgICBhZGFwdGVyczogTWFwPHN0cmluZywgVm9pY2VBZGFwdGVyQ3JlYXRvcj47XHJcbiAgfTtcclxuICBcclxuICAvKiogV2ViU29ja2V0IGNvbm5lY3Rpb24gKi9cclxuICBwcml2YXRlIHdzOiBXZWJTb2NrZXQgfCBudWxsID0gbnVsbDtcclxuICBcclxuICAvKiogQm90IHRva2VuICovXHJcbiAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nID0gJyc7XHJcbiAgXHJcbiAgLyoqIFNlc3Npb24gSUQgKi9cclxuICBwcml2YXRlIHNlc3Npb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgXHJcbiAgLyoqIFNlcXVlbmNlIG51bWJlciAqL1xyXG4gIHByaXZhdGUgc2VxdWVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIC8qKiBIZWFydGJlYXQgaW50ZXJ2YWwgKi9cclxuICBwcml2YXRlIGhlYXJ0YmVhdEludGVydmFsOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIC8qKiBHYXRld2F5IFVSTCAqL1xyXG4gIHByaXZhdGUgZ2F0ZXdheVVybDogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBWb2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlcnMgKGZvciB2b2ljZSBhZGFwdGVycykgKi9cclxuICBwcml2YXRlIHZvaWNlU3RhdGVIYW5kbGVyczogTWFwPHN0cmluZywgKGRhdGE6IGFueSkgPT4gdm9pZD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSB2b2ljZVNlcnZlckhhbmRsZXJzOiBNYXA8c3RyaW5nLCAoZGF0YTogYW55KSA9PiB2b2lkPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNsaWVudCBpcyBjdXJyZW50bHkgaW4gdGhlIGxvZ2luIGZsb3cgKi9cclxuICBwcml2YXRlIF9sb2dpblN0YXRlOiAnaWRsZScgfCAnY29ubmVjdGluZycgfCAncmVhZHknID0gJ2lkbGUnO1xyXG5cclxuICAvKiogUmVjb25uZWN0IGF0dGVtcHQgY291bnRlciAqL1xyXG4gIHByaXZhdGUgX3JlY29ubmVjdEF0dGVtcHRzOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogTWF4aW11bSByZWNvbm5lY3QgYXR0ZW1wdHMgYmVmb3JlIGdpdmluZyB1cCAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heFJlY29ubmVjdEF0dGVtcHRzOiBudW1iZXIgPSA1O1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDbGllbnRPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuZ2F0ZXdheVVybCA9IG9wdGlvbnMuZ2F0ZXdheVVybCB8fCAnd3NzOi8vcmVhbHRpbWUuanViYmlvLmNvbS93cy9ib3QnO1xyXG4gICAgdGhpcy5yZXN0ID0gbmV3IFJFU1Qob3B0aW9ucy5hcGlVcmwpO1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIHZvaWNlIGFkYXB0ZXIgc3lzdGVtXHJcbiAgICB0aGlzLnZvaWNlID0ge1xyXG4gICAgICBhZGFwdGVyczogbmV3IE1hcCgpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlIGludGVudHMgdmFsdWVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEludGVudHNWYWx1ZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaW50ZW50cyA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbnRlbnRzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbnRlbnRzLnJlZHVjZSgoYWNjLCBpbnRlbnQpID0+IGFjYyB8IGludGVudCwgMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHYXRld2F5IGNsb3NlIGNvZGUgZGVzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xPU0VfQ09ERVM6IFJlY29yZDxudW1iZXIsIHsgbWVzc2FnZTogc3RyaW5nOyByZWNvbm5lY3RhYmxlOiBib29sZWFuIH0+ID0ge1xyXG4gICAgNDAwMDogeyBtZXNzYWdlOiAnQmlsaW5tZXllbiBoYXRhIChVbmtub3duIGVycm9yKScsIHJlY29ubmVjdGFibGU6IHRydWUgfSxcclxuICAgIDQwMDE6IHsgbWVzc2FnZTogJ0JpbGlubWV5ZW4gb3Bjb2RlIGfDtm5kZXJpbGRpIChVbmtub3duIG9wY29kZSknLCByZWNvbm5lY3RhYmxlOiB0cnVlIH0sXHJcbiAgICA0MDAyOiB7IG1lc3NhZ2U6ICdHZcOnZXJzaXogcGF5bG9hZCBnw7ZuZGVyaWxkaSAoRGVjb2RlIGVycm9yKScsIHJlY29ubmVjdGFibGU6IHRydWUgfSxcclxuICAgIDQwMDM6IHsgbWVzc2FnZTogJ0hlbsO8eiBraW1saWsgZG/En3J1bGFtYXPEsSB5YXDEsWxtYWTEsSAoTm90IGF1dGhlbnRpY2F0ZWQpJywgcmVjb25uZWN0YWJsZTogdHJ1ZSB9LFxyXG4gICAgNDAwNDogeyBtZXNzYWdlOiAnR2XDp2Vyc2l6IGJvdCB0b2tlblxcJ8SxIChBdXRoZW50aWNhdGlvbiBmYWlsZWQpJywgcmVjb25uZWN0YWJsZTogZmFsc2UgfSxcclxuICAgIDQwMDU6IHsgbWVzc2FnZTogJ1phdGVuIGtpbWxpayBkb8SfcnVsYW1hc8SxIHlhcMSxbG3EscWfIChBbHJlYWR5IGF1dGhlbnRpY2F0ZWQpJywgcmVjb25uZWN0YWJsZTogdHJ1ZSB9LFxyXG4gICAgNDAwNzogeyBtZXNzYWdlOiAnR2XDp2Vyc2l6IHNlcXVlbmNlIG51bWFyYXPEsSAoSW52YWxpZCBzZXEpJywgcmVjb25uZWN0YWJsZTogdHJ1ZSB9LFxyXG4gICAgNDAwODogeyBtZXNzYWdlOiAnUmF0ZSBsaW1pdCBhxZ/EsWxkxLEgKFJhdGUgbGltaXRlZCknLCByZWNvbm5lY3RhYmxlOiB0cnVlIH0sXHJcbiAgICA0MDA5OiB7IG1lc3NhZ2U6ICdPdHVydW0gemFtYW4gYcWfxLFtxLFuYSB1xJ9yYWTEsSAoU2Vzc2lvbiB0aW1lZCBvdXQpJywgcmVjb25uZWN0YWJsZTogdHJ1ZSB9LFxyXG4gICAgNDAxMDogeyBtZXNzYWdlOiAnR2XDp2Vyc2l6IHNoYXJkIHlhcMSxbGFuZMSxcm1hc8SxIChJbnZhbGlkIHNoYXJkKScsIHJlY29ubmVjdGFibGU6IGZhbHNlIH0sXHJcbiAgICA0MDExOiB7IG1lc3NhZ2U6ICdTaGFyZGluZyBnZXJla2xpIChTaGFyZGluZyByZXF1aXJlZCknLCByZWNvbm5lY3RhYmxlOiBmYWxzZSB9LFxyXG4gICAgNDAxNDogeyBtZXNzYWdlOiAnxLB6aW4gdmVyaWxtZXllbiBpbnRlbnRcXCdsZXIgaXN0ZW5kaSAoRGlzYWxsb3dlZCBpbnRlbnRzKScsIHJlY29ubmVjdGFibGU6IGZhbHNlIH0sXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogTG9naW4gdG8gdGhlIGdhdGV3YXlcclxuICAgKi9cclxuICBhc3luYyBsb2dpbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghdG9rZW4gfHwgdHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ0dlw6dlcmxpIGJpciBib3QgdG9rZW5cXCfEsSBzYcSfbGFubWFsxLFkxLFyLiDDlnJuZWs6IGNsaWVudC5sb2dpbihwcm9jZXNzLmVudi5CT1RfVE9LRU4pJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9rZW4gPSB0b2tlbi5yZXBsYWNlKC9eQm90XFxzKy9pLCAnJyk7XHJcbiAgICB0aGlzLnJlc3Quc2V0VG9rZW4odGhpcy50b2tlbik7XHJcbiAgICB0aGlzLl9sb2dpblN0YXRlID0gJ2Nvbm5lY3RpbmcnO1xyXG4gICAgdGhpcy5fcmVjb25uZWN0QXR0ZW1wdHMgPSAwO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWR5Jywgb25SZWFkeSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcclxuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdnYXRld2F5Q2xvc2UnLCBvbkdhdGV3YXlDbG9zZSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY2xlYW51cCgpO1xyXG4gICAgICAgIHRoaXMuX2xvZ2luU3RhdGUgPSAnaWRsZSc7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcclxuICAgICAgICAgICdHYXRld2F5XFwnZSBiYcSfbGFuxLFsYW1hZMSxOiAzMCBzYW5peWUgacOnaW5kZSBSRUFEWSBldmVudFxcJ2kgYWzEsW5hbWFkxLEuICcgK1xyXG4gICAgICAgICAgJ09sYXPEsSBzZWJlcGxlcjogZ2F0ZXdheSBzdW51Y3VzdSBlcmnFn2lsZW1leiwgdG9rZW4gZ2XDp2Vyc2l6IHZleWEgYcSfIHNvcnVudS4nXHJcbiAgICAgICAgKSk7XHJcbiAgICAgIH0sIDMwMDAwKTtcclxuXHJcbiAgICAgIGNvbnN0IG9uUmVhZHkgPSAoKSA9PiB7XHJcbiAgICAgICAgY2xlYW51cCgpO1xyXG4gICAgICAgIHRoaXMuX2xvZ2luU3RhdGUgPSAncmVhZHknO1xyXG4gICAgICAgIHRoaXMuX3JlY29ubmVjdEF0dGVtcHRzID0gMDtcclxuICAgICAgICByZXNvbHZlKHRoaXMudG9rZW4pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcclxuICAgICAgICBjbGVhbnVwKCk7XHJcbiAgICAgICAgdGhpcy5fbG9naW5TdGF0ZSA9ICdpZGxlJztcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3Qgb25HYXRld2F5Q2xvc2UgPSAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSBDbGllbnQuQ0xPU0VfQ09ERVNbY29kZV07XHJcbiAgICAgICAgaWYgKGluZm8gJiYgIWluZm8ucmVjb25uZWN0YWJsZSkge1xyXG4gICAgICAgICAgY2xlYW51cCgpO1xyXG4gICAgICAgICAgdGhpcy5fbG9naW5TdGF0ZSA9ICdpZGxlJztcclxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEdhdGV3YXkgYmHEn2xhbnTEsXPEsSByZWRkZWRpbGRpIFske2NvZGV9XTogJHtpbmZvLm1lc3NhZ2V9JHtyZWFzb24gPyAnIC0gJyArIHJlYXNvbiA6ICcnfWApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVjb25uZWN0YWJsZSBjb2RlczogbG9naW4gcHJvbWlzZSBzdGF5cyBhbGl2ZSwgY29ubmVjdCgpIHdpbGwgcmV0cnlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMub25jZSgncmVhZHknLCBvblJlYWR5KTtcclxuICAgICAgdGhpcy5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xyXG4gICAgICB0aGlzLm9uKCdnYXRld2F5Q2xvc2UnLCBvbkdhdGV3YXlDbG9zZSk7XHJcblxyXG4gICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29ubmVjdCB0byB0aGUgZ2F0ZXdheVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KHRoaXMuZ2F0ZXdheVVybCk7XHJcbiAgICBcclxuICAgIHRoaXMud3Mub24oJ29wZW4nLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCAnV2ViU29ja2V0IGJhxJ9sYW50xLFzxLEgYcOnxLFsZMSxJyk7XHJcbiAgICAgIHRoaXMuX3JlY29ubmVjdEF0dGVtcHRzID0gMDtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB0aGlzLndzLm9uKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5oYW5kbGVNZXNzYWdlKGRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy53cy5vbignY2xvc2UnLCAoY29kZSwgcmVhc29uKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlYXNvblN0ciA9IHJlYXNvbj8udG9TdHJpbmcoKSB8fCAnJztcclxuICAgICAgY29uc3QgaW5mbyA9IENsaWVudC5DTE9TRV9DT0RFU1tjb2RlXTtcclxuICAgICAgXHJcbiAgICAgIGlmIChpbmZvKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIGBHYXRld2F5IGJhxJ9sYW50xLFzxLEga2FwYW5kxLEgWyR7Y29kZX1dOiAke2luZm8ubWVzc2FnZX0ke3JlYXNvblN0ciA/ICcgLSAnICsgcmVhc29uU3RyIDogJyd9YCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIGBXZWJTb2NrZXQga2FwYW5kxLE6ICR7Y29kZX0gLSAke3JlYXNvblN0cn1gKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5jbGVhbnVwKCk7XHJcblxyXG4gICAgICAvLyBFbWl0IGdhdGV3YXlDbG9zZSBzbyBsb2dpbigpIGNhbiBoYW5kbGUgbm9uLXJlY29ubmVjdGFibGUgY29kZXNcclxuICAgICAgdGhpcy5lbWl0KCdnYXRld2F5Q2xvc2UnLCBjb2RlLCByZWFzb25TdHIpO1xyXG5cclxuICAgICAgLy8gTm9uLXJlY29ubmVjdGFibGUgY29kZXM6IGRvbid0IHJldHJ5XHJcbiAgICAgIGlmIChpbmZvICYmICFpbmZvLnJlY29ubmVjdGFibGUpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnJywgYEtvZCAke2NvZGV9IHllbmlkZW4gYmHEn2xhbsSxbGFtYXosIGJhxJ9sYW50xLEgc29ubGFuZMSxcsSxbMSxeW9yLmApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTm9ybWFsIGNsb3NlOiBkb24ndCByZXRyeVxyXG4gICAgICBpZiAoY29kZSA9PT0gMTAwMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVjb25uZWN0YWJsZTogcmV0cnkgd2l0aCBiYWNrb2ZmXHJcbiAgICAgIHRoaXMuX3JlY29ubmVjdEF0dGVtcHRzKys7XHJcbiAgICAgIGlmICh0aGlzLl9yZWNvbm5lY3RBdHRlbXB0cyA+IHRoaXMuX21heFJlY29ubmVjdEF0dGVtcHRzKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIGBNYWtzaW11bSB5ZW5pZGVuIGJhxJ9sYW5tYSBkZW5lbWVzaSBhxZ/EsWxkxLEgKCR7dGhpcy5fbWF4UmVjb25uZWN0QXR0ZW1wdHN9KWApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgR2F0ZXdheSBiYcSfbGFudMSxc8SxICR7dGhpcy5fbWF4UmVjb25uZWN0QXR0ZW1wdHN9IGRlbmVtZWRlbiBzb25yYSBrdXJ1bGFtYWTEsS4gU29uIGthcGFubWEga29kdTogJHtjb2RlfWBcclxuICAgICAgICApKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4oMTAwMCAqIE1hdGgucG93KDIsIHRoaXMuX3JlY29ubmVjdEF0dGVtcHRzIC0gMSksIDMwMDAwKTtcclxuICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIGBZZW5pZGVuIGJhxJ9sYW7EsWzEsXlvciAoZGVuZW1lICR7dGhpcy5fcmVjb25uZWN0QXR0ZW1wdHN9LyR7dGhpcy5fbWF4UmVjb25uZWN0QXR0ZW1wdHN9KSwgJHtkZWxheX1tcyBzb25yYS4uLmApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCBkZWxheSk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy53cy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcclxuICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIGBXZWJTb2NrZXQgaGF0YXPEsTogJHtlcnJvci5tZXNzYWdlfWApO1xyXG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKGRhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIG1lc3NhZ2VzIGluIG9uZSBmcmFtZVxyXG4gICAgY29uc3QgbWVzc2FnZXMgPSBkYXRhLnNwbGl0KCdcXG4nKS5maWx0ZXIobSA9PiBtLnRyaW0oKSk7XHJcbiAgICBcclxuICAgIGZvciAoY29uc3QgbXNnIG9mIG1lc3NhZ2VzKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGF5bG9hZDogR2F0ZXdheVBheWxvYWQgPSBKU09OLnBhcnNlKG1zZyk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYXlsb2FkKHBheWxvYWQpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIGBGYWlsZWQgdG8gcGFyc2UgbWVzc2FnZTogJHttc2d9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBnYXRld2F5IHBheWxvYWRcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZVBheWxvYWQocGF5bG9hZDogR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcclxuICAgIGlmIChwYXlsb2FkLnMpIHtcclxuICAgICAgdGhpcy5zZXF1ZW5jZSA9IHBheWxvYWQucztcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHBheWxvYWQub3ApIHtcclxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzpcclxuICAgICAgICB0aGlzLmhhbmRsZUhlbGxvKHBheWxvYWQuZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuRGlzcGF0Y2g6XHJcbiAgICAgICAgdGhpcy5oYW5kbGVEaXNwYXRjaChwYXlsb2FkLnQhLCBwYXlsb2FkLmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFjazpcclxuICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnJywgJ0hlYXJ0YmVhdCBhY2tub3dsZWRnZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjpcclxuICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnJywgJ0dlw6dlcnNpeiBvdHVydW0sIHllbmlkZW4ga2ltbGlrIGRvxJ9ydWxhbsSxeW9yLi4uJyk7XHJcbiAgICAgICAgLy8gSW52YWxpZFNlc3Npb24gbWF5IGNhcnJ5IGVycm9yIGRhdGEgZnJvbSBzZW5kRXJyb3IoKVxyXG4gICAgICAgIGlmIChwYXlsb2FkLmQgJiYgdHlwZW9mIHBheWxvYWQuZCA9PT0gJ29iamVjdCcgJiYgcGF5bG9hZC5kLmNvZGUgJiYgcGF5bG9hZC5kLm1lc3NhZ2UpIHtcclxuICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBgU3VudWN1IGhhdGFzxLEgWyR7cGF5bG9hZC5kLmNvZGV9XTogJHtwYXlsb2FkLmQubWVzc2FnZX1gKTtcclxuICAgICAgICAgIGNvbnN0IGluZm8gPSBDbGllbnQuQ0xPU0VfQ09ERVNbcGF5bG9hZC5kLmNvZGVdO1xyXG4gICAgICAgICAgaWYgKGluZm8gJiYgIWluZm8ucmVjb25uZWN0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGBHYXRld2F5IGhhdGFzxLEgWyR7cGF5bG9hZC5kLmNvZGV9XTogJHtpbmZvLm1lc3NhZ2V9YCkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pZGVudGlmeSgpLCA1MDAwKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsICdSZWNvbm5lY3QgcmVxdWVzdGVkJyk7XHJcbiAgICAgICAgdGhpcy53cz8uY2xvc2UoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCAxMDAwKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBIZWxsbyBwYXlsb2FkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVIZWxsbyhkYXRhOiB7IGhlYXJ0YmVhdF9pbnRlcnZhbDogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgIHRoaXMuZW1pdCgnZGVidWcnLCBgUmVjZWl2ZWQgSGVsbG8sIGhlYXJ0YmVhdCBpbnRlcnZhbDogJHtkYXRhLmhlYXJ0YmVhdF9pbnRlcnZhbH1tc2ApO1xyXG4gICAgdGhpcy5zdGFydEhlYXJ0YmVhdChkYXRhLmhlYXJ0YmVhdF9pbnRlcnZhbCk7XHJcbiAgICB0aGlzLmlkZW50aWZ5KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgRGlzcGF0Y2ggZXZlbnRzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVEaXNwYXRjaChldmVudFR5cGU6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXQoJ2RlYnVnJywgYERpc3BhdGNoOiAke2V2ZW50VHlwZX1gKTtcclxuICAgIFxyXG4gICAgc3dpdGNoIChldmVudFR5cGUpIHtcclxuICAgICAgY2FzZSAnUkVBRFknOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlUmVhZHkoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ0dVSUxEX0NSRUFURSc6XHJcbiAgICAgICAgdGhpcy5oYW5kbGVHdWlsZENyZWF0ZShkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnR1VJTERfVVBEQVRFJzpcclxuICAgICAgICB0aGlzLmhhbmRsZUd1aWxkVXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdHVUlMRF9ERUxFVEUnOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlR3VpbGREZWxldGUoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ01FU1NBR0VfQ1JFQVRFJzpcclxuICAgICAgICB0aGlzLmhhbmRsZU1lc3NhZ2VDcmVhdGUoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ01FU1NBR0VfVVBEQVRFJzpcclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2VVcGRhdGUnLCBkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnTUVTU0FHRV9ERUxFVEUnOlxyXG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZURlbGV0ZScsIGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdNRVNTQUdFX0RFTEVURV9CVUxLJzpcclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2VEZWxldGVCdWxrJywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ0NIQU5ORUxfQ1JFQVRFJzoge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBndWlsZCBjaGFubmVsIGNhY2hlXHJcbiAgICAgICAgY29uc3QgZ3VpbGRJZCA9IGRhdGEuZ3VpbGRfaWQ7XHJcbiAgICAgICAgY29uc3QgY2hhbm5lbElkID0gZGF0YS5pZCB8fCBkYXRhLmNoYW5uZWxfaWQ7XHJcbiAgICAgICAgaWYgKGd1aWxkSWQgJiYgY2hhbm5lbElkKSB7XHJcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChndWlsZElkKTtcclxuICAgICAgICAgIGlmIChndWlsZCkge1xyXG4gICAgICAgICAgICBndWlsZC5jaGFubmVscy5zZXQoY2hhbm5lbElkLCBkYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFubmVsQ3JlYXRlJywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgY2FzZSAnQ0hBTk5FTF9VUERBVEUnOiB7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRJZCA9IGRhdGEuZ3VpbGRfaWQ7XHJcbiAgICAgICAgY29uc3QgY2hhbm5lbElkID0gZGF0YS5pZCB8fCBkYXRhLmNoYW5uZWxfaWQ7XHJcbiAgICAgICAgaWYgKGd1aWxkSWQgJiYgY2hhbm5lbElkKSB7XHJcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChndWlsZElkKTtcclxuICAgICAgICAgIGlmIChndWlsZCkge1xyXG4gICAgICAgICAgICBndWlsZC5jaGFubmVscy5zZXQoY2hhbm5lbElkLCBkYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFubmVsVXBkYXRlJywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgY2FzZSAnQ0hBTk5FTF9ERUxFVEUnOiB7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRJZCA9IGRhdGEuZ3VpbGRfaWQ7XHJcbiAgICAgICAgY29uc3QgY2hhbm5lbElkID0gZGF0YS5pZCB8fCBkYXRhLmNoYW5uZWxfaWQ7XHJcbiAgICAgICAgaWYgKGd1aWxkSWQgJiYgY2hhbm5lbElkKSB7XHJcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChndWlsZElkKTtcclxuICAgICAgICAgIGlmIChndWlsZCkge1xyXG4gICAgICAgICAgICBndWlsZC5jaGFubmVscy5kZWxldGUoY2hhbm5lbElkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFubmVsRGVsZXRlJywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgY2FzZSAnR1VJTERfTUVNQkVSX0FERCc6IHtcclxuICAgICAgICBjb25zdCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChTdHJpbmcoZGF0YS5ndWlsZF9pZCkpO1xyXG4gICAgICAgIGlmIChndWlsZCAmJiBkYXRhLnVzZXIpIHtcclxuICAgICAgICAgIGNvbnN0IG1lbWJlciA9IGd1aWxkLl9hZGRNZW1iZXIoZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoJ2d1aWxkTWVtYmVyQWRkJywgbWVtYmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lbWl0KCdndWlsZE1lbWJlckFkZCcsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdHVUlMRF9NRU1CRVJfVVBEQVRFJzoge1xyXG4gICAgICAgIGNvbnN0IGd1aWxkID0gdGhpcy5ndWlsZHMuZ2V0KFN0cmluZyhkYXRhLmd1aWxkX2lkKSk7XHJcbiAgICAgICAgY29uc3QgcmF3VXNlcklkID0gZGF0YS51c2VyPy5pZCB8fCBkYXRhLnVzZXJfaWQ7XHJcbiAgICAgICAgaWYgKGd1aWxkICYmIHJhd1VzZXJJZCkge1xyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBndWlsZC5tZW1iZXJzLmdldChTdHJpbmcocmF3VXNlcklkKSk7XHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgZXhpc3RpbmcuX3BhdGNoKGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2d1aWxkTWVtYmVyVXBkYXRlJywgZXhpc3RpbmcpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdndWlsZE1lbWJlclVwZGF0ZScsIGRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoJ2d1aWxkTWVtYmVyVXBkYXRlJywgZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ0dVSUxEX01FTUJFUl9SRU1PVkUnOiB7XHJcbiAgICAgICAgY29uc3QgZ3VpbGQgPSB0aGlzLmd1aWxkcy5nZXQoU3RyaW5nKGRhdGEuZ3VpbGRfaWQpKTtcclxuICAgICAgICBjb25zdCByYXdVc2VySWQgPSBkYXRhLnVzZXI/LmlkIHx8IGRhdGEudXNlcl9pZDtcclxuICAgICAgICBpZiAoZ3VpbGQgJiYgcmF3VXNlcklkKSB7XHJcbiAgICAgICAgICBjb25zdCB1c2VySWQgPSBTdHJpbmcocmF3VXNlcklkKTtcclxuICAgICAgICAgIGNvbnN0IG1lbWJlciA9IGd1aWxkLm1lbWJlcnMuZ2V0KHVzZXJJZCk7XHJcbiAgICAgICAgICBndWlsZC5tZW1iZXJzLmRlbGV0ZSh1c2VySWQpO1xyXG4gICAgICAgICAgdGhpcy5lbWl0KCdndWlsZE1lbWJlclJlbW92ZScsIG1lbWJlciB8fCBkYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lbWl0KCdndWlsZE1lbWJlclJlbW92ZScsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdHVUlMRF9ST0xFX0NSRUFURSc6XHJcbiAgICAgICAgdGhpcy5lbWl0KCdyb2xlQ3JlYXRlJywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ0dVSUxEX1JPTEVfVVBEQVRFJzpcclxuICAgICAgICB0aGlzLmVtaXQoJ3JvbGVVcGRhdGUnLCBkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnR1VJTERfUk9MRV9ERUxFVEUnOlxyXG4gICAgICAgIHRoaXMuZW1pdCgncm9sZURlbGV0ZScsIGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdHVUlMRF9CQU5fQUREJzpcclxuICAgICAgICB0aGlzLmVtaXQoJ2d1aWxkQmFuQWRkJywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ0dVSUxEX0JBTl9SRU1PVkUnOlxyXG4gICAgICAgIHRoaXMuZW1pdCgnZ3VpbGRCYW5SZW1vdmUnLCBkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnSU5WSVRFX0NSRUFURSc6XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpbnZpdGVDcmVhdGUnLCBkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnSU5WSVRFX0RFTEVURSc6XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpbnZpdGVEZWxldGUnLCBkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnVFlQSU5HX1NUQVJUJzpcclxuICAgICAgICB0aGlzLmVtaXQoJ3R5cGluZ1N0YXJ0JywgZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ1BSRVNFTkNFX1VQREFURSc6XHJcbiAgICAgICAgdGhpcy5lbWl0KCdwcmVzZW5jZVVwZGF0ZScsIGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdJTlRFUkFDVElPTl9DUkVBVEUnOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25DcmVhdGUoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ1ZPSUNFX1NUQVRFX1VQREFURSc6XHJcbiAgICAgICAgdGhpcy5oYW5kbGVWb2ljZVN0YXRlVXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdWT0lDRV9TRVJWRVJfVVBEQVRFJzpcclxuICAgICAgICB0aGlzLmhhbmRsZVZvaWNlU2VydmVyVXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vIEVtaXQgcmF3IGV2ZW50IGZvciB1bmhhbmRsZWQgdHlwZXNcclxuICAgICAgICB0aGlzLmVtaXQoJ3JhdycsIHsgdDogZXZlbnRUeXBlLCBkOiBkYXRhIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIFJlYWR5IGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVSZWFkeShkYXRhOiBSZWFkeUV2ZW50RGF0YSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXNzaW9uSWQgPSBkYXRhLnNlc3Npb25faWQ7XHJcbiAgICB0aGlzLnVzZXIgPSBuZXcgVXNlcihkYXRhLnVzZXIpO1xyXG4gICAgLy8gSGFuZGxlIGJvdGggc3RyaW5nIGFuZCBudW1iZXIgYXBwbGljYXRpb24gSURzXHJcbiAgICB0aGlzLmFwcGxpY2F0aW9uSWQgPSBkYXRhLmFwcGxpY2F0aW9uPy5pZCA/IFN0cmluZyhkYXRhLmFwcGxpY2F0aW9uLmlkKSA6IG51bGw7XHJcbiAgICBpZiAodGhpcy5hcHBsaWNhdGlvbklkKSB7XHJcbiAgICAgIHRoaXMucmVzdC5zZXRBcHBsaWNhdGlvbklkKHRoaXMuYXBwbGljYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIENhY2hlIGd1aWxkcyAoYXMgdW5hdmFpbGFibGUgaW5pdGlhbGx5KVxyXG4gICAgaWYgKGRhdGEuZ3VpbGRzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZ3VpbGQgb2YgZGF0YS5ndWlsZHMpIHtcclxuICAgICAgICB0aGlzLmd1aWxkcy5zZXQoU3RyaW5nKGd1aWxkLmlkKSwgbmV3IEd1aWxkKHRoaXMsIGd1aWxkKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gU2V0dXAgdm9pY2UgYWRhcHRlcnMgZm9yIGVhY2ggZ3VpbGRcclxuICAgIHRoaXMuc2V0dXBWb2ljZUFkYXB0ZXJzKCk7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGDinIUgQm90IGhhesSxciEgVXNlcjogJHt0aGlzLnVzZXIudXNlcm5hbWV9ICgke3RoaXMudXNlci5pZH0pLCBBcHA6ICR7dGhpcy5hcHBsaWNhdGlvbklkfWApO1xyXG4gICAgdGhpcy5lbWl0KCdyZWFkeScsIHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdm9pY2UgYWRhcHRlcnMgZm9yIGFsbCBndWlsZHNcclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwVm9pY2VBZGFwdGVycygpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgW2d1aWxkSWRdIG9mIHRoaXMuZ3VpbGRzKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlVm9pY2VBZGFwdGVyKGd1aWxkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgdm9pY2UgYWRhcHRlciBmb3IgYSBndWlsZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlVm9pY2VBZGFwdGVyKGd1aWxkSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgYWRhcHRlcjogVm9pY2VBZGFwdGVyQ3JlYXRvciA9IChtZXRob2RzKSA9PiB7XHJcbiAgICAgIC8vIFN0b3JlIGhhbmRsZXJzIGZvciB0aGlzIGd1aWxkXHJcbiAgICAgIHRoaXMudm9pY2VTdGF0ZUhhbmRsZXJzLnNldChndWlsZElkLCBtZXRob2RzLm9uVm9pY2VTdGF0ZVVwZGF0ZSk7XHJcbiAgICAgIHRoaXMudm9pY2VTZXJ2ZXJIYW5kbGVycy5zZXQoZ3VpbGRJZCwgbWV0aG9kcy5vblZvaWNlU2VydmVyVXBkYXRlKTtcclxuICAgICAgXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2VuZFBheWxvYWQ6IChwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcclxuICAgICAgICAgICAgdGhpcy53cy5zZW5kKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZXN0cm95OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZvaWNlU3RhdGVIYW5kbGVycy5kZWxldGUoZ3VpbGRJZCk7XHJcbiAgICAgICAgICB0aGlzLnZvaWNlU2VydmVySGFuZGxlcnMuZGVsZXRlKGd1aWxkSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIHRoaXMudm9pY2UuYWRhcHRlcnMuc2V0KGd1aWxkSWQsIGFkYXB0ZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIEd1aWxkIENyZWF0ZSBldmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlR3VpbGRDcmVhdGUoZGF0YTogQVBJR3VpbGQpOiB2b2lkIHtcclxuICAgIGxldCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChkYXRhLmlkKTtcclxuICAgIFxyXG4gICAgaWYgKGd1aWxkKSB7XHJcbiAgICAgIGd1aWxkLl9wYXRjaChkYXRhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGd1aWxkID0gbmV3IEd1aWxkKHRoaXMsIGRhdGEpO1xyXG4gICAgICB0aGlzLmd1aWxkcy5zZXQoZGF0YS5pZCwgZ3VpbGQpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVZvaWNlQWRhcHRlcihkYXRhLmlkKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5lbWl0KCdndWlsZENyZWF0ZScsIGd1aWxkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBHdWlsZCBVcGRhdGUgZXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUd1aWxkVXBkYXRlKGRhdGE6IEFQSUd1aWxkKTogdm9pZCB7XHJcbiAgICBjb25zdCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChkYXRhLmlkKTtcclxuICAgIGlmIChndWlsZCkge1xyXG4gICAgICBndWlsZC5fcGF0Y2goZGF0YSk7XHJcbiAgICAgIHRoaXMuZW1pdCgnZ3VpbGRVcGRhdGUnLCBndWlsZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgR3VpbGQgRGVsZXRlIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVHdWlsZERlbGV0ZShkYXRhOiB7IGlkOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3VpbGQgPSB0aGlzLmd1aWxkcy5nZXQoZGF0YS5pZCk7XHJcbiAgICBpZiAoZ3VpbGQpIHtcclxuICAgICAgdGhpcy5ndWlsZHMuZGVsZXRlKGRhdGEuaWQpO1xyXG4gICAgICB0aGlzLnZvaWNlLmFkYXB0ZXJzLmRlbGV0ZShkYXRhLmlkKTtcclxuICAgICAgdGhpcy5lbWl0KCdndWlsZERlbGV0ZScsIGd1aWxkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBNZXNzYWdlIENyZWF0ZSBldmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlTWVzc2FnZUNyZWF0ZShkYXRhOiBBUElNZXNzYWdlKTogdm9pZCB7XHJcbiAgICAvLyBCYWNrZW5kIHNlbmRzIHVzZXJfaWQgc2VwYXJhdGVseSwgbWFwIGl0IHRvIGF1dGhvci5pZCBmb3IgY29tcGF0aWJpbGl0eVxyXG4gICAgaWYgKGRhdGEudXNlcl9pZCAmJiBkYXRhLmF1dGhvciAmJiAhZGF0YS5hdXRob3IuaWQpIHtcclxuICAgICAgKGRhdGEuYXV0aG9yIGFzIGFueSkuaWQgPSBkYXRhLnVzZXJfaWQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIENhY2hlIHRoZSBhdXRob3JcclxuICAgIGlmIChkYXRhLmF1dGhvcikge1xyXG4gICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIoZGF0YS5hdXRob3IpO1xyXG4gICAgICB0aGlzLnVzZXJzLnNldCh1c2VyLmlkLCB1c2VyKTtcclxuICAgICAgLy8gQWxzbyBjYWNoZSBpbiBSRVNUIGZvciBtZW50aW9uIHJlc29sdXRpb25cclxuICAgICAgdGhpcy5yZXN0LmNhY2hlVXNlcihkYXRhLmF1dGhvcik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh0aGlzLCBkYXRhKTtcclxuXHJcbiAgICAvLyBNYXJrIG1lc3NhZ2UgYXMgZnJvbSBib3QgaWYgYXV0aG9yIElEIG1hdGNoZXMgdGhlIGJvdCdzIG93biB1c2VyIElEXHJcbiAgICBpZiAodGhpcy51c2VyICYmIFN0cmluZyhtZXNzYWdlLmF1dGhvci5pZCkgPT09IFN0cmluZyh0aGlzLnVzZXIuaWQpKSB7XHJcbiAgICAgIChtZXNzYWdlLmF1dGhvciBhcyBhbnkpLmJvdCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzb2x2ZSBndWlsZCBtZW1iZXIgaWYgaW4gYSBndWlsZFxyXG4gICAgaWYgKG1lc3NhZ2UuZ3VpbGRJZCkge1xyXG4gICAgICBjb25zdCBndWlsZCA9IHRoaXMuZ3VpbGRzLmdldChtZXNzYWdlLmd1aWxkSWQpO1xyXG4gICAgICBjb25zdCBtZW1iZXJEYXRhID0gKGRhdGEgYXMgYW55KS5tZW1iZXI7XHJcbiAgICAgIGlmIChtZW1iZXJEYXRhICYmIGd1aWxkKSB7XHJcbiAgICAgICAgLy8gR2F0ZXdheSBzZW50IG1lbWJlciBkYXRhIHdpdGggdGhlIG1lc3NhZ2Ug4oCUIGNhY2hlIGl0XHJcbiAgICAgICAgbWVtYmVyRGF0YS51c2VyID0gZGF0YS5hdXRob3I7XHJcbiAgICAgICAgY29uc3QgbWVtYmVyID0gZ3VpbGQuX2FkZE1lbWJlcihtZW1iZXJEYXRhKTtcclxuICAgICAgICBtZXNzYWdlLm1lbWJlciA9IG1lbWJlcjtcclxuICAgICAgfSBlbHNlIGlmIChtZW1iZXJEYXRhKSB7XHJcbiAgICAgICAgLy8gTm8gZ3VpbGQgaW4gY2FjaGUgYnV0IG1lbWJlciBkYXRhIGV4aXN0c1xyXG4gICAgICAgIG1lbWJlckRhdGEudXNlciA9IGRhdGEuYXV0aG9yO1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkR3VpbGQgPSB7IGlkOiBtZXNzYWdlLmd1aWxkSWQsIG93bmVySWQ6IG51bGwgfSBhcyBhbnk7XHJcbiAgICAgICAgbWVzc2FnZS5tZW1iZXIgPSBuZXcgKHJlcXVpcmUoJy4vc3RydWN0dXJlcy9HdWlsZE1lbWJlcicpLkd1aWxkTWVtYmVyKSh0aGlzLCByZXNvbHZlZEd1aWxkLCBtZW1iZXJEYXRhKTtcclxuICAgICAgfSBlbHNlIGlmIChndWlsZCkge1xyXG4gICAgICAgIC8vIFRyeSBjYWNoZVxyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IGd1aWxkLm1lbWJlcnM/LmdldChTdHJpbmcobWVzc2FnZS5hdXRob3IuaWQpKTtcclxuICAgICAgICBpZiAoY2FjaGVkPy5wZXJtaXNzaW9ucz8uaGFzKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLm1lbWJlciA9IGNhY2hlZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXQoJ21lc3NhZ2VDcmVhdGUnLCBtZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBJbnRlcmFjdGlvbiBDcmVhdGUgZXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUludGVyYWN0aW9uQ3JlYXRlKGRhdGE6IEFQSUludGVyYWN0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnW0RFQlVHXSBoYW5kbGVJbnRlcmFjdGlvbkNyZWF0ZSBjYWxsZWQgd2l0aDonLCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XHJcbiAgICBcclxuICAgIC8vIENhY2hlIHRoZSB1c2VyXHJcbiAgICBjb25zdCB1c2VyRGF0YSA9IGRhdGEubWVtYmVyPy51c2VyIHx8IGRhdGEudXNlcjtcclxuICAgIGlmICh1c2VyRGF0YSkge1xyXG4gICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIodXNlckRhdGEpO1xyXG4gICAgICB0aGlzLnVzZXJzLnNldCh1c2VyLmlkLCB1c2VyKTtcclxuICAgICAgdGhpcy5yZXN0LmNhY2hlVXNlcih1c2VyRGF0YSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IGludGVyYWN0aW9uID0gY3JlYXRlSW50ZXJhY3Rpb24odGhpcywgZGF0YSk7XHJcbiAgICBjb25zb2xlLmxvZygnW0RFQlVHXSBDcmVhdGVkIGludGVyYWN0aW9uIHR5cGU6JywgaW50ZXJhY3Rpb24uY29uc3RydWN0b3IubmFtZSwgJ2N1c3RvbUlkOicsIChpbnRlcmFjdGlvbiBhcyBhbnkpLmN1c3RvbUlkKTtcclxuICAgIHRoaXMuZW1pdCgnaW50ZXJhY3Rpb25DcmVhdGUnLCBpbnRlcmFjdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgVm9pY2UgU3RhdGUgVXBkYXRlIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVWb2ljZVN0YXRlVXBkYXRlKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3VpbGRJZCA9IGRhdGEuZ3VpbGRfaWQ7XHJcbiAgICBcclxuICAgIC8vIEZvcndhcmQgdG8gdm9pY2UgYWRhcHRlciBpZiBleGlzdHNcclxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnZvaWNlU3RhdGVIYW5kbGVycy5nZXQoZ3VpbGRJZCk7XHJcbiAgICBpZiAoaGFuZGxlcikge1xyXG4gICAgICBoYW5kbGVyKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmVtaXQoJ3ZvaWNlU3RhdGVVcGRhdGUnLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBWb2ljZSBTZXJ2ZXIgVXBkYXRlIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVWb2ljZVNlcnZlclVwZGF0ZShkYXRhOiBBUElWb2ljZVNlcnZlclVwZGF0ZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3VpbGRJZCA9IGRhdGEuZ3VpbGRfaWQ7XHJcbiAgICBcclxuICAgIC8vIEZvcndhcmQgdG8gdm9pY2UgYWRhcHRlciBpZiBleGlzdHNcclxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnZvaWNlU2VydmVySGFuZGxlcnMuZ2V0KGd1aWxkSWQpO1xyXG4gICAgaWYgKGhhbmRsZXIpIHtcclxuICAgICAgaGFuZGxlcih7XHJcbiAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXHJcbiAgICAgICAgZW5kcG9pbnQ6IGRhdGEuZW5kcG9pbnQsXHJcbiAgICAgICAgcm9vbTogZGF0YS5yb29tXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmVtaXQoJ3ZvaWNlU2VydmVyVXBkYXRlJywgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kIElkZW50aWZ5IHBheWxvYWRcclxuICAgKi9cclxuICBwcml2YXRlIGlkZW50aWZ5KCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGF5bG9hZDogR2F0ZXdheVBheWxvYWQgPSB7XHJcbiAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5JZGVudGlmeSxcclxuICAgICAgZDoge1xyXG4gICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy50b2tlbn1gLFxyXG4gICAgICAgIGludGVudHM6IHRoaXMuZ2V0SW50ZW50c1ZhbHVlKCksXHJcbiAgICAgICAgc2hhcmQ6IHRoaXMub3B0aW9ucy5zaGFyZHMgfHwgWzAsIDFdXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIHRoaXMuc2VuZChwYXlsb2FkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0IGhlYXJ0YmVhdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhcnRIZWFydGJlYXQoaW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5zZW5kKHtcclxuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxyXG4gICAgICAgIGQ6IHRoaXMuc2VxdWVuY2VcclxuICAgICAgfSk7XHJcbiAgICB9LCBpbnRlcnZhbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kIHBheWxvYWQgdG8gZ2F0ZXdheVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2VuZChwYXlsb2FkOiBHYXRld2F5UGF5bG9hZCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XHJcbiAgICAgIHRoaXMud3Muc2VuZChKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhbnVwIG9uIGRpc2Nvbm5lY3RcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oZWFydGJlYXRJbnRlcnZhbCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwpO1xyXG4gICAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc3Ryb3kgdGhlIGNsaWVudFxyXG4gICAqL1xyXG4gIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2dpblN0YXRlID0gJ2lkbGUnO1xyXG4gICAgdGhpcy5fcmVjb25uZWN0QXR0ZW1wdHMgPSB0aGlzLl9tYXhSZWNvbm5lY3RBdHRlbXB0cyArIDE7IC8vIFByZXZlbnQgcmVjb25uZWN0XHJcbiAgICB0aGlzLmNsZWFudXAoKTtcclxuICAgIHRoaXMud3M/LmNsb3NlKDEwMDApO1xyXG4gICAgdGhpcy53cyA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gUmUtZXhwb3J0IGZvciBjb252ZW5pZW5jZVxyXG5leHBvcnQgeyBHYXRld2F5SW50ZW50Qml0cyB9O1xyXG4iXX0=
|