@jubbio/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/Client.d.ts +147 -0
  4. package/dist/Client.js +471 -0
  5. package/dist/builders/ActionRowBuilder.d.ts +53 -0
  6. package/dist/builders/ActionRowBuilder.js +68 -0
  7. package/dist/builders/ButtonBuilder.d.ts +77 -0
  8. package/dist/builders/ButtonBuilder.js +96 -0
  9. package/dist/builders/EmbedBuilder.d.ts +157 -0
  10. package/dist/builders/EmbedBuilder.js +199 -0
  11. package/dist/builders/ModalBuilder.d.ts +122 -0
  12. package/dist/builders/ModalBuilder.js +162 -0
  13. package/dist/builders/SelectMenuBuilder.d.ts +123 -0
  14. package/dist/builders/SelectMenuBuilder.js +165 -0
  15. package/dist/builders/SlashCommandBuilder.d.ts +197 -0
  16. package/dist/builders/SlashCommandBuilder.js +324 -0
  17. package/dist/builders/index.d.ts +9 -0
  18. package/dist/builders/index.js +26 -0
  19. package/dist/enums.d.ts +196 -0
  20. package/dist/enums.js +216 -0
  21. package/dist/index.d.ts +25 -0
  22. package/dist/index.js +128 -0
  23. package/dist/managers/BaseManager.d.ts +69 -0
  24. package/dist/managers/BaseManager.js +106 -0
  25. package/dist/managers/ChannelManager.d.ts +98 -0
  26. package/dist/managers/ChannelManager.js +209 -0
  27. package/dist/managers/GuildMemberManager.d.ts +74 -0
  28. package/dist/managers/GuildMemberManager.js +156 -0
  29. package/dist/managers/RoleManager.d.ts +84 -0
  30. package/dist/managers/RoleManager.js +207 -0
  31. package/dist/managers/index.d.ts +7 -0
  32. package/dist/managers/index.js +24 -0
  33. package/dist/rest/REST.d.ts +483 -0
  34. package/dist/rest/REST.js +805 -0
  35. package/dist/rest/index.d.ts +1 -0
  36. package/dist/rest/index.js +18 -0
  37. package/dist/sharding/ShardingManager.d.ts +179 -0
  38. package/dist/sharding/ShardingManager.js +375 -0
  39. package/dist/sharding/index.d.ts +4 -0
  40. package/dist/sharding/index.js +21 -0
  41. package/dist/structures/Channel.d.ts +120 -0
  42. package/dist/structures/Channel.js +224 -0
  43. package/dist/structures/Collection.d.ts +53 -0
  44. package/dist/structures/Collection.js +115 -0
  45. package/dist/structures/Guild.d.ts +59 -0
  46. package/dist/structures/Guild.js +90 -0
  47. package/dist/structures/GuildMember.d.ts +130 -0
  48. package/dist/structures/GuildMember.js +208 -0
  49. package/dist/structures/Interaction.d.ts +224 -0
  50. package/dist/structures/Interaction.js +404 -0
  51. package/dist/structures/Message.d.ts +93 -0
  52. package/dist/structures/Message.js +145 -0
  53. package/dist/structures/User.d.ts +37 -0
  54. package/dist/structures/User.js +65 -0
  55. package/dist/structures/index.d.ts +7 -0
  56. package/dist/structures/index.js +25 -0
  57. package/dist/structures.d.ts +1 -0
  58. package/dist/structures.js +19 -0
  59. package/dist/types.d.ts +255 -0
  60. package/dist/types.js +3 -0
  61. package/dist/utils/BitField.d.ts +66 -0
  62. package/dist/utils/BitField.js +138 -0
  63. package/dist/utils/Collection.d.ts +116 -0
  64. package/dist/utils/Collection.js +265 -0
  65. package/dist/utils/Collector.d.ts +152 -0
  66. package/dist/utils/Collector.js +314 -0
  67. package/dist/utils/DataResolver.d.ts +61 -0
  68. package/dist/utils/DataResolver.js +146 -0
  69. package/dist/utils/Formatters.d.ts +145 -0
  70. package/dist/utils/Formatters.js +213 -0
  71. package/dist/utils/IntentsBitField.d.ts +85 -0
  72. package/dist/utils/IntentsBitField.js +99 -0
  73. package/dist/utils/Partials.d.ts +105 -0
  74. package/dist/utils/Partials.js +149 -0
  75. package/dist/utils/PermissionsBitField.d.ts +118 -0
  76. package/dist/utils/PermissionsBitField.js +145 -0
  77. package/dist/utils/SnowflakeUtil.d.ts +63 -0
  78. package/dist/utils/SnowflakeUtil.js +93 -0
  79. package/dist/utils/Sweepers.d.ts +127 -0
  80. package/dist/utils/Sweepers.js +270 -0
  81. package/dist/utils/index.d.ts +13 -0
  82. package/dist/utils/index.js +30 -0
  83. package/package.json +37 -0
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ /**
3
+ * Generic BitField class
4
+ * API compatible with Discord.js BitField
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BitField = void 0;
8
+ /**
9
+ * Data structure for bit fields
10
+ */
11
+ class BitField {
12
+ /** The raw bits */
13
+ bitfield;
14
+ /** Flags for this bitfield (override in subclass) */
15
+ static Flags = {};
16
+ /** Default bit value */
17
+ static DefaultBit = 0n;
18
+ constructor(bits = BitField.DefaultBit) {
19
+ this.bitfield = this.constructor.resolve(bits);
20
+ }
21
+ /**
22
+ * Check if this bitfield has a bit
23
+ */
24
+ has(bit) {
25
+ const resolved = this.constructor.resolve(bit);
26
+ return (this.bitfield & resolved) === resolved;
27
+ }
28
+ /**
29
+ * Check if this bitfield has any of the bits
30
+ */
31
+ any(bits) {
32
+ const resolved = this.constructor.resolve(bits);
33
+ return (this.bitfield & resolved) !== 0n;
34
+ }
35
+ /**
36
+ * Add bits to this bitfield
37
+ */
38
+ add(...bits) {
39
+ let total = 0n;
40
+ for (const bit of bits) {
41
+ total |= this.constructor.resolve(bit);
42
+ }
43
+ this.bitfield |= total;
44
+ return this;
45
+ }
46
+ /**
47
+ * Remove bits from this bitfield
48
+ */
49
+ remove(...bits) {
50
+ let total = 0n;
51
+ for (const bit of bits) {
52
+ total |= this.constructor.resolve(bit);
53
+ }
54
+ this.bitfield &= ~total;
55
+ return this;
56
+ }
57
+ /**
58
+ * Serialize to array of flag names
59
+ */
60
+ toArray() {
61
+ const flags = this.constructor.Flags;
62
+ const result = [];
63
+ for (const [name, bit] of Object.entries(flags)) {
64
+ if (this.bitfield & bit) {
65
+ result.push(name);
66
+ }
67
+ }
68
+ return result;
69
+ }
70
+ /**
71
+ * Serialize to JSON
72
+ */
73
+ toJSON() {
74
+ return typeof this.bitfield === 'bigint'
75
+ ? this.bitfield.toString()
76
+ : this.bitfield;
77
+ }
78
+ /**
79
+ * Get string representation
80
+ */
81
+ toString() {
82
+ return this.bitfield.toString();
83
+ }
84
+ /**
85
+ * Get iterator
86
+ */
87
+ *[Symbol.iterator]() {
88
+ yield* this.toArray();
89
+ }
90
+ /**
91
+ * Freeze this bitfield
92
+ */
93
+ freeze() {
94
+ return Object.freeze(this);
95
+ }
96
+ /**
97
+ * Check equality
98
+ */
99
+ equals(other) {
100
+ return this.bitfield === this.constructor.resolve(other);
101
+ }
102
+ /**
103
+ * Clone this bitfield
104
+ */
105
+ clone() {
106
+ return new this.constructor(this.bitfield);
107
+ }
108
+ /**
109
+ * Resolve a bit to the numeric type
110
+ */
111
+ static resolve(bit) {
112
+ if (typeof bit === 'bigint' || typeof bit === 'number') {
113
+ return bit;
114
+ }
115
+ if (bit instanceof BitField) {
116
+ return bit.bitfield;
117
+ }
118
+ if (typeof bit === 'string') {
119
+ const resolved = this.Flags[bit];
120
+ if (resolved === undefined) {
121
+ throw new Error(`Unknown bit: ${bit}`);
122
+ }
123
+ return resolved;
124
+ }
125
+ if (Array.isArray(bit)) {
126
+ let result = this.DefaultBit;
127
+ for (const b of bit) {
128
+ const resolved = this.resolve(b);
129
+ result |= resolved;
130
+ }
131
+ return result;
132
+ }
133
+ throw new Error(`Invalid bit: ${bit}`);
134
+ }
135
+ }
136
+ exports.BitField = BitField;
137
+ exports.default = BitField;
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0RmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvQml0RmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBU0g7O0dBRUc7QUFDSCxNQUFhLFFBQVE7SUFDbkIsbUJBQW1CO0lBQ1osUUFBUSxDQUFJO0lBRW5CLHFEQUFxRDtJQUNyRCxNQUFNLENBQUMsS0FBSyxHQUFvQyxFQUFFLENBQUM7SUFFbkQsd0JBQXdCO0lBQ3hCLE1BQU0sQ0FBQyxVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUV4QyxZQUFZLE9BQWlDLFFBQVEsQ0FBQyxVQUFlO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUksSUFBSSxDQUFDLFdBQStCLENBQUMsT0FBTyxDQUFPLElBQUksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxHQUE2QjtRQUMvQixNQUFNLFFBQVEsR0FBSSxJQUFJLENBQUMsV0FBK0IsQ0FBQyxPQUFPLENBQU8sR0FBRyxDQUFDLENBQUM7UUFDMUUsT0FBTyxDQUFFLElBQUksQ0FBQyxRQUFtQixHQUFJLFFBQW1CLENBQUMsS0FBTSxRQUFtQixDQUFDO0lBQ3JGLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxJQUE4QjtRQUNoQyxNQUFNLFFBQVEsR0FBSSxJQUFJLENBQUMsV0FBK0IsQ0FBQyxPQUFPLENBQU8sSUFBSSxDQUFDLENBQUM7UUFDM0UsT0FBTyxDQUFFLElBQUksQ0FBQyxRQUFtQixHQUFJLFFBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLEdBQUcsSUFBZ0M7UUFDckMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFLLElBQUssSUFBSSxDQUFDLFdBQStCLENBQUMsT0FBTyxDQUFP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dkIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQW9CLENBQUM7WUFDdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLFFBQWtCLENBQUM7WUFDL0IsQ0FBQztZQUNELE9BQU8sTUFBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0FBaEpILDRCQWlKQztBQUVELGtCQUFlLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBHZW5lcmljIEJpdEZpZWxkIGNsYXNzXHJcbiAqIEFQSSBjb21wYXRpYmxlIHdpdGggRGlzY29yZC5qcyBCaXRGaWVsZFxyXG4gKi9cclxuXHJcbmV4cG9ydCB0eXBlIEJpdEZpZWxkUmVzb2x2YWJsZTxTIGV4dGVuZHMgc3RyaW5nLCBOIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPiA9IFxyXG4gIHwgTiBcclxuICB8IE5bXSBcclxuICB8IFMgXHJcbiAgfCBTW10gXHJcbiAgfCBCaXRGaWVsZDxTLCBOPjtcclxuXHJcbi8qKlxyXG4gKiBEYXRhIHN0cnVjdHVyZSBmb3IgYml0IGZpZWxkc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEJpdEZpZWxkPFMgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIE4gZXh0ZW5kcyBiaWdpbnQgfCBudW1iZXIgPSBiaWdpbnQ+IHtcclxuICAvKiogVGhlIHJhdyBiaXRzICovXHJcbiAgcHVibGljIGJpdGZpZWxkOiBOO1xyXG5cclxuICAvKiogRmxhZ3MgZm9yIHRoaXMgYml0ZmllbGQgKG92ZXJyaWRlIGluIHN1YmNsYXNzKSAqL1xyXG4gIHN0YXRpYyBGbGFnczogUmVjb3JkPHN0cmluZywgYmlnaW50IHwgbnVtYmVyPiA9IHt9O1xyXG5cclxuICAvKiogRGVmYXVsdCBiaXQgdmFsdWUgKi9cclxuICBzdGF0aWMgRGVmYXVsdEJpdDogYmlnaW50IHwgbnVtYmVyID0gMG47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGJpdHM6IEJpdEZpZWxkUmVzb2x2YWJsZTxTLCBOPiA9IEJpdEZpZWxkLkRlZmF1bHRCaXQgYXMgTikge1xyXG4gICAgdGhpcy5iaXRmaWVsZCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCaXRGaWVsZCkucmVzb2x2ZTxTLCBOPihiaXRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoaXMgYml0ZmllbGQgaGFzIGEgYml0XHJcbiAgICovXHJcbiAgaGFzKGJpdDogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByZXNvbHZlZCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCaXRGaWVsZCkucmVzb2x2ZTxTLCBOPihiaXQpO1xyXG4gICAgcmV0dXJuICgodGhpcy5iaXRmaWVsZCBhcyBiaWdpbnQpICYgKHJlc29sdmVkIGFzIGJpZ2ludCkpID09PSAocmVzb2x2ZWQgYXMgYmlnaW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoaXMgYml0ZmllbGQgaGFzIGFueSBvZiB0aGUgYml0c1xyXG4gICAqL1xyXG4gIGFueShiaXRzOiBCaXRGaWVsZFJlc29sdmFibGU8UywgTj4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJlc29sdmVkID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJpdEZpZWxkKS5yZXNvbHZlPFMsIE4+KGJpdHMpO1xyXG4gICAgcmV0dXJuICgodGhpcy5iaXRmaWVsZCBhcyBiaWdpbnQpICYgKHJlc29sdmVkIGFzIGJpZ2ludCkpICE9PSAwbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBiaXRzIHRvIHRoaXMgYml0ZmllbGRcclxuICAgKi9cclxuICBhZGQoLi4uYml0czogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+W10pOiB0aGlzIHtcclxuICAgIGxldCB0b3RhbCA9IDBuO1xyXG4gICAgZm9yIChjb25zdCBiaXQgb2YgYml0cykge1xyXG4gICAgICB0b3RhbCB8PSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLnJlc29sdmU8UywgTj4oYml0KSBhcyBiaWdpbnQ7XHJcbiAgICB9XHJcbiAgICAodGhpcy5iaXRmaWVsZCBhcyBiaWdpbnQpIHw9IHRvdGFsO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYml0cyBmcm9tIHRoaXMgYml0ZmllbGRcclxuICAgKi9cclxuICByZW1vdmUoLi4uYml0czogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+W10pOiB0aGlzIHtcclxuICAgIGxldCB0b3RhbCA9IDBuO1xyXG4gICAgZm9yIChjb25zdCBiaXQgb2YgYml0cykge1xyXG4gICAgICB0b3RhbCB8PSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLnJlc29sdmU8UywgTj4oYml0KSBhcyBiaWdpbnQ7XHJcbiAgICB9XHJcbiAgICAodGhpcy5iaXRmaWVsZCBhcyBiaWdpbnQpICY9IH50b3RhbDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VyaWFsaXplIHRvIGFycmF5IG9mIGZsYWcgbmFtZXNcclxuICAgKi9cclxuICB0b0FycmF5KCk6IFNbXSB7XHJcbiAgICBjb25zdCBmbGFncyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCaXRGaWVsZCkuRmxhZ3M7XHJcbiAgICBjb25zdCByZXN1bHQ6IFNbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBiaXRdIG9mIE9iamVjdC5lbnRyaWVzKGZsYWdzKSkge1xyXG4gICAgICBpZiAoKHRoaXMuYml0ZmllbGQgYXMgYmlnaW50KSAmIChiaXQgYXMgYmlnaW50KSkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKG5hbWUgYXMgUyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlcmlhbGl6ZSB0byBKU09OXHJcbiAgICovXHJcbiAgdG9KU09OKCk6IHN0cmluZyB8IG51bWJlciB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuYml0ZmllbGQgPT09ICdiaWdpbnQnIFxyXG4gICAgICA/IHRoaXMuYml0ZmllbGQudG9TdHJpbmcoKSBcclxuICAgICAgOiB0aGlzLmJpdGZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvblxyXG4gICAqL1xyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iaXRmaWVsZC50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGl0ZXJhdG9yXHJcbiAgICovXHJcbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Uz4ge1xyXG4gICAgeWllbGQqIHRoaXMudG9BcnJheSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnJlZXplIHRoaXMgYml0ZmllbGRcclxuICAgKi9cclxuICBmcmVlemUoKTogUmVhZG9ubHk8dGhpcz4ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBlcXVhbGl0eVxyXG4gICAqL1xyXG4gIGVxdWFscyhvdGhlcjogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5iaXRmaWVsZCA9PT0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJpdEZpZWxkKS5yZXNvbHZlPFMsIE4+KG90aGVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb25lIHRoaXMgYml0ZmllbGRcclxuICAgKi9cclxuICBjbG9uZSgpOiBCaXRGaWVsZDxTLCBOPiB7XHJcbiAgICByZXR1cm4gbmV3ICh0aGlzLmNvbnN0cnVjdG9yIGFzIG5ldyAoYml0czogTikgPT4gQml0RmllbGQ8UywgTj4pKHRoaXMuYml0ZmllbGQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZSBhIGJpdCB0byB0aGUgbnVtZXJpYyB0eXBlXHJcbiAgICovXHJcbiAgc3RhdGljIHJlc29sdmU8UyBleHRlbmRzIHN0cmluZywgTiBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oYml0OiBCaXRGaWVsZFJlc29sdmFibGU8UywgTj4pOiBOIHtcclxuICAgIGlmICh0eXBlb2YgYml0ID09PSAnYmlnaW50JyB8fCB0eXBlb2YgYml0ID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gYml0IGFzIE47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJpdCBpbnN0YW5jZW9mIEJpdEZpZWxkKSB7XHJcbiAgICAgIHJldHVybiBiaXQuYml0ZmllbGQgYXMgTjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGJpdCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLkZsYWdzW2JpdF07XHJcbiAgICAgIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJpdDogJHtiaXR9YCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc29sdmVkIGFzIE47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYml0KSkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5EZWZhdWx0Qml0IGFzIGJpZ2ludDtcclxuICAgICAgZm9yIChjb25zdCBiIG9mIGJpdCkge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlPFMsIE4+KGIpO1xyXG4gICAgICAgIHJlc3VsdCB8PSByZXNvbHZlZCBhcyBiaWdpbnQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdCBhcyBOO1xyXG4gICAgfVxyXG5cclxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiaXQ6ICR7Yml0fWApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQml0RmllbGQ7XHJcbiJdfQ==
@@ -0,0 +1,116 @@
1
+ /**
2
+ * A Map with additional utility methods
3
+ */
4
+ export declare class Collection<K, V> extends Map<K, V> {
5
+ /**
6
+ * Identical to Map.get()
7
+ * Ensures the value exists
8
+ */
9
+ ensure(key: K, defaultValueGenerator: (key: K, collection: this) => V): V;
10
+ /**
11
+ * Checks if all items pass a test
12
+ */
13
+ every(fn: (value: V, key: K, collection: this) => boolean): boolean;
14
+ /**
15
+ * Checks if any item passes a test
16
+ */
17
+ some(fn: (value: V, key: K, collection: this) => boolean): boolean;
18
+ /**
19
+ * Identical to Array.filter(), but returns a Collection
20
+ */
21
+ filter(fn: (value: V, key: K, collection: this) => boolean): Collection<K, V>;
22
+ /**
23
+ * Partitions the collection into two collections
24
+ */
25
+ partition(fn: (value: V, key: K, collection: this) => boolean): [Collection<K, V>, Collection<K, V>];
26
+ /**
27
+ * Maps each item to another value
28
+ */
29
+ map<T>(fn: (value: V, key: K, collection: this) => T): T[];
30
+ /**
31
+ * Maps each item to another value into a Collection
32
+ */
33
+ mapValues<T>(fn: (value: V, key: K, collection: this) => T): Collection<K, T>;
34
+ /**
35
+ * Searches for a single item
36
+ */
37
+ find(fn: (value: V, key: K, collection: this) => boolean): V | undefined;
38
+ /**
39
+ * Searches for the key of a single item
40
+ */
41
+ findKey(fn: (value: V, key: K, collection: this) => boolean): K | undefined;
42
+ /**
43
+ * Removes items that satisfy the provided filter function
44
+ */
45
+ sweep(fn: (value: V, key: K, collection: this) => boolean): number;
46
+ /**
47
+ * Reduces the collection to a single value
48
+ */
49
+ reduce<T>(fn: (accumulator: T, value: V, key: K, collection: this) => T, initialValue: T): T;
50
+ /**
51
+ * Identical to Array.forEach()
52
+ */
53
+ each(fn: (value: V, key: K, collection: this) => void): this;
54
+ /**
55
+ * Returns the first item(s) in the collection
56
+ */
57
+ first(): V | undefined;
58
+ first(amount: number): V[];
59
+ /**
60
+ * Returns the first key(s) in the collection
61
+ */
62
+ firstKey(): K | undefined;
63
+ firstKey(amount: number): K[];
64
+ /**
65
+ * Returns the last item(s) in the collection
66
+ */
67
+ last(): V | undefined;
68
+ last(amount: number): V[];
69
+ /**
70
+ * Returns the last key(s) in the collection
71
+ */
72
+ lastKey(): K | undefined;
73
+ lastKey(amount: number): K[];
74
+ /**
75
+ * Returns a random item from the collection
76
+ */
77
+ random(): V | undefined;
78
+ random(amount: number): V[];
79
+ /**
80
+ * Returns a random key from the collection
81
+ */
82
+ randomKey(): K | undefined;
83
+ randomKey(amount: number): K[];
84
+ /**
85
+ * Combines this collection with others
86
+ */
87
+ concat(...collections: Collection<K, V>[]): Collection<K, V>;
88
+ /**
89
+ * Checks if this collection shares identical items with another
90
+ */
91
+ equals(collection: Collection<K, V>): boolean;
92
+ /**
93
+ * Creates an identical shallow copy of this collection
94
+ */
95
+ clone(): Collection<K, V>;
96
+ /**
97
+ * Sorts the collection and returns it
98
+ */
99
+ sort(compareFunction?: (firstValue: V, secondValue: V, firstKey: K, secondKey: K) => number): this;
100
+ /**
101
+ * Sorts the collection by keys and returns it
102
+ */
103
+ sortByKey(compareFunction?: (firstKey: K, secondKey: K, firstValue: V, secondValue: V) => number): this;
104
+ /**
105
+ * Returns an array of items
106
+ */
107
+ toJSON(): V[];
108
+ /**
109
+ * Default sort function
110
+ */
111
+ private static defaultSort;
112
+ /**
113
+ * Creates a Collection from an array
114
+ */
115
+ static from<K, V>(entries: Iterable<readonly [K, V]>): Collection<K, V>;
116
+ }
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Collection = void 0;
4
+ /**
5
+ * A Map with additional utility methods
6
+ */
7
+ class Collection extends Map {
8
+ /**
9
+ * Identical to Map.get()
10
+ * Ensures the value exists
11
+ */
12
+ ensure(key, defaultValueGenerator) {
13
+ if (this.has(key))
14
+ return this.get(key);
15
+ const defaultValue = defaultValueGenerator(key, this);
16
+ this.set(key, defaultValue);
17
+ return defaultValue;
18
+ }
19
+ /**
20
+ * Checks if all items pass a test
21
+ */
22
+ every(fn) {
23
+ for (const [key, val] of this) {
24
+ if (!fn(val, key, this))
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ /**
30
+ * Checks if any item passes a test
31
+ */
32
+ some(fn) {
33
+ for (const [key, val] of this) {
34
+ if (fn(val, key, this))
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ /**
40
+ * Identical to Array.filter(), but returns a Collection
41
+ */
42
+ filter(fn) {
43
+ const results = new Collection();
44
+ for (const [key, val] of this) {
45
+ if (fn(val, key, this))
46
+ results.set(key, val);
47
+ }
48
+ return results;
49
+ }
50
+ /**
51
+ * Partitions the collection into two collections
52
+ */
53
+ partition(fn) {
54
+ const results = [new Collection(), new Collection()];
55
+ for (const [key, val] of this) {
56
+ if (fn(val, key, this)) {
57
+ results[0].set(key, val);
58
+ }
59
+ else {
60
+ results[1].set(key, val);
61
+ }
62
+ }
63
+ return results;
64
+ }
65
+ /**
66
+ * Maps each item to another value
67
+ */
68
+ map(fn) {
69
+ const results = [];
70
+ for (const [key, val] of this) {
71
+ results.push(fn(val, key, this));
72
+ }
73
+ return results;
74
+ }
75
+ /**
76
+ * Maps each item to another value into a Collection
77
+ */
78
+ mapValues(fn) {
79
+ const results = new Collection();
80
+ for (const [key, val] of this) {
81
+ results.set(key, fn(val, key, this));
82
+ }
83
+ return results;
84
+ }
85
+ /**
86
+ * Searches for a single item
87
+ */
88
+ find(fn) {
89
+ for (const [key, val] of this) {
90
+ if (fn(val, key, this))
91
+ return val;
92
+ }
93
+ return undefined;
94
+ }
95
+ /**
96
+ * Searches for the key of a single item
97
+ */
98
+ findKey(fn) {
99
+ for (const [key, val] of this) {
100
+ if (fn(val, key, this))
101
+ return key;
102
+ }
103
+ return undefined;
104
+ }
105
+ /**
106
+ * Removes items that satisfy the provided filter function
107
+ */
108
+ sweep(fn) {
109
+ const previousSize = this.size;
110
+ for (const [key, val] of this) {
111
+ if (fn(val, key, this))
112
+ this.delete(key);
113
+ }
114
+ return previousSize - this.size;
115
+ }
116
+ /**
117
+ * Reduces the collection to a single value
118
+ */
119
+ reduce(fn, initialValue) {
120
+ let accumulator = initialValue;
121
+ for (const [key, val] of this) {
122
+ accumulator = fn(accumulator, val, key, this);
123
+ }
124
+ return accumulator;
125
+ }
126
+ /**
127
+ * Identical to Array.forEach()
128
+ */
129
+ each(fn) {
130
+ for (const [key, val] of this) {
131
+ fn(val, key, this);
132
+ }
133
+ return this;
134
+ }
135
+ first(amount) {
136
+ if (amount === undefined)
137
+ return this.values().next().value;
138
+ if (amount < 0)
139
+ return this.last(amount * -1);
140
+ amount = Math.min(this.size, amount);
141
+ const iter = this.values();
142
+ return Array.from({ length: amount }, () => iter.next().value);
143
+ }
144
+ firstKey(amount) {
145
+ if (amount === undefined)
146
+ return this.keys().next().value;
147
+ if (amount < 0)
148
+ return this.lastKey(amount * -1);
149
+ amount = Math.min(this.size, amount);
150
+ const iter = this.keys();
151
+ return Array.from({ length: amount }, () => iter.next().value);
152
+ }
153
+ last(amount) {
154
+ const arr = [...this.values()];
155
+ if (amount === undefined)
156
+ return arr[arr.length - 1];
157
+ if (amount < 0)
158
+ return this.first(amount * -1);
159
+ if (!amount)
160
+ return [];
161
+ return arr.slice(-amount);
162
+ }
163
+ lastKey(amount) {
164
+ const arr = [...this.keys()];
165
+ if (amount === undefined)
166
+ return arr[arr.length - 1];
167
+ if (amount < 0)
168
+ return this.firstKey(amount * -1);
169
+ if (!amount)
170
+ return [];
171
+ return arr.slice(-amount);
172
+ }
173
+ random(amount) {
174
+ const arr = [...this.values()];
175
+ if (amount === undefined)
176
+ return arr[Math.floor(Math.random() * arr.length)];
177
+ if (!arr.length || !amount)
178
+ return [];
179
+ return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
180
+ }
181
+ randomKey(amount) {
182
+ const arr = [...this.keys()];
183
+ if (amount === undefined)
184
+ return arr[Math.floor(Math.random() * arr.length)];
185
+ if (!arr.length || !amount)
186
+ return [];
187
+ return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
188
+ }
189
+ /**
190
+ * Combines this collection with others
191
+ */
192
+ concat(...collections) {
193
+ const newColl = this.clone();
194
+ for (const coll of collections) {
195
+ for (const [key, val] of coll)
196
+ newColl.set(key, val);
197
+ }
198
+ return newColl;
199
+ }
200
+ /**
201
+ * Checks if this collection shares identical items with another
202
+ */
203
+ equals(collection) {
204
+ if (this === collection)
205
+ return true;
206
+ if (this.size !== collection.size)
207
+ return false;
208
+ for (const [key, value] of this) {
209
+ if (!collection.has(key) || value !== collection.get(key)) {
210
+ return false;
211
+ }
212
+ }
213
+ return true;
214
+ }
215
+ /**
216
+ * Creates an identical shallow copy of this collection
217
+ */
218
+ clone() {
219
+ return new Collection(this);
220
+ }
221
+ /**
222
+ * Sorts the collection and returns it
223
+ */
224
+ sort(compareFunction = Collection.defaultSort) {
225
+ const entries = [...this.entries()];
226
+ entries.sort((a, b) => compareFunction(a[1], b[1], a[0], b[0]));
227
+ this.clear();
228
+ for (const [k, v] of entries) {
229
+ this.set(k, v);
230
+ }
231
+ return this;
232
+ }
233
+ /**
234
+ * Sorts the collection by keys and returns it
235
+ */
236
+ sortByKey(compareFunction = Collection.defaultSort) {
237
+ const entries = [...this.entries()];
238
+ entries.sort((a, b) => compareFunction(a[0], b[0], a[1], b[1]));
239
+ this.clear();
240
+ for (const [k, v] of entries) {
241
+ this.set(k, v);
242
+ }
243
+ return this;
244
+ }
245
+ /**
246
+ * Returns an array of items
247
+ */
248
+ toJSON() {
249
+ return [...this.values()];
250
+ }
251
+ /**
252
+ * Default sort function
253
+ */
254
+ static defaultSort(firstValue, secondValue) {
255
+ return Number(firstValue > secondValue) || Number(firstValue === secondValue) - 1;
256
+ }
257
+ /**
258
+ * Creates a Collection from an array
259
+ */
260
+ static from(entries) {
261
+ return new Collection(entries);
262
+ }
263
+ }
264
+ exports.Collection = Collection;
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9Db2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsTUFBYSxVQUFpQixTQUFRLEdBQVM7SUFDN0M7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEdBQU0sRUFBRSxxQkFBc0Q7UUFDbkUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEVBQW1EO1FBQ3ZELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBQyxFQUFtRDtRQUN0RCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEVBQW1EO1FBQ3hELE1BQU0sT0FBTyxHQUFH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O1FBQzdCLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBT0QsTUFBTSxDQUFDLE1BQWU7UUFDcEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5SCxDQUFDO0lBT0QsU0FBUyxDQUFDLE1BQWU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksTUFBTSxLQUFLLFNB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QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQWEsRUFBRSxXQUFjO1FBQ3pELE9BQU8sTUFBTSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFPLE9BQWtDO1FBQ2xELE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBOVJELGdDQThSQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIE1hcCB3aXRoIGFkZGl0aW9uYWwgdXRpbGl0eSBtZXRob2RzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbjxLLCBWPiBleHRlbmRzIE1hcDxLLCBWPiB7XHJcbiAgLyoqXHJcbiAgICogSWRlbnRpY2FsIHRvIE1hcC5nZXQoKVxyXG4gICAqIEVuc3VyZXMgdGhlIHZhbHVlIGV4aXN0c1xyXG4gICAqL1xyXG4gIGVuc3VyZShrZXk6IEssIGRlZmF1bHRWYWx1ZUdlbmVyYXRvcjogKGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gVik6IFYge1xyXG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHJldHVybiB0aGlzLmdldChrZXkpITtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZUdlbmVyYXRvcihrZXksIHRoaXMpO1xyXG4gICAgdGhpcy5zZXQoa2V5LCBkZWZhdWx0VmFsdWUpO1xyXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhbGwgaXRlbXMgcGFzcyBhIHRlc3RcclxuICAgKi9cclxuICBldmVyeShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XHJcbiAgICAgIGlmICghZm4odmFsLCBrZXksIHRoaXMpKSByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhbnkgaXRlbSBwYXNzZXMgYSB0ZXN0XHJcbiAgICovXHJcbiAgc29tZShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XHJcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWRlbnRpY2FsIHRvIEFycmF5LmZpbHRlcigpLCBidXQgcmV0dXJucyBhIENvbGxlY3Rpb25cclxuICAgKi9cclxuICBmaWx0ZXIoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogQ29sbGVjdGlvbjxLLCBWPiB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IENvbGxlY3Rpb248SywgVj4oKTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XHJcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHJlc3VsdHMuc2V0KGtleSwgdmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFydGl0aW9ucyB0aGUgY29sbGVjdGlvbiBpbnRvIHR3byBjb2xsZWN0aW9uc1xyXG4gICAqL1xyXG4gIHBhcnRpdGlvbihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBbQ29sbGVjdGlvbjxLLCBWPiwgQ29sbGVjdGlvbjxLLCBWPl0ge1xyXG4gICAgY29uc3QgcmVzdWx0czogW0NvbGxlY3Rpb248SywgVj4sIENvbGxlY3Rpb248SywgVj5dID0gW25ldyBDb2xsZWN0aW9uPEssIFY+KCksIG5ldyBDb2xsZWN0aW9uPEssIFY+KCldO1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcclxuICAgICAgaWYgKGZuKHZhbCwga2V5LCB0aGlzKSkge1xyXG4gICAgICAgIHJlc3VsdHNbMF0uc2V0KGtleSwgdmFsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHRzWzFdLnNldChrZXksIHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBlYWNoIGl0ZW0gdG8gYW5vdGhlciB2YWx1ZVxyXG4gICAqL1xyXG4gIG1hcDxUPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IFQpOiBUW10ge1xyXG4gICAgY29uc3QgcmVzdWx0czogVFtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xyXG4gICAgICByZXN1bHRzLnB1c2goZm4odmFsLCBrZXksIHRoaXMpKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBlYWNoIGl0ZW0gdG8gYW5vdGhlciB2YWx1ZSBpbnRvIGEgQ29sbGVjdGlvblxyXG4gICAqL1xyXG4gIG1hcFZhbHVlczxUPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IFQpOiBDb2xsZWN0aW9uPEssIFQ+IHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQ29sbGVjdGlvbjxLLCBUPigpO1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcclxuICAgICAgcmVzdWx0cy5zZXQoa2V5LCBmbih2YWwsIGtleSwgdGhpcykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWFyY2hlcyBmb3IgYSBzaW5nbGUgaXRlbVxyXG4gICAqL1xyXG4gIGZpbmQoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogViB8IHVuZGVmaW5lZCB7XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xyXG4gICAgICBpZiAoZm4odmFsLCBrZXksIHRoaXMpKSByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlYXJjaGVzIGZvciB0aGUga2V5IG9mIGEgc2luZ2xlIGl0ZW1cclxuICAgKi9cclxuICBmaW5kS2V5KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbik6IEsgfCB1bmRlZmluZWQge1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcclxuICAgICAgaWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGl0ZW1zIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgZmlsdGVyIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgc3dlZXAoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHByZXZpb3VzU2l6ZSA9IHRoaXMuc2l6ZTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XHJcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHRoaXMuZGVsZXRlKGtleSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJldmlvdXNTaXplIC0gdGhpcy5zaXplO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVkdWNlcyB0aGUgY29sbGVjdGlvbiB0byBhIHNpbmdsZSB2YWx1ZVxyXG4gICAqL1xyXG4gIHJlZHVjZTxUPihmbjogKGFjY3VtdWxhdG9yOiBULCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBULCBpbml0aWFsVmFsdWU6IFQpOiBUIHtcclxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XHJcbiAgICAgIGFjY3VtdWxhdG9yID0gZm4oYWNjdW11bGF0b3IsIHZhbCwga2V5LCB0aGlzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElkZW50aWNhbCB0byBBcnJheS5mb3JFYWNoKClcclxuICAgKi9cclxuICBlYWNoKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gdm9pZCk6IHRoaXMge1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcclxuICAgICAgZm4odmFsLCBrZXksIHRoaXMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtKHMpIGluIHRoZSBjb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgZmlyc3QoKTogViB8IHVuZGVmaW5lZDtcclxuICBmaXJzdChhbW91bnQ6IG51bWJlcik6IFZbXTtcclxuICBmaXJzdChhbW91bnQ/OiBudW1iZXIpOiBWIHwgVltdIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgaWYgKGFtb3VudCA8IDApIHJldHVybiB0aGlzLmxhc3QoYW1vdW50ICogLTEpO1xyXG4gICAgYW1vdW50ID0gTWF0aC5taW4odGhpcy5zaXplLCBhbW91bnQpO1xyXG4gICAgY29uc3QgaXRlciA9IHRoaXMudmFsdWVzKCk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogYW1vdW50IH0sICgpID0+IGl0ZXIubmV4dCgpLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IGtleShzKSBpbiB0aGUgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIGZpcnN0S2V5KCk6IEsgfCB1bmRlZmluZWQ7XHJcbiAgZmlyc3RLZXkoYW1vdW50OiBudW1iZXIpOiBLW107XHJcbiAgZmlyc3RLZXkoYW1vdW50PzogbnVtYmVyKTogSyB8IEtbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmtleXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICBpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMubGFzdEtleShhbW91bnQgKiAtMSk7XHJcbiAgICBhbW91bnQgPSBNYXRoLm1pbih0aGlzLnNpemUsIGFtb3VudCk7XHJcbiAgICBjb25zdCBpdGVyID0gdGhpcy5rZXlzKCk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogYW1vdW50IH0sICgpID0+IGl0ZXIubmV4dCgpLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxhc3QgaXRlbShzKSBpbiB0aGUgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIGxhc3QoKTogViB8IHVuZGVmaW5lZDtcclxuICBsYXN0KGFtb3VudDogbnVtYmVyKTogVltdO1xyXG4gIGxhc3QoYW1vdW50PzogbnVtYmVyKTogViB8IFZbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBhcnIgPSBbLi4udGhpcy52YWx1ZXMoKV07XHJcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xyXG4gICAgaWYgKGFtb3VudCA8IDApIHJldHVybiB0aGlzLmZpcnN0KGFtb3VudCAqIC0xKTtcclxuICAgIGlmICghYW1vdW50KSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gYXJyLnNsaWNlKC1hbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGFzdCBrZXkocykgaW4gdGhlIGNvbGxlY3Rpb25cclxuICAgKi9cclxuICBsYXN0S2V5KCk6IEsgfCB1bmRlZmluZWQ7XHJcbiAgbGFzdEtleShhbW91bnQ6IG51bWJlcik6IEtbXTtcclxuICBsYXN0S2V5KGFtb3VudD86IG51bWJlcik6IEsgfCBLW10gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgYXJyID0gWy4uLnRoaXMua2V5cygpXTtcclxuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMuZmlyc3RLZXkoYW1vdW50ICogLTEpO1xyXG4gICAgaWYgKCFhbW91bnQpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBhcnIuc2xpY2UoLWFtb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgcmFuZG9tIGl0ZW0gZnJvbSB0aGUgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIHJhbmRvbSgpOiBWIHwgdW5kZWZpbmVkO1xyXG4gIHJhbmRvbShhbW91bnQ6IG51bWJlcik6IFZbXTtcclxuICByYW5kb20oYW1vdW50PzogbnVtYmVyKTogViB8IFZbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBhcnIgPSBbLi4udGhpcy52YWx1ZXMoKV07XHJcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiBhcnJbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCldO1xyXG4gICAgaWYgKCFhcnIubGVuZ3RoIHx8ICFhbW91bnQpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihhbW91bnQsIGFyci5sZW5ndGgpIH0sICgpID0+IGFyci5zcGxpY2UoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCksIDEpWzBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSByYW5kb20ga2V5IGZyb20gdGhlIGNvbGxlY3Rpb25cclxuICAgKi9cclxuICByYW5kb21LZXkoKTogSyB8IHVuZGVmaW5lZDtcclxuICByYW5kb21LZXkoYW1vdW50OiBudW1iZXIpOiBLW107XHJcbiAgcmFuZG9tS2V5KGFtb3VudD86IG51bWJlcik6IEsgfCBLW10gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgYXJyID0gWy4uLnRoaXMua2V5cygpXTtcclxuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFycltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKV07XHJcbiAgICBpZiAoIWFyci5sZW5ndGggfHwgIWFtb3VudCkgcmV0dXJuIFtdO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWluKGFtb3VudCwgYXJyLmxlbmd0aCkgfSwgKCkgPT4gYXJyLnNwbGljZShNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKSwgMSlbMF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tYmluZXMgdGhpcyBjb2xsZWN0aW9uIHdpdGggb3RoZXJzXHJcbiAgICovXHJcbiAgY29uY2F0KC4uLmNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uPEssIFY+W10pOiBDb2xsZWN0aW9uPEssIFY+IHtcclxuICAgIGNvbnN0IG5ld0NvbGwgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBmb3IgKGNvbnN0IGNvbGwgb2YgY29sbGVjdGlvbnMpIHtcclxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGNvbGwpIG5ld0NvbGwuc2V0KGtleSwgdmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdDb2xsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoaXMgY29sbGVjdGlvbiBzaGFyZXMgaWRlbnRpY2FsIGl0ZW1zIHdpdGggYW5vdGhlclxyXG4gICAqL1xyXG4gIGVxdWFscyhjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPEssIFY+KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcyA9PT0gY29sbGVjdGlvbikgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAodGhpcy5zaXplICE9PSBjb2xsZWN0aW9uLnNpemUpIHJldHVybiBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcclxuICAgICAgaWYgKCFjb2xsZWN0aW9uLmhhcyhrZXkpIHx8IHZhbHVlICE9PSBjb2xsZWN0aW9uLmdldChrZXkpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW4gaWRlbnRpY2FsIHNoYWxsb3cgY29weSBvZiB0aGlzIGNvbGxlY3Rpb25cclxuICAgKi9cclxuICBjbG9uZSgpOiBDb2xsZWN0aW9uPEssIFY+IHtcclxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcnRzIHRoZSBjb2xsZWN0aW9uIGFuZCByZXR1cm5zIGl0XHJcbiAgICovXHJcbiAgc29ydChjb21wYXJlRnVuY3Rpb246IChmaXJzdFZhbHVlOiBWLCBzZWNvbmRWYWx1ZTogViwgZmlyc3RLZXk6IEssIHNlY29uZEtleTogSykgPT4gbnVtYmVyID0gQ29sbGVjdGlvbi5kZWZhdWx0U29ydCk6IHRoaXMge1xyXG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMoKV07XHJcbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVGdW5jdGlvbihhWzFdLCBiWzFdLCBhWzBdLCBiWzBdKSk7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBlbnRyaWVzKSB7XHJcbiAgICAgIHRoaXMuc2V0KGssIHYpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTb3J0cyB0aGUgY29sbGVjdGlvbiBieSBrZXlzIGFuZCByZXR1cm5zIGl0XHJcbiAgICovXHJcbiAgc29ydEJ5S2V5KGNvbXBhcmVGdW5jdGlvbjogKGZpcnN0S2V5OiBLLCBzZWNvbmRLZXk6IEssIGZpcnN0VmFsdWU6IFYsIHNlY29uZFZhbHVlOiBWKSA9PiBudW1iZXIgPSBDb2xsZWN0aW9uLmRlZmF1bHRTb3J0KTogdGhpcyB7XHJcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcygpXTtcclxuICAgIGVudHJpZXMuc29ydCgoYSwgYikgPT4gY29tcGFyZUZ1bmN0aW9uKGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0pKTtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIGVudHJpZXMpIHtcclxuICAgICAgdGhpcy5zZXQoaywgdik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgaXRlbXNcclxuICAgKi9cclxuICB0b0pTT04oKTogVltdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZXMoKV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IHNvcnQgZnVuY3Rpb25cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0U29ydDxWPihmaXJzdFZhbHVlOiBWLCBzZWNvbmRWYWx1ZTogVik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTnVtYmVyKGZpcnN0VmFsdWUgPiBzZWNvbmRWYWx1ZSkgfHwgTnVtYmVyKGZpcnN0VmFsdWUgPT09IHNlY29uZFZhbHVlKSAtIDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgQ29sbGVjdGlvbiBmcm9tIGFuIGFycmF5XHJcbiAgICovXHJcbiAgc3RhdGljIGZyb208SywgVj4oZW50cmllczogSXRlcmFibGU8cmVhZG9ubHkgW0ssIFZdPik6IENvbGxlY3Rpb248SywgVj4ge1xyXG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGVudHJpZXMpO1xyXG4gIH1cclxufVxyXG4iXX0=