@jubbio/core 1.1.20 → 1.3.2

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