@jsprismarine/prismarine 0.2.0 → 0.3.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 (174) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/Console.cjs.js +2 -2
  3. package/dist/Console.d.ts +1 -1
  4. package/dist/Console.d.ts.map +1 -1
  5. package/dist/Console.es.js +2 -2
  6. package/dist/Player.cjs.js +1 -1
  7. package/dist/Player.es.js +1 -1
  8. package/dist/{Protocol-C1DcF_Iw.cjs → Protocol-BVaFul30.cjs} +2 -2
  9. package/dist/{Protocol-9T3wX43U.js → Protocol-D9dzQTbF.js} +2 -2
  10. package/dist/Server-DAXmO2Rm.js +1864 -0
  11. package/dist/Server-nY-WO-m_.cjs +1886 -0
  12. package/dist/Server.cjs.js +1 -1
  13. package/dist/Server.d.ts.map +1 -1
  14. package/dist/Server.es.js +1 -1
  15. package/dist/block/Block.cjs.js +2 -2
  16. package/dist/block/Block.es.js +2 -2
  17. package/dist/block/blocks/Bookshelf.d.ts +1 -1
  18. package/dist/block/blocks/CoalOre.d.ts +1 -1
  19. package/dist/block/blocks/Gravel.d.ts +1 -1
  20. package/dist/block/blocks/WhiteBed.d.ts +1 -1
  21. package/dist/chat/ChatManager.cjs.js +1 -1
  22. package/dist/chat/ChatManager.d.ts.map +1 -1
  23. package/dist/chat/ChatManager.es.js +1 -1
  24. package/dist/command/Command.cjs.js +2 -2
  25. package/dist/command/Command.es.js +2 -2
  26. package/dist/command/CommandArguments.cjs.js +1 -1
  27. package/dist/command/CommandArguments.es.js +1 -1
  28. package/dist/command/CommandManager.cjs.js +2 -2
  29. package/dist/command/CommandManager.es.js +2 -2
  30. package/dist/command/Commands.cjs.js +1 -1
  31. package/dist/command/Commands.es.js +1 -1
  32. package/dist/command/index.cjs.js +1 -1
  33. package/dist/command/index.es.js +1 -1
  34. package/dist/command/vanilla/BanCommand.cjs.js +1 -1
  35. package/dist/command/vanilla/BanCommand.es.js +1 -1
  36. package/dist/command/vanilla/DeopCommand.cjs.js +1 -1
  37. package/dist/command/vanilla/DeopCommand.es.js +1 -1
  38. package/dist/command/vanilla/ExecuteCommand.cjs.js +1 -1
  39. package/dist/command/vanilla/ExecuteCommand.es.js +1 -1
  40. package/dist/command/vanilla/GamemodeCommand.cjs.js +1 -1
  41. package/dist/command/vanilla/GamemodeCommand.es.js +1 -1
  42. package/dist/command/vanilla/KickCommand.cjs.js +1 -1
  43. package/dist/command/vanilla/KickCommand.es.js +1 -1
  44. package/dist/command/vanilla/OpCommand.cjs.js +1 -1
  45. package/dist/command/vanilla/OpCommand.es.js +1 -1
  46. package/dist/command/vanilla/PardonCommand.cjs.js +1 -1
  47. package/dist/command/vanilla/PardonCommand.es.js +1 -1
  48. package/dist/command/vanilla/SummonCommand.cjs.js +1 -1
  49. package/dist/command/vanilla/SummonCommand.es.js +1 -1
  50. package/dist/command/vanilla/TpCommand.cjs.js +1 -1
  51. package/dist/command/vanilla/TpCommand.es.js +1 -1
  52. package/dist/config/ConfigBuilder.cjs.js +12 -4
  53. package/dist/config/ConfigBuilder.d.ts.map +1 -1
  54. package/dist/config/ConfigBuilder.es.js +12 -4
  55. package/dist/entity/Attribute.cjs.js +1 -1
  56. package/dist/entity/Attribute.d.ts.map +1 -1
  57. package/dist/entity/Attribute.es.js +1 -1
  58. package/dist/entity/Entity.cjs.js +4 -3
  59. package/dist/entity/Entity.d.ts.map +1 -1
  60. package/dist/entity/Entity.es.js +4 -3
  61. package/dist/entity/Metadata.cjs.js +1 -1
  62. package/dist/entity/Metadata.d.ts.map +1 -1
  63. package/dist/entity/Metadata.es.js +1 -1
  64. package/dist/events/EventManager.cjs.js +1 -1
  65. package/dist/events/EventManager.d.ts.map +1 -1
  66. package/dist/events/EventManager.es.js +1 -1
  67. package/dist/form/Form.cjs.js +2 -2
  68. package/dist/form/Form.d.ts +1 -1
  69. package/dist/form/Form.d.ts.map +1 -1
  70. package/dist/form/Form.es.js +2 -2
  71. package/dist/form/FormManager.cjs.js +1 -1
  72. package/dist/form/FormManager.d.ts.map +1 -1
  73. package/dist/form/FormManager.es.js +1 -1
  74. package/dist/form/IForm.d.ts.map +1 -1
  75. package/dist/form/ModalForm.cjs.js +1 -1
  76. package/dist/form/ModalForm.d.ts.map +1 -1
  77. package/dist/form/ModalForm.es.js +1 -1
  78. package/dist/{index-D7ZMTxc2.cjs → index-CVGv9HUF.cjs} +2 -2
  79. package/dist/{index-B3UWpR-P.js → index-O6jPg9jt.js} +2 -2
  80. package/dist/index.cjs.js +3 -3
  81. package/dist/index.es.js +3 -3
  82. package/dist/inventory/HumanInventory.cjs.js +1 -1
  83. package/dist/inventory/HumanInventory.d.ts.map +1 -1
  84. package/dist/inventory/HumanInventory.es.js +1 -1
  85. package/dist/inventory/Inventory.cjs.js +1 -1
  86. package/dist/inventory/Inventory.d.ts.map +1 -1
  87. package/dist/inventory/Inventory.es.js +1 -1
  88. package/dist/inventory/WindowManager.cjs.js +1 -1
  89. package/dist/inventory/WindowManager.d.ts.map +1 -1
  90. package/dist/inventory/WindowManager.es.js +1 -1
  91. package/dist/item/Armor.cjs.js +1 -1
  92. package/dist/item/Armor.d.ts +1 -1
  93. package/dist/item/Armor.d.ts.map +1 -1
  94. package/dist/item/Armor.es.js +1 -1
  95. package/dist/item/Item.cjs.js +2 -2
  96. package/dist/item/Item.es.js +2 -2
  97. package/dist/item/ItemManager.cjs.js +2 -2
  98. package/dist/item/ItemManager.d.ts +2 -2
  99. package/dist/item/ItemManager.d.ts.map +1 -1
  100. package/dist/item/ItemManager.es.js +2 -2
  101. package/dist/item/TieredTool.cjs.js +1 -1
  102. package/dist/item/TieredTool.d.ts.map +1 -1
  103. package/dist/item/TieredTool.es.js +1 -1
  104. package/dist/item/Tool.cjs.js +1 -1
  105. package/dist/item/Tool.d.ts +1 -1
  106. package/dist/item/Tool.d.ts.map +1 -1
  107. package/dist/item/Tool.es.js +1 -1
  108. package/dist/network/ClientConnection.cjs.js +1 -1
  109. package/dist/network/ClientConnection.d.ts +1 -1
  110. package/dist/network/ClientConnection.d.ts.map +1 -1
  111. package/dist/network/ClientConnection.es.js +1 -1
  112. package/dist/network/Handlers.cjs.js +1 -1
  113. package/dist/network/Handlers.es.js +1 -1
  114. package/dist/network/MinecraftSession.cjs.js +1 -1
  115. package/dist/network/MinecraftSession.d.ts +1 -1
  116. package/dist/network/MinecraftSession.d.ts.map +1 -1
  117. package/dist/network/MinecraftSession.es.js +1 -1
  118. package/dist/network/NetworkUtil.cjs.js +1 -1
  119. package/dist/network/NetworkUtil.d.ts.map +1 -1
  120. package/dist/network/NetworkUtil.es.js +1 -1
  121. package/dist/network/PacketRegistry.cjs.js +1 -1
  122. package/dist/network/PacketRegistry.d.ts +6 -6
  123. package/dist/network/PacketRegistry.d.ts.map +1 -1
  124. package/dist/network/PacketRegistry.es.js +1 -1
  125. package/dist/network/PlayerSession.cjs.js +1 -1
  126. package/dist/network/PlayerSession.d.ts.map +1 -1
  127. package/dist/network/PlayerSession.es.js +1 -1
  128. package/dist/network/Protocol.cjs.js +1 -1
  129. package/dist/network/Protocol.es.js +1 -1
  130. package/dist/network/handler/LoginHandler.cjs.js +1 -1
  131. package/dist/network/handler/LoginHandler.es.js +1 -1
  132. package/dist/permission/PermissionManager.cjs.js +4 -4
  133. package/dist/permission/PermissionManager.d.ts +1 -1
  134. package/dist/permission/PermissionManager.d.ts.map +1 -1
  135. package/dist/permission/PermissionManager.es.js +4 -4
  136. package/dist/plugin/PluginFile.cjs.js +1 -1
  137. package/dist/plugin/PluginFile.d.ts.map +1 -1
  138. package/dist/plugin/PluginFile.es.js +1 -1
  139. package/dist/plugin/PluginManager.cjs.js +5 -4
  140. package/dist/plugin/PluginManager.d.ts +2 -2
  141. package/dist/plugin/PluginManager.d.ts.map +1 -1
  142. package/dist/plugin/PluginManager.es.js +5 -4
  143. package/dist/query/QueryManager.cjs.js +1 -1
  144. package/dist/query/QueryManager.es.js +1 -1
  145. package/dist/utils/Logger.cjs.js +49 -38
  146. package/dist/utils/Logger.d.ts +4 -1
  147. package/dist/utils/Logger.d.ts.map +1 -1
  148. package/dist/utils/Logger.es.js +49 -38
  149. package/dist/utils/ParseTildeCaretNotation.cjs.js +1 -1
  150. package/dist/utils/ParseTildeCaretNotation.d.ts.map +1 -1
  151. package/dist/utils/ParseTildeCaretNotation.es.js +1 -1
  152. package/dist/utils/Timer.cjs.js +1 -1
  153. package/dist/utils/Timer.d.ts.map +1 -1
  154. package/dist/utils/Timer.es.js +1 -1
  155. package/dist/utils/UUID.cjs.js +2 -2
  156. package/dist/utils/UUID.es.js +2 -2
  157. package/dist/world/BaseGenerator.cjs.js +1 -1
  158. package/dist/world/BaseGenerator.d.ts.map +1 -1
  159. package/dist/world/BaseGenerator.es.js +1 -1
  160. package/dist/world/BlockPosition.cjs.js +1 -1
  161. package/dist/world/BlockPosition.d.ts.map +1 -1
  162. package/dist/world/BlockPosition.es.js +1 -1
  163. package/dist/world/GameruleManager.cjs.js +4 -4
  164. package/dist/world/GameruleManager.d.ts +3 -3
  165. package/dist/world/GameruleManager.d.ts.map +1 -1
  166. package/dist/world/GameruleManager.es.js +4 -4
  167. package/dist/world/Generator.d.ts.map +1 -1
  168. package/dist/world/WorldManager.cjs.js +3 -7
  169. package/dist/world/WorldManager.d.ts +1 -1
  170. package/dist/world/WorldManager.d.ts.map +1 -1
  171. package/dist/world/WorldManager.es.js +3 -7
  172. package/package.json +5 -5
  173. package/dist/Server-AfmPsq74.cjs +0 -1884
  174. package/dist/Server-Dyy9OCM8.js +0 -1862
@@ -0,0 +1,1864 @@
1
+ import { RakNetListener } from '@jsprismarine/raknet';
2
+ import Chat, { ChatType } from './chat/Chat.es.js';
3
+ import BanManager from './ban/BanManager.es.js';
4
+ import BatchPacket from './network/packet/BatchPacket.es.js';
5
+ import BlockManager from './block/BlockManager.es.js';
6
+ import { BlockMappings } from './block/BlockMappings.es.js';
7
+ import ChatEvent from './events/chat/ChatEvent.es.js';
8
+ import ChatManager from './chat/ChatManager.es.js';
9
+ import { E as Entities } from './Entities-BTndRlb_.js';
10
+ import { Suggestions } from '@jsprismarine/brigadier';
11
+ import CommandParameter, { CommandParameterFlags, CommandParameterType } from './network/type/CommandParameter.es.js';
12
+ import CommandEnum from './network/type/CommandEnum.es.js';
13
+ import Gamemode from './world/Gamemode.es.js';
14
+ import ParseTargetSelector from './utils/ParseTargetSelector.es.js';
15
+ import ParseTildeCaretNotation from './utils/ParseTildeCaretNotation.es.js';
16
+ import CommandManager from './command/CommandManager.es.js';
17
+ import Console from './Console.es.js';
18
+ import { EventManager } from './events/EventManager.es.js';
19
+ import Identifiers from './network/Identifiers.es.js';
20
+ import ItemManager from './item/ItemManager.es.js';
21
+ import AnimateHandler from './network/handler/AnimateHandler.es.js';
22
+ import ClientCacheStatusHandler from './network/handler/ClientCacheStatusHandler.es.js';
23
+ import CommandRequestHandler from './network/handler/CommandRequestHandler.es.js';
24
+ import ContainerCloseHandler from './network/handler/ContainerCloseHandler.es.js';
25
+ import EmoteListHandler from './network/handler/EmoteListHandler.es.js';
26
+ import InteractHandler from './network/handler/InteractHandler.es.js';
27
+ import InventoryTransactionHandler from './network/handler/InventoryTransactionHandler.es.js';
28
+ import LevelSoundEventHandler from './network/handler/LevelSoundEventHandler.es.js';
29
+ import PlayStatusPacket from './network/packet/PlayStatusPacket.es.js';
30
+ import ResourcePacksInfoPacket from './network/packet/ResourcePacksInfoPacket.es.js';
31
+ import PlayStatusType from './network/type/PlayStatusType.es.js';
32
+ import ChangeDimensionPacket from './network/packet/ChangeDimensionPacket.es.js';
33
+ import LevelChunkPacket from './network/packet/LevelChunkPacket.es.js';
34
+ import { MetadataFlag, FlagType } from './entity/Metadata.es.js';
35
+ import ContainerEntry from './inventory/ContainerEntry.es.js';
36
+ import CoordinateUtils from './world/CoordinateUtils.es.js';
37
+ import FormManager from './form/FormManager.es.js';
38
+ import Human from './entity/Human.es.js';
39
+ import MovementType from './network/type/MovementType.es.js';
40
+ import PlayerSetGamemodeEvent from './events/player/PlayerSetGamemodeEvent.es.js';
41
+ import PlayerToggleFlightEvent from './events/player/PlayerToggleFlightEvent.es.js';
42
+ import PlayerToggleSprintEvent from './events/player/PlayerToggleSprintEvent.es.js';
43
+ import TextType from './network/type/TextType.es.js';
44
+ import Timer from './utils/Timer.es.js';
45
+ import Vector3 from './math/Vector3.es.js';
46
+ import WindowManager, { WindowIds } from './inventory/WindowManager.es.js';
47
+ import MobEquipmentHandler from './network/handler/MobEquipmentHandler.es.js';
48
+ import ModalFormResponseHandler from './network/handler/ModalFormResponseHandler.es.js';
49
+ import MovePlayerHandler from './network/handler/MovePlayerHandler.es.js';
50
+ import PacketViolationWarningHandler from './network/handler/PacketViolationWarningHandler.es.js';
51
+ import PlayerActionHandler from './network/handler/PlayerActionHandler.es.js';
52
+ import RequestChunkRadiusHandler from './network/handler/RequestChunkRadiusHandler.es.js';
53
+ import ResourcePackResponseHandler from './network/handler/ResourcePackResponseHandler.es.js';
54
+ import ServerSettingsRequestHandler from './network/handler/ServerSettingsRequestHandler.es.js';
55
+ import SetDefaultGameTypeHandler from './network/handler/SetDefaultGameTypeHandler.es.js';
56
+ import SetLocalPlayerAsInitializedHandler from './network/handler/SetLocalPlayerAsInitializedHandler.es.js';
57
+ import SetPlayerGameTypeHandler from './network/handler/SetPlayerGameTypeHandler.es.js';
58
+ import TextHandler from './network/handler/TextHandler.es.js';
59
+ import TickSyncHandler from './network/handler/TickSyncHandler.es.js';
60
+ import RequestNetworkSettingsHandler from './network/handler/RequestNetworkSettingsHandler.es.js';
61
+ import { P as Packets } from './Packets-CmLdpaty.js';
62
+ import PermissionManager from './permission/PermissionManager.es.js';
63
+ import PluginManager from './plugin/PluginManager.es.js';
64
+ import QueryManager from './query/QueryManager.es.js';
65
+ import RaknetConnectEvent from './events/raknet/RaknetConnectEvent.es.js';
66
+ import RaknetDisconnectEvent from './events/raknet/RaknetDisconnectEvent.es.js';
67
+ import RaknetEncapsulatedPacketEvent from './events/raknet/RaknetEncapsulatedPacketEvent.es.js';
68
+ import SessionManager from './SessionManager.es.js';
69
+ import TickEvent from './events/other/TickEvent.es.js';
70
+ import WorldManager from './world/WorldManager.es.js';
71
+ import NetworkChunkPublisherUpdatePacket from './network/packet/NetworkChunkPublisherUpdatePacket.es.js';
72
+ import PlayerListPacket, { PlayerListAction, PlayerListEntry } from './network/packet/PlayerListPacket.es.js';
73
+ import UpdateAbilitiesPacket, { AbilityLayerType, AbilityLayerFlag, AbilityLayer } from './network/packet/UpdateAbilitiesPacket.es.js';
74
+ import AddPlayerPacket from './network/packet/AddPlayerPacket.es.js';
75
+ import AvailableCommandsPacket from './network/packet/AvailableCommandsPacket.es.js';
76
+ import UpdateAdventureSettingsPacket from './network/packet/UpdateAdventureSettingsPacket.es.js';
77
+ import ChunkRadiusUpdatedPacket from './network/packet/ChunkRadiusUpdatedPacket.es.js';
78
+ import CreativeContentPacket from './network/packet/CreativeContentPacket.es.js';
79
+ import DisconnectPacket from './network/packet/DisconnectPacket.es.js';
80
+ import InventoryContentPacket from './network/packet/InventoryContentPacket.es.js';
81
+ import MobEquipmentPacket from './network/packet/MobEquipmentPacket.es.js';
82
+ import ModalFormRequestPacket from './network/packet/ModalFormRequestPacket.es.js';
83
+ import MovePlayerPacket from './network/packet/MovePlayerPacket.es.js';
84
+ import RemoveActorPacket from './network/packet/RemoveActorPacket.es.js';
85
+ import SetActorDataPacket from './network/packet/SetActorDataPacket.es.js';
86
+ import SetPlayerGameTypePacket from './network/packet/SetPlayerGameTypePacket.es.js';
87
+ import SetTimePacket from './network/packet/SetTimePacket.es.js';
88
+ import TextPacket from './network/packet/TextPacket.es.js';
89
+ import UpdateAttributesPacket from './network/packet/UpdateAttributesPacket.es.js';
90
+ import ToastRequestPacket from './network/packet/ToastRequestPacket.es.js';
91
+ import BlockPosition from './world/BlockPosition.es.js';
92
+ import Chunk from './world/chunk/Chunk.es.js';
93
+ import CommandData from './network/type/CommandData.es.js';
94
+ import Heap from 'heap';
95
+ import Item from './item/Item.es.js';
96
+ import PermissionType from './network/type/PermissionType.es.js';
97
+ import PlayerPermissionType from './network/type/PlayerPermissionType.es.js';
98
+ import UUID from './utils/UUID.es.js';
99
+ import { creativeitems } from '@jsprismarine/bedrock-data';
100
+ import MinecraftSession from './network/MinecraftSession.es.js';
101
+ import assert from 'assert';
102
+
103
+ class CommandArgument {
104
+ getReadableType() {
105
+ return "";
106
+ }
107
+ getParameters() {
108
+ return /* @__PURE__ */ new Set();
109
+ }
110
+ }
111
+ class CommandArgumentGamemode {
112
+ name;
113
+ optional;
114
+ flags;
115
+ postfix;
116
+ constructor(data) {
117
+ this.name = data?.name ?? "gameMode";
118
+ this.optional = data?.optional ?? false;
119
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
120
+ this.postfix = data?.postfix ?? null;
121
+ }
122
+ parse(reader, _context) {
123
+ const gm = reader.readString();
124
+ Gamemode.getGamemodeId(gm);
125
+ return gm;
126
+ }
127
+ async listSuggestions(_context, _builder) {
128
+ return Suggestions.empty();
129
+ }
130
+ getExamples() {
131
+ return ["survival", "creative", "adventure", "spectator"];
132
+ }
133
+ getReadableType() {
134
+ return this.name;
135
+ }
136
+ getParameters() {
137
+ const gameModeEnum = new CommandEnum();
138
+ gameModeEnum.enumName = "GameMode";
139
+ gameModeEnum.enumValues = ["survival", "creative", "adventure", "spectator"];
140
+ return /* @__PURE__ */ new Set([
141
+ new CommandParameter({
142
+ paramName: this.name,
143
+ isOptional: this.optional,
144
+ flags: this.flags,
145
+ enum: gameModeEnum,
146
+ postfix: this.postfix
147
+ })
148
+ ]);
149
+ }
150
+ }
151
+ class CommandArgumentMob {
152
+ name;
153
+ optional;
154
+ flags;
155
+ postfix;
156
+ constructor(data) {
157
+ this.name = data?.name ?? "entityType";
158
+ this.optional = data?.optional ?? false;
159
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
160
+ this.postfix = data?.postfix ?? null;
161
+ }
162
+ parse(reader, _context) {
163
+ let str = "";
164
+ while (true) {
165
+ if (!reader.canRead())
166
+ break;
167
+ const pos = reader.getCursor();
168
+ const char = reader.read();
169
+ if (char === " ") {
170
+ reader.setCursor(pos);
171
+ break;
172
+ }
173
+ str += char;
174
+ }
175
+ return str;
176
+ }
177
+ async listSuggestions(_context, _builder) {
178
+ return Suggestions.empty();
179
+ }
180
+ getExamples() {
181
+ return [];
182
+ }
183
+ getReadableType() {
184
+ return this.name;
185
+ }
186
+ getParameters() {
187
+ const entityTypeEnum = new CommandEnum();
188
+ entityTypeEnum.enumName = "EntityType";
189
+ entityTypeEnum.enumValues = Object.entries(Entities).map(([, entity]) => entity.MOB_ID);
190
+ return /* @__PURE__ */ new Set([
191
+ new CommandParameter({
192
+ paramName: this.name,
193
+ isOptional: this.optional,
194
+ flags: this.flags,
195
+ enum: entityTypeEnum,
196
+ postfix: this.postfix
197
+ })
198
+ ]);
199
+ }
200
+ }
201
+ class CommandArgumentEntity {
202
+ name;
203
+ optional;
204
+ flags;
205
+ postfix;
206
+ constructor(data) {
207
+ this.name = data?.name ?? "target";
208
+ this.optional = data?.optional ?? false;
209
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
210
+ this.postfix = data?.postfix ?? null;
211
+ }
212
+ parse(reader, context) {
213
+ let player = "";
214
+ while (true) {
215
+ if (!reader.canRead())
216
+ break;
217
+ const pos = reader.getCursor();
218
+ const char = reader.read();
219
+ if (char === " ") {
220
+ reader.setCursor(pos);
221
+ break;
222
+ }
223
+ player += char;
224
+ }
225
+ if (player.startsWith("@"))
226
+ try {
227
+ return ParseTargetSelector({
228
+ input: player,
229
+ source: context.getSource(),
230
+ entities: context.getSource().getWorld().getEntities()
231
+ });
232
+ } catch (error) {
233
+ if (!error.message.includes("no results"))
234
+ throw error;
235
+ return [];
236
+ }
237
+ return [context.getSource().getServer().getSessionManager().getPlayerByExactName(player)];
238
+ }
239
+ getReadableType() {
240
+ return this.name;
241
+ }
242
+ getParameters() {
243
+ return /* @__PURE__ */ new Set([
244
+ new CommandParameter({
245
+ paramName: this.name,
246
+ paramType: CommandParameterType.Target,
247
+ isOptional: this.optional,
248
+ flags: this.flags,
249
+ postfix: this.postfix
250
+ })
251
+ ]);
252
+ }
253
+ }
254
+ class CommandArgumentPosition extends Vector3 {
255
+ name;
256
+ optional;
257
+ flags;
258
+ postfix;
259
+ constructor(data) {
260
+ super();
261
+ this.name = data?.name ?? "position";
262
+ this.optional = data?.optional ?? false;
263
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
264
+ this.postfix = data?.postfix ?? null;
265
+ }
266
+ parse(reader, context) {
267
+ const getPos = () => {
268
+ let pos = "";
269
+ while (true) {
270
+ if (!reader.canRead())
271
+ break;
272
+ const cursor = reader.getCursor();
273
+ const char = reader.read();
274
+ if (char === " ") {
275
+ reader.setCursor(cursor);
276
+ break;
277
+ }
278
+ pos += char;
279
+ }
280
+ return pos;
281
+ };
282
+ this.setX(
283
+ ParseTildeCaretNotation({
284
+ input: getPos(),
285
+ source: context.getSource(),
286
+ type: "x"
287
+ })
288
+ );
289
+ reader.skip();
290
+ this.setY(
291
+ ParseTildeCaretNotation({
292
+ input: getPos(),
293
+ source: context.getSource(),
294
+ type: "y"
295
+ })
296
+ );
297
+ reader.skip();
298
+ this.setZ(
299
+ ParseTildeCaretNotation({
300
+ input: getPos(),
301
+ source: context.getSource(),
302
+ type: "z"
303
+ })
304
+ );
305
+ return this;
306
+ }
307
+ getReadableType() {
308
+ return this.name;
309
+ }
310
+ getParameters() {
311
+ return /* @__PURE__ */ new Set([
312
+ new CommandParameter({
313
+ paramName: this.name,
314
+ paramType: CommandParameterType.Position,
315
+ isOptional: this.optional,
316
+ flags: this.flags,
317
+ postfix: this.postfix
318
+ })
319
+ ]);
320
+ }
321
+ }
322
+ class CommandArgumentCommand {
323
+ name;
324
+ optional;
325
+ flags;
326
+ postfix;
327
+ constructor(data) {
328
+ this.name = data?.name ?? "command";
329
+ this.optional = data?.optional ?? false;
330
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
331
+ this.postfix = data?.postfix ?? null;
332
+ }
333
+ parse(reader, _context) {
334
+ const command = reader.readString();
335
+ return command;
336
+ }
337
+ getReadableType() {
338
+ return this.name;
339
+ }
340
+ getParameters() {
341
+ return /* @__PURE__ */ new Set([
342
+ new CommandParameter({
343
+ paramName: this.name,
344
+ paramType: CommandParameterType.Position,
345
+ isOptional: this.optional,
346
+ flags: this.flags,
347
+ postfix: this.postfix
348
+ })
349
+ ]);
350
+ }
351
+ }
352
+ class BooleanArgumentCommand {
353
+ name;
354
+ optional;
355
+ flags;
356
+ postfix;
357
+ constructor(data) {
358
+ this.name = data?.name ?? "boolean";
359
+ this.optional = data?.optional ?? false;
360
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
361
+ this.postfix = data?.postfix ?? null;
362
+ }
363
+ parse(reader, _context) {
364
+ const boolean = reader.readString();
365
+ if (boolean === "true")
366
+ return true;
367
+ return false;
368
+ }
369
+ getReadableType() {
370
+ return this.name;
371
+ }
372
+ getParameters() {
373
+ const booleanEnum = new CommandEnum();
374
+ booleanEnum.enumName = "Boolean";
375
+ booleanEnum.enumValues = ["true", "false"];
376
+ return /* @__PURE__ */ new Set([
377
+ new CommandParameter({
378
+ paramName: this.name,
379
+ isOptional: this.optional,
380
+ enum: booleanEnum,
381
+ flags: this.flags,
382
+ postfix: this.postfix
383
+ })
384
+ ]);
385
+ }
386
+ }
387
+ class PlayerArgumentCommand {
388
+ name;
389
+ optional;
390
+ flags;
391
+ postfix;
392
+ constructor(data) {
393
+ this.name = data?.name ?? "player";
394
+ this.optional = data?.optional ?? false;
395
+ this.flags = data?.flags ?? CommandParameterFlags.NONE;
396
+ this.postfix = data?.postfix ?? null;
397
+ }
398
+ parse(reader, _context) {
399
+ const player = reader.readString();
400
+ return player;
401
+ }
402
+ getReadableType() {
403
+ return this.name;
404
+ }
405
+ getParameters() {
406
+ const playerEnum = new CommandEnum();
407
+ playerEnum.enumName = "Player";
408
+ try {
409
+ playerEnum.enumValues = Server.instance.getSessionManager().getAllPlayers().map((player) => player.getName());
410
+ } catch {
411
+ playerEnum.enumValues = [];
412
+ }
413
+ return /* @__PURE__ */ new Set([
414
+ new CommandParameter({
415
+ paramName: this.name,
416
+ isOptional: this.optional,
417
+ enum: playerEnum,
418
+ flags: this.flags,
419
+ postfix: this.postfix
420
+ })
421
+ ]);
422
+ }
423
+ }
424
+
425
+ class LoginHandler {
426
+ static NetID = Identifiers.LoginPacket;
427
+ async handle(packet, server, connection) {
428
+ const playStatus = new PlayStatusPacket();
429
+ if (packet.protocol !== Identifiers.Protocol) {
430
+ playStatus.status = packet.protocol < Identifiers.Protocol ? PlayStatusType.LoginFailedClient : PlayStatusType.LoginFailedServer;
431
+ await connection.sendDataPacket(playStatus, true);
432
+ return;
433
+ }
434
+ if (!packet.displayName) {
435
+ connection.disconnect("Invalid username!", false);
436
+ return;
437
+ }
438
+ const world = server.getWorldManager().getDefaultWorld();
439
+ const player = new Player(connection, world, server);
440
+ player.username.name = packet.displayName;
441
+ player.locale = packet.languageCode;
442
+ player.randomId = packet.clientRandomId;
443
+ player.uuid = packet.identity;
444
+ player.xuid = packet.XUID;
445
+ player.skin = packet.skin;
446
+ player.device = packet.device;
447
+ try {
448
+ const oldPlayer = server.getSessionManager().getPlayerByExactName(packet.displayName);
449
+ await oldPlayer.kick("Logged in from another location");
450
+ } catch {
451
+ }
452
+ if (!player.xuid && server.getConfig().getOnlineMode()) {
453
+ await player.kick("Server is in online-mode!");
454
+ return;
455
+ }
456
+ await player.onEnable();
457
+ const reason = server.getBanManager().isBanned(player);
458
+ if (reason !== false) {
459
+ await player.kick(`You have been banned${reason ? ` for reason: ${reason}` : ""}!`);
460
+ return;
461
+ }
462
+ const session = connection.initPlayerConnection(server, player);
463
+ await session.sendPlayStatus(PlayStatusType.LoginSuccess);
464
+ await world.addEntity(player);
465
+ const resourcePacksInfo = new ResourcePacksInfoPacket();
466
+ resourcePacksInfo.resourcePackRequired = false;
467
+ resourcePacksInfo.forceServerPacksEnabled = false;
468
+ resourcePacksInfo.hasScripts = false;
469
+ resourcePacksInfo.hasAddonPacks = false;
470
+ await connection.sendDataPacket(resourcePacksInfo, true);
471
+ }
472
+ }
473
+
474
+ const Handlers = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
475
+ __proto__: null,
476
+ AnimateHandler,
477
+ ClientCacheStatusHandler,
478
+ CommandRequestHandler,
479
+ ContainerCloseHandler,
480
+ EmoteListHandler,
481
+ InteractHandler,
482
+ InventoryTransactionHandler,
483
+ LevelSoundEventHandler,
484
+ LoginHandler,
485
+ MobEquipmentHandler,
486
+ ModalFormResponseHandler,
487
+ MovePlayerHandler,
488
+ PacketViolationWarningHandler,
489
+ PlayerActionHandler,
490
+ RequestChunkRadiusHandler,
491
+ RequestNetworkSettingsHandler,
492
+ ResourcePackResponseHandler,
493
+ ServerSettingsRequestHandler,
494
+ SetDefaultGameTypeHandler,
495
+ SetLocalPlayerAsInitializedHandler,
496
+ SetPlayerGameTypeHandler,
497
+ TextHandler,
498
+ TickSyncHandler
499
+ }, Symbol.toStringTag, { value: 'Module' }));
500
+
501
+ class PlayerSession {
502
+ connection;
503
+ server;
504
+ player;
505
+ chunkSendQueue = [];
506
+ loadedChunks = /* @__PURE__ */ new Set();
507
+ loadingChunks = /* @__PURE__ */ new Set();
508
+ constructor(server, connection, player) {
509
+ this.server = server;
510
+ this.connection = connection;
511
+ this.player = player;
512
+ }
513
+ async update(_tick) {
514
+ if (this.chunkSendQueue.length > 0) {
515
+ const chunksToSend = this.chunkSendQueue.splice(0, Math.min(this.chunkSendQueue.length, 50));
516
+ const batch = new BatchPacket();
517
+ for (const chunk of chunksToSend) {
518
+ const pk = new LevelChunkPacket();
519
+ pk.chunkX = chunk.getX();
520
+ pk.chunkZ = chunk.getZ();
521
+ pk.clientSubChunkRequestsEnabled = false;
522
+ pk.subChunkCount = chunk.getTopEmpty() + 4;
523
+ pk.data = chunk.networkSerialize();
524
+ batch.addPacket(pk);
525
+ const hash = Chunk.packXZ(chunk.getX(), chunk.getZ());
526
+ this.loadedChunks.add(hash);
527
+ this.loadingChunks.delete(hash);
528
+ }
529
+ this.connection.sendBatch(batch, false);
530
+ }
531
+ this.player.viewDistance && await this.needNewChunks();
532
+ }
533
+ /**
534
+ * Notify a client about change(s) to the adventure settings.
535
+ *
536
+ * @param player - The client-controlled entity
537
+ */
538
+ async sendSettings(player) {
539
+ const target = player ?? this.player;
540
+ const pk = new UpdateAdventureSettingsPacket();
541
+ pk.worldImmutable = target.gamemode === Gamemode.Spectator;
542
+ pk.noAttackingPlayers = target.gamemode === Gamemode.Spectator;
543
+ pk.noAttackingMobs = target.gamemode === Gamemode.Spectator;
544
+ pk.autoJump = true;
545
+ pk.showNameTags = true;
546
+ await this.connection.sendDataPacket(pk);
547
+ }
548
+ async sendAbilities(player) {
549
+ const target = player ?? this.player;
550
+ const pk = new UpdateAbilitiesPacket();
551
+ pk.commandPermission = target.isOp() ? PermissionType.Operator : PermissionType.Normal;
552
+ pk.playerPermission = target.isOp() ? PlayerPermissionType.Operator : PlayerPermissionType.Member;
553
+ pk.targetActorUniqueId = target.getRuntimeId();
554
+ const mainLayer = new AbilityLayer();
555
+ mainLayer.layerType = AbilityLayerType.BASE;
556
+ mainLayer.layerFlags = /* @__PURE__ */ new Map([
557
+ [AbilityLayerFlag.FLY_SPEED, true],
558
+ [AbilityLayerFlag.WALK_SPEED, true],
559
+ [AbilityLayerFlag.MAY_FLY, target.getAllowFlight()],
560
+ [AbilityLayerFlag.FLYING, target.isFlying()],
561
+ [AbilityLayerFlag.NO_CLIP, target.gamemode === Gamemode.Spectator],
562
+ [AbilityLayerFlag.OPERATOR_COMMANDS, target.isOp()],
563
+ [AbilityLayerFlag.TELEPORT, target.isOp()],
564
+ [AbilityLayerFlag.INVULNERABLE, target.gamemode === Gamemode.Creative],
565
+ [AbilityLayerFlag.MUTED, false],
566
+ [AbilityLayerFlag.WORLD_BUILDER, false],
567
+ [AbilityLayerFlag.INSTABUILD, target.gamemode === Gamemode.Creative],
568
+ [AbilityLayerFlag.LIGHTNING, false],
569
+ [AbilityLayerFlag.BUILD, target.gamemode !== Gamemode.Spectator],
570
+ [AbilityLayerFlag.MINE, target.gamemode !== Gamemode.Spectator],
571
+ [AbilityLayerFlag.DOORS_AND_SWITCHES, target.gamemode !== Gamemode.Spectator],
572
+ [AbilityLayerFlag.OPEN_CONTAINERS, target.gamemode !== Gamemode.Spectator],
573
+ [AbilityLayerFlag.ATTACK_PLAYERS, target.gamemode !== Gamemode.Spectator],
574
+ [AbilityLayerFlag.ATTACK_MOBS, target.gamemode !== Gamemode.Spectator]
575
+ ]);
576
+ mainLayer.flySpeed = 0.05;
577
+ mainLayer.walkSpeed = 0.1;
578
+ pk.abilityLayers = [mainLayer];
579
+ await this.connection.sendDataPacket(pk);
580
+ }
581
+ async needNewChunks(forceResend = false, dist) {
582
+ const currentXChunk = CoordinateUtils.fromBlockToChunk(this.player.getX());
583
+ const currentZChunk = CoordinateUtils.fromBlockToChunk(this.player.getZ());
584
+ const viewDistance = this.player.viewDistance || dist || 0;
585
+ const chunksToSendHeap = new Heap((a, b) => {
586
+ const distXFirst = Math.abs(a[0] - currentXChunk);
587
+ const distXSecond = Math.abs(b[0] - currentXChunk);
588
+ const distZFirst = Math.abs(a[1] - currentZChunk);
589
+ const distZSecond = Math.abs(b[1] - currentZChunk);
590
+ return distXFirst + distZFirst > distXSecond + distZSecond ? 1 : -1;
591
+ });
592
+ for (let sendXChunk = -viewDistance; sendXChunk <= viewDistance; sendXChunk++) {
593
+ for (let sendZChunk = -viewDistance; sendZChunk <= viewDistance; sendZChunk++) {
594
+ if (sendXChunk * sendXChunk + sendZChunk * sendZChunk > viewDistance * viewDistance)
595
+ continue;
596
+ const newChunk = [currentXChunk + sendXChunk, currentZChunk + sendZChunk];
597
+ const hash = Chunk.packXZ(newChunk[0], newChunk[1]);
598
+ if (forceResend) {
599
+ chunksToSendHeap.push(newChunk);
600
+ } else if (!this.loadedChunks.has(hash) && !this.loadingChunks.has(hash)) {
601
+ chunksToSendHeap.push(newChunk);
602
+ }
603
+ }
604
+ }
605
+ while (chunksToSendHeap.size() > 0) {
606
+ const closestChunk = chunksToSendHeap.pop();
607
+ const hash = Chunk.packXZ(closestChunk[0], closestChunk[1]);
608
+ if (forceResend) {
609
+ if (!this.loadedChunks.has(hash) && !this.loadingChunks.has(hash)) {
610
+ this.loadingChunks.add(hash);
611
+ await this.requestChunk(closestChunk[0], closestChunk[1]);
612
+ } else {
613
+ const loadedChunk = await this.player.getWorld().getChunk(closestChunk[0], closestChunk[1]);
614
+ await this.sendChunk(loadedChunk);
615
+ }
616
+ } else {
617
+ this.loadingChunks.add(hash);
618
+ await this.requestChunk(closestChunk[0], closestChunk[1]);
619
+ }
620
+ }
621
+ let unloaded = false;
622
+ for (const hash of this.loadedChunks) {
623
+ const [x, z] = Chunk.unpackXZ(hash);
624
+ if (Math.abs(x - currentXChunk) > viewDistance || Math.abs(z - currentZChunk) > viewDistance) {
625
+ unloaded = true;
626
+ this.loadedChunks.delete(hash);
627
+ }
628
+ }
629
+ for (const hash of this.loadingChunks) {
630
+ const [x, z] = Chunk.unpackXZ(hash);
631
+ if (Math.abs(x - currentXChunk) > viewDistance || Math.abs(z - currentZChunk) > viewDistance) {
632
+ this.loadingChunks.delete(hash);
633
+ }
634
+ }
635
+ if (!unloaded && this.chunkSendQueue.length !== 0) {
636
+ await this.sendNetworkChunkPublisher(dist ?? viewDistance, []);
637
+ }
638
+ }
639
+ async requestChunk(x, z) {
640
+ const chunk = await this.player.getWorld().getChunk(x, z);
641
+ this.chunkSendQueue.push(chunk);
642
+ }
643
+ /**
644
+ * Clear the currently loaded and loading chunks.
645
+ *
646
+ * @remarks
647
+ * Usually used for changing dimension, world, etc.
648
+ */
649
+ async clearChunks() {
650
+ this.loadedChunks.clear();
651
+ this.loadingChunks.clear();
652
+ }
653
+ async sendInventory() {
654
+ const pk = new InventoryContentPacket();
655
+ pk.items = this.player.getInventory().getItems(true);
656
+ pk.windowId = WindowIds.INVENTORY;
657
+ await this.connection.sendDataPacket(pk);
658
+ await this.sendHandItem(this.player.getInventory().getItemInHand());
659
+ }
660
+ async sendCreativeContents(empty = false) {
661
+ const pk = new CreativeContentPacket();
662
+ if (empty) {
663
+ await this.connection.sendDataPacket(pk);
664
+ return;
665
+ }
666
+ const entries = [
667
+ ...this.player.getServer().getBlockManager().getBlocks(),
668
+ ...this.player.getServer().getItemManager().getItems()
669
+ ];
670
+ creativeitems.forEach((item) => {
671
+ pk.items.push(
672
+ ...entries.filter((entry) => {
673
+ return entry.meta === (item.damage ?? 0) && entry.getId() === item.id;
674
+ }).map(
675
+ (entry) => new Item({
676
+ id: entry.getId(),
677
+ name: entry.getName(),
678
+ meta: entry.meta
679
+ })
680
+ )
681
+ );
682
+ });
683
+ await this.connection.sendDataPacket(pk);
684
+ }
685
+ /**
686
+ * Sets the item in the player hand.
687
+ *
688
+ * @param item - The entity.
689
+ */
690
+ async sendHandItem(item) {
691
+ const pk = new MobEquipmentPacket();
692
+ pk.runtimeEntityId = this.player.getRuntimeId();
693
+ pk.item = item;
694
+ pk.inventorySlot = this.player.getInventory().getHandSlotIndex();
695
+ pk.hotbarSlot = this.player.getInventory().getHandSlotIndex();
696
+ pk.windowId = 0;
697
+ await this.connection.sendDataPacket(pk);
698
+ }
699
+ async sendForm(form) {
700
+ const id = this.player.getFormManager().addForm(form);
701
+ const pk = new ModalFormRequestPacket();
702
+ pk.formId = id;
703
+ pk.formData = form.jsonSerialize();
704
+ await this.connection.sendDataPacket(pk);
705
+ }
706
+ /**
707
+ * Set the client's current tick.
708
+ *
709
+ * @param tick - The tick
710
+ */
711
+ async sendTime(tick) {
712
+ const pk = new SetTimePacket();
713
+ pk.time = tick;
714
+ await this.connection.sendDataPacket(pk);
715
+ }
716
+ /**
717
+ * Set the client's gamemode.
718
+ *
719
+ * @param gamemode - the numeric gamemode ID
720
+ */
721
+ async sendGamemode(gamemode) {
722
+ const pk = new SetPlayerGameTypePacket();
723
+ pk.gamemode = gamemode;
724
+ await this.connection.sendDataPacket(pk);
725
+ }
726
+ async sendNetworkChunkPublisher(distance, savedChunks) {
727
+ const pk = new NetworkChunkPublisherUpdatePacket();
728
+ pk.position = BlockPosition.fromVector3(this.player);
729
+ pk.radius = distance << 4;
730
+ pk.savedChunks = savedChunks;
731
+ await this.connection.sendDataPacket(pk);
732
+ }
733
+ async sendAvailableCommands() {
734
+ const pk = new AvailableCommandsPacket();
735
+ this.server.getCommandManager().getCommandsList().forEach((command) => {
736
+ const commandClass = Array.from(this.server.getCommandManager().getCommands().values()).find(
737
+ (cmd2) => cmd2.id.split(":")[1] === command[0]
738
+ );
739
+ if (!commandClass) {
740
+ this.player.getServer().getLogger()?.warn(`Can't find corresponding command class for "${command[0]}"`);
741
+ return;
742
+ }
743
+ if (!this.player.getServer().getPermissionManager().can(this.player).execute(commandClass.permission))
744
+ return;
745
+ const cmd = new CommandData();
746
+ cmd.commandName = command[0];
747
+ cmd.commandDescription = commandClass.description;
748
+ if (commandClass.aliases.length > 0) {
749
+ const cmdAliases = new CommandEnum();
750
+ cmdAliases.enumName = `${command[0]}Aliases`;
751
+ cmdAliases.enumValues = commandClass.aliases.concat(command[0]);
752
+ cmd.aliases = cmdAliases;
753
+ }
754
+ command[2].forEach((arg, index) => {
755
+ const parameters = arg.map((parameter) => {
756
+ const parameters2 = parameter.getParameters();
757
+ if (parameters2)
758
+ return Array.from(parameters2.values());
759
+ if (parameter instanceof CommandArgumentEntity)
760
+ return [
761
+ new CommandParameter({
762
+ paramName: "target",
763
+ paramType: CommandParameterType.Target
764
+ })
765
+ ];
766
+ if (parameter instanceof CommandArgumentGamemode)
767
+ return [
768
+ new CommandParameter({
769
+ paramName: "gamemode",
770
+ paramType: CommandParameterType.String
771
+ })
772
+ ];
773
+ if (parameter.constructor.name === "StringArgumentType")
774
+ return [
775
+ new CommandParameter({
776
+ paramName: "value",
777
+ paramType: CommandParameterType.String
778
+ })
779
+ ];
780
+ if (parameter.constructor.name === "IntegerArgumentType")
781
+ return [
782
+ new CommandParameter({
783
+ paramName: "number",
784
+ paramType: CommandParameterType.Int
785
+ })
786
+ ];
787
+ this.server.getLogger()?.warn(`Invalid parameter ${parameter.constructor.name}`);
788
+ return [
789
+ new CommandParameter({
790
+ paramName: "value",
791
+ paramType: CommandParameterType.String
792
+ })
793
+ ];
794
+ }).flat();
795
+ cmd.overloads[index] = parameters;
796
+ });
797
+ pk.commandData.push(cmd);
798
+ });
799
+ const playerEnum = new CommandEnum();
800
+ playerEnum.enumName = "Player";
801
+ playerEnum.enumValues = this.player.getServer().getSessionManager().getAllPlayers().map((player) => player.getName());
802
+ pk.softEnums = [playerEnum];
803
+ }
804
+ /**
805
+ * Set the client's maximum view distance.
806
+ *
807
+ * @param distance - The view distance
808
+ */
809
+ async setViewDistance(distance) {
810
+ this.player.viewDistance = distance;
811
+ const pk = new ChunkRadiusUpdatedPacket();
812
+ pk.radius = distance;
813
+ await this.connection.sendDataPacket(pk);
814
+ }
815
+ async sendAttributes(attributes) {
816
+ const pk = new UpdateAttributesPacket();
817
+ pk.runtimeEntityId = this.player.getRuntimeId();
818
+ pk.attributes = attributes.length > 0 ? attributes : this.player.getAttributeManager().getAttributes();
819
+ pk.tick = BigInt(0);
820
+ await this.connection.sendDataPacket(pk);
821
+ }
822
+ async sendMetadata() {
823
+ const pk = new SetActorDataPacket();
824
+ pk.runtimeEntityId = this.player.getRuntimeId();
825
+ pk.metadata = this.player.getMetadataManager();
826
+ pk.tick = BigInt(0);
827
+ await this.connection.sendDataPacket(pk);
828
+ }
829
+ /**
830
+ * Send a chat message to the client.
831
+ *
832
+ * @remarks
833
+ * Refactor this completely.
834
+ *
835
+ * @param message - The message
836
+ * @param xuid - The source xuid
837
+ * @param parameters -
838
+ * @param needsTranslation - If the TextType requires translation
839
+ * @param type - The text type
840
+ */
841
+ async sendMessage(message, xuid = "", parameters = [], needsTranslation = false, type = TextType.Raw) {
842
+ if (!message)
843
+ throw new Error("A message is required");
844
+ const pk = new TextPacket();
845
+ pk.type = type;
846
+ pk.sourceName = "";
847
+ pk.message = message;
848
+ pk.needsTranslation = needsTranslation;
849
+ pk.xuid = xuid;
850
+ pk.platformChatId = "";
851
+ pk.parameters = parameters;
852
+ await this.connection.sendDataPacket(pk);
853
+ }
854
+ async sendToast(title, body) {
855
+ if (!title)
856
+ throw new Error("A toast title is required");
857
+ if (!body)
858
+ throw new Error("A toast body is required.");
859
+ const pk = new ToastRequestPacket();
860
+ pk.title = title;
861
+ pk.body = body;
862
+ await this.connection.sendDataPacket(pk);
863
+ }
864
+ async sendChunk(chunk) {
865
+ const pk = new LevelChunkPacket();
866
+ pk.chunkX = chunk.getX();
867
+ pk.chunkZ = chunk.getZ();
868
+ pk.clientSubChunkRequestsEnabled = false;
869
+ pk.subChunkCount = chunk.getTopEmpty() + 4;
870
+ pk.data = chunk.networkSerialize();
871
+ await this.connection.sendDataPacket(pk, void 0, false);
872
+ const hash = Chunk.packXZ(chunk.getX(), chunk.getZ());
873
+ this.loadedChunks.add(hash);
874
+ this.loadingChunks.delete(hash);
875
+ }
876
+ /**
877
+ * Broadcast the movement to a defined player
878
+ */
879
+ async broadcastMove(player, mode = MovementType.Normal) {
880
+ const pk = new MovePlayerPacket();
881
+ pk.runtimeEntityId = player.getRuntimeId();
882
+ pk.positionX = player.getX();
883
+ pk.positionY = player.getY();
884
+ pk.positionZ = player.getZ();
885
+ pk.pitch = player.pitch;
886
+ pk.yaw = player.yaw;
887
+ pk.headYaw = player.headYaw;
888
+ pk.mode = mode;
889
+ pk.onGround = player.isOnGround();
890
+ if (mode === MovementType.Teleport) {
891
+ pk.teleportCause = 0;
892
+ pk.teleportItemId = 0;
893
+ }
894
+ pk.ridingEntityRuntimeId = BigInt(0);
895
+ pk.tick = BigInt(0);
896
+ await this.connection.sendDataPacket(pk);
897
+ }
898
+ /**
899
+ * Adds the client to the player list of every player inside
900
+ * the server and also to the player itself.
901
+ */
902
+ async addToPlayerList() {
903
+ const playerList = new PlayerListPacket();
904
+ playerList.type = PlayerListAction.TYPE_ADD;
905
+ const entry = new PlayerListEntry({
906
+ uuid: UUID.fromString(this.player.uuid),
907
+ uniqueEntityid: this.player.getRuntimeId(),
908
+ name: this.player.getName(),
909
+ xuid: this.player.xuid,
910
+ platformChatId: "",
911
+ // TODO: read this value from Login
912
+ buildPlatform: this.player.device ? this.player.device.os : -1,
913
+ skin: this.player.skin,
914
+ isTeacher: false,
915
+ // TODO: figure out where to read teacher and host
916
+ isHost: false
917
+ });
918
+ playerList.entries.push(entry);
919
+ await this.server.broadcastPacket(playerList);
920
+ this.server.getSessionManager().getPlayerList().set(this.player.uuid, entry);
921
+ }
922
+ /**
923
+ * Removes a player from other players list
924
+ */
925
+ async removeFromPlayerList() {
926
+ if (!this.player.uuid)
927
+ return;
928
+ const pk = new PlayerListPacket();
929
+ pk.type = PlayerListAction.TYPE_REMOVE;
930
+ const entry = new PlayerListEntry({
931
+ uuid: UUID.fromString(this.player.getUUID())
932
+ });
933
+ pk.entries.push(entry);
934
+ this.server.getSessionManager().getPlayerList().delete(this.player.uuid);
935
+ await Promise.all(
936
+ this.server.getSessionManager().getAllPlayers().map(async (player) => player.getNetworkSession().getConnection().sendDataPacket(pk))
937
+ );
938
+ }
939
+ /**
940
+ * Sends the full player list to the player.
941
+ */
942
+ async sendPlayerList() {
943
+ const playerList = new PlayerListPacket();
944
+ playerList.type = PlayerListAction.TYPE_ADD;
945
+ playerList.entries = Array.from(this.server.getSessionManager().getPlayerList().values());
946
+ await this.connection.sendDataPacket(playerList);
947
+ }
948
+ /**
949
+ * Spawn the player for another player
950
+ *
951
+ * @param player - the player to send the AddPlayerPacket to
952
+ */
953
+ async sendSpawn(player) {
954
+ if (!player.getUUID()) {
955
+ this.server.getLogger()?.error(`UUID for player ${player.getName()} is undefined`);
956
+ return;
957
+ }
958
+ const pk = new AddPlayerPacket();
959
+ pk.uuid = UUID.fromString(this.player.getUUID());
960
+ pk.runtimeEntityId = this.player.getRuntimeId();
961
+ pk.name = this.player.getName();
962
+ pk.positionX = this.player.getX();
963
+ pk.positionY = this.player.getY();
964
+ pk.positionZ = this.player.getZ();
965
+ pk.motionX = 0;
966
+ pk.motionY = 0;
967
+ pk.motionZ = 0;
968
+ pk.pitch = this.player.pitch;
969
+ pk.yaw = this.player.yaw;
970
+ pk.headYaw = this.player.headYaw;
971
+ pk.item = this.player.getInventory().getItemInHand();
972
+ pk.deviceId = this.player.device?.id ?? "";
973
+ pk.metadata = this.player.getMetadataManager();
974
+ await player.getNetworkSession().getConnection().sendDataPacket(pk);
975
+ }
976
+ /**
977
+ * Despawn the player entity from another player
978
+ */
979
+ async sendDespawn(player) {
980
+ const pk = new RemoveActorPacket();
981
+ pk.uniqueEntityId = this.player.getRuntimeId();
982
+ await player.getNetworkSession().getConnection().sendDataPacket(pk);
983
+ }
984
+ async sendPlayStatus(status) {
985
+ const pk = new PlayStatusPacket();
986
+ pk.status = status;
987
+ await this.connection.sendDataPacket(pk, true);
988
+ }
989
+ async kick(reason = "unknown reason") {
990
+ const pk = new DisconnectPacket();
991
+ pk.skipMessage = false;
992
+ pk.message = reason;
993
+ await this.connection.sendDataPacket(pk, true);
994
+ }
995
+ getConnection() {
996
+ return this.connection;
997
+ }
998
+ getPlayer() {
999
+ return this.player;
1000
+ }
1001
+ }
1002
+
1003
+ const VANILLA_DEFAULT_SPAWN_RADIUS = 4;
1004
+ class Player extends Human {
1005
+ address;
1006
+ networkSession;
1007
+ permissions;
1008
+ // Only used for metrics
1009
+ joinTimer = new Timer();
1010
+ // TODO: finish implementation
1011
+ windows;
1012
+ connected = false;
1013
+ username = {
1014
+ prefix: "<",
1015
+ suffix: ">",
1016
+ name: ""
1017
+ };
1018
+ locale = "";
1019
+ randomId = 0;
1020
+ uuid = "";
1021
+ xuid = "";
1022
+ skin = null;
1023
+ viewDistance = 0;
1024
+ gamemode = 0;
1025
+ pitch = 0;
1026
+ yaw = 0;
1027
+ headYaw = 0;
1028
+ onGround = false;
1029
+ sprinting = false;
1030
+ flying = false;
1031
+ sneaking = false;
1032
+ allowFight = false;
1033
+ platformChatId = "";
1034
+ device = null;
1035
+ cacheSupport = false;
1036
+ chunkSendQueue = /* @__PURE__ */ new Set();
1037
+ currentChunk = null;
1038
+ forms;
1039
+ chatHandler;
1040
+ /**
1041
+ * Player's constructor.
1042
+ */
1043
+ constructor(connection, world, server) {
1044
+ super(world, server);
1045
+ this.address = connection.getRakNetSession().getAddress();
1046
+ this.networkSession = new PlayerSession(server, connection, this);
1047
+ this.windows = new WindowManager();
1048
+ this.forms = new FormManager();
1049
+ this.permissions = [];
1050
+ this.joinTimer.reset();
1051
+ this.chatHandler = async (evt) => {
1052
+ if (evt.isCancelled())
1053
+ return;
1054
+ if (evt.getChat().getChannel() === "*.everyone" || evt.getChat().getChannel() === "*.ops" && this.isOp() || evt.getChat().getChannel() === `*.player.${this.getName()}`)
1055
+ await this.sendMessage(
1056
+ evt.getChat().getMessage(),
1057
+ evt.getChat().getType(),
1058
+ evt.getChat().getParameters(),
1059
+ evt.getChat().isNeedsTranslation()
1060
+ );
1061
+ };
1062
+ server.getEventManager().on("chat", this.chatHandler);
1063
+ }
1064
+ async onEnable() {
1065
+ this.permissions = await this.getServer().getPermissionManager().getPermissions(this);
1066
+ const playerData = await this.getWorld().getPlayerData(this);
1067
+ await this.setX(playerData.position.x);
1068
+ await this.setY(playerData.position.y);
1069
+ await this.setZ(playerData.position.z);
1070
+ this.pitch = playerData.position.pitch;
1071
+ this.yaw = playerData.position.yaw;
1072
+ playerData.inventory.forEach((item) => {
1073
+ const entry = this.getServer().getItemManager().getItem(item.id) || this.getServer().getBlockManager().getBlock(item.id);
1074
+ if (!entry) {
1075
+ this.getServer().getLogger()?.warn(`Item/block with id ${item.id} is invalid`, "Player/onEnable");
1076
+ return;
1077
+ }
1078
+ this.getInventory().setItem(
1079
+ item.position,
1080
+ new ContainerEntry({
1081
+ item: entry,
1082
+ count: item.count
1083
+ })
1084
+ );
1085
+ });
1086
+ if (!this.connected)
1087
+ this.getServer().getLogger()?.debug(`(Complete player creation took ${this.joinTimer.stop()} ms)`, "Player/onEnable");
1088
+ this.connected = true;
1089
+ }
1090
+ async onDisable() {
1091
+ if (this.connected && this.xuid)
1092
+ await this.getWorld().savePlayerData(this);
1093
+ this.server.getEventManager().removeListener("chat", this.chatHandler);
1094
+ this.connected = false;
1095
+ }
1096
+ /**
1097
+ * Used to match vanilla behavior, will send chunks
1098
+ * with an initial view radius of VANILLA_DEFAULT_SPAWN_RADIUS.
1099
+ */
1100
+ async sendInitialSpawnChunks() {
1101
+ const minX = CoordinateUtils.fromBlockToChunk(this.x) - VANILLA_DEFAULT_SPAWN_RADIUS;
1102
+ const minZ = CoordinateUtils.fromBlockToChunk(this.z) - VANILLA_DEFAULT_SPAWN_RADIUS;
1103
+ const maxX = CoordinateUtils.fromBlockToChunk(this.x) + VANILLA_DEFAULT_SPAWN_RADIUS;
1104
+ const maxZ = CoordinateUtils.fromBlockToChunk(this.z) + VANILLA_DEFAULT_SPAWN_RADIUS;
1105
+ const savedChunks = [];
1106
+ const sendQueue = [];
1107
+ for (let chunkX = minX; chunkX <= maxX; ++chunkX) {
1108
+ for (let chunkZ = minZ; chunkZ <= maxZ; ++chunkZ) {
1109
+ savedChunks.push({ x: chunkX, z: chunkZ });
1110
+ sendQueue.push(this.getWorld().getChunk(chunkX, chunkZ));
1111
+ }
1112
+ }
1113
+ await this.networkSession.sendNetworkChunkPublisher(VANILLA_DEFAULT_SPAWN_RADIUS, savedChunks);
1114
+ const getUniqueChunks = (sendList) => {
1115
+ const xSet = /* @__PURE__ */ new Set();
1116
+ const zSet = /* @__PURE__ */ new Set();
1117
+ for (const coord of sendList) {
1118
+ xSet.add(coord.x);
1119
+ zSet.add(coord.z);
1120
+ }
1121
+ return Math.floor((xSet.size + zSet.size) / 2);
1122
+ };
1123
+ for (let i = 0; i < getUniqueChunks(savedChunks); ++i) {
1124
+ await this.networkSession.sendNetworkChunkPublisher(VANILLA_DEFAULT_SPAWN_RADIUS, []);
1125
+ }
1126
+ for await (const chunk of sendQueue) {
1127
+ await this.networkSession.sendChunk(chunk);
1128
+ }
1129
+ }
1130
+ /**
1131
+ * Change the player's current world.
1132
+ *
1133
+ * @param world - the new world
1134
+ */
1135
+ async setWorld(world) {
1136
+ const dim0 = new ChangeDimensionPacket();
1137
+ dim0.dimension = 0;
1138
+ dim0.position = this;
1139
+ dim0.respawn = false;
1140
+ const dim1 = new ChangeDimensionPacket();
1141
+ dim1.dimension = 1;
1142
+ dim1.position = new Vector3(0, 0, 0);
1143
+ dim1.respawn = false;
1144
+ await this.networkSession.getConnection().sendDataPacket(dim0);
1145
+ await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1146
+ await this.networkSession.getConnection().sendDataPacket(dim1);
1147
+ await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1148
+ await this.getWorld().removeEntity(this);
1149
+ await world.addEntity(this);
1150
+ await super.setWorld.bind(this)(world);
1151
+ await this.setPosition(new Vector3(0, 0, 0));
1152
+ for (let x = -3; x < 3; x++) {
1153
+ for (let z = -3; z < 3; z++) {
1154
+ const pk = new LevelChunkPacket();
1155
+ pk.clientSubChunkRequestsEnabled = false;
1156
+ pk.chunkX = x;
1157
+ pk.chunkZ = z;
1158
+ pk.data = Buffer.from("");
1159
+ pk.subChunkCount = 0;
1160
+ await this.networkSession.getConnection().sendDataPacket(pk);
1161
+ }
1162
+ }
1163
+ await this.networkSession.getConnection().sendDataPacket(dim1);
1164
+ await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1165
+ await this.networkSession.getConnection().sendDataPacket(dim0);
1166
+ await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1167
+ this.currentChunk = null;
1168
+ await this.networkSession.clearChunks();
1169
+ await this.networkSession.needNewChunks();
1170
+ await this.onEnable();
1171
+ await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1172
+ }
1173
+ isOnline() {
1174
+ return this.connected;
1175
+ }
1176
+ async update(tick) {
1177
+ await super.update.bind(this)(tick);
1178
+ await this.networkSession.update(tick);
1179
+ if (tick % (20 * 5 * 60 * 1) === 0) {
1180
+ await this.networkSession.sendTime(tick);
1181
+ }
1182
+ for (const chunk of this.chunkSendQueue) {
1183
+ await this.networkSession.sendNetworkChunkPublisher(this.viewDistance || VANILLA_DEFAULT_SPAWN_RADIUS, []);
1184
+ await this.networkSession.sendChunk(chunk);
1185
+ this.chunkSendQueue.delete(chunk);
1186
+ }
1187
+ }
1188
+ async kick(reason = "unknown reason") {
1189
+ this.getServer().getLogger()?.verbose(`Player with id §b${this.getRuntimeId()}§r was kicked: ${reason}`, "Player/kick");
1190
+ await this.networkSession.kick(reason);
1191
+ }
1192
+ async sendSettings() {
1193
+ }
1194
+ // Return all the players in the same chunk,.
1195
+ // TODO: move to world
1196
+ getPlayersInChunk() {
1197
+ return this.getServer().getSessionManager().getAllPlayers().filter((player) => player.getCurrentChunk() === this.getCurrentChunk());
1198
+ }
1199
+ // TODO: these
1200
+ async sendSpawn() {
1201
+ }
1202
+ async sendDespawn() {
1203
+ }
1204
+ /**
1205
+ * Send a chat message to the client.
1206
+ * @param message - the message
1207
+ */
1208
+ async sendMessage(message, type = TextType.Raw, parameters = [], needsTranslation = false) {
1209
+ await this.networkSession.sendMessage(message, "", parameters, needsTranslation, type);
1210
+ }
1211
+ /**
1212
+ * Send a toast notification (like Xbox Live notifications)
1213
+ * @param title - the toast title
1214
+ * @param body - the toast body
1215
+ */
1216
+ async sendToast(title, body) {
1217
+ await this.networkSession.sendToast(title, body);
1218
+ }
1219
+ async setGamemode(mode) {
1220
+ const event = new PlayerSetGamemodeEvent(this, mode);
1221
+ this.getServer().getEventManager().post(["playerSetGamemode", event]);
1222
+ if (event.isCancelled())
1223
+ return;
1224
+ this.gamemode = event.getGamemode();
1225
+ await this.networkSession.sendGamemode(this.gamemode);
1226
+ if (this.gamemode === Gamemode.Creative || this.gamemode === Gamemode.Spectator)
1227
+ this.allowFight = true;
1228
+ else {
1229
+ this.allowFight = false;
1230
+ await this.setFlying(false);
1231
+ }
1232
+ await this.sendSettings();
1233
+ }
1234
+ getGamemode() {
1235
+ return Gamemode.getGamemodeName(this.gamemode).toLowerCase();
1236
+ }
1237
+ getNetworkSession() {
1238
+ return this.networkSession;
1239
+ }
1240
+ getAddress() {
1241
+ return this.address;
1242
+ }
1243
+ getName() {
1244
+ return this.username.name;
1245
+ }
1246
+ getFormattedUsername() {
1247
+ return `${this.username.prefix}${this.username.name}${this.username.suffix}`;
1248
+ }
1249
+ getPermissions() {
1250
+ return this.permissions;
1251
+ }
1252
+ getUUID() {
1253
+ if (!this.uuid)
1254
+ throw new Error("uuid is missing!");
1255
+ return this.uuid;
1256
+ }
1257
+ getXUID() {
1258
+ if (!this.xuid)
1259
+ throw new Error("xuid is missing!");
1260
+ return this.xuid;
1261
+ }
1262
+ getFormManager() {
1263
+ return this.forms;
1264
+ }
1265
+ getWindows() {
1266
+ return this.windows;
1267
+ }
1268
+ getAllowFlight() {
1269
+ return this.allowFight;
1270
+ }
1271
+ isPlayer() {
1272
+ return true;
1273
+ }
1274
+ /**
1275
+ * Check if the `Player` is an operator.
1276
+ *
1277
+ * @returns `true` if this player is an operator otherwise `false`.
1278
+ */
1279
+ isOp() {
1280
+ return this.getServer().getPermissionManager().isOp(this.getName());
1281
+ }
1282
+ /**
1283
+ * Check if the `Player` is sprinting.
1284
+ *
1285
+ * @returns `true` if this player is sprinting otherwise `false`.
1286
+ */
1287
+ isSprinting() {
1288
+ return this.sprinting;
1289
+ }
1290
+ async setSprinting(sprinting) {
1291
+ if (sprinting === this.isSprinting())
1292
+ return;
1293
+ const event = new PlayerToggleSprintEvent(this, sprinting);
1294
+ this.getServer().getEventManager().post(["playerToggleSprint", event]);
1295
+ if (event.isCancelled())
1296
+ return;
1297
+ this.sprinting = event.getIsSprinting();
1298
+ this.setDataFlag(MetadataFlag.INDEX, MetadataFlag.SPRINTING, this.isSprinting(), FlagType.BYTE);
1299
+ await this.networkSession.sendMetadata();
1300
+ }
1301
+ isFlying() {
1302
+ return this.flying;
1303
+ }
1304
+ async setFlying(flying) {
1305
+ if (flying === this.isFlying())
1306
+ return;
1307
+ if (!this.getAllowFlight()) {
1308
+ this.flying = false;
1309
+ return;
1310
+ }
1311
+ const event = new PlayerToggleFlightEvent(this, flying);
1312
+ this.getServer().getEventManager().post(["playerToggleFlight", event]);
1313
+ if (event.isCancelled())
1314
+ return;
1315
+ this.flying = event.getIsFlying();
1316
+ await this.sendSettings();
1317
+ }
1318
+ isSneaking() {
1319
+ return this.sneaking;
1320
+ }
1321
+ async setSneaking(val) {
1322
+ this.sneaking = val;
1323
+ await this.sendSettings();
1324
+ }
1325
+ isOnGround() {
1326
+ return this.onGround;
1327
+ }
1328
+ async setOnGround(val) {
1329
+ if (val === this.onGround)
1330
+ return;
1331
+ this.onGround = val;
1332
+ }
1333
+ /**
1334
+ * Set the position.
1335
+ *
1336
+ * @remarks
1337
+ * This will notify the player's client about the position change.
1338
+ *
1339
+ * @param position - The position
1340
+ * @param type - The movement type
1341
+ */
1342
+ async setPosition(position, type = MovementType.Normal) {
1343
+ await this.setX(position.getX());
1344
+ await this.setY(position.getY());
1345
+ await this.setZ(position.getZ());
1346
+ await this.networkSession.broadcastMove(this, type);
1347
+ }
1348
+ setCurrentChunk(chunk) {
1349
+ if (this.currentChunk === chunk)
1350
+ return;
1351
+ this.currentChunk = chunk;
1352
+ }
1353
+ getCurrentChunk() {
1354
+ return this.currentChunk;
1355
+ }
1356
+ }
1357
+
1358
+ class ClientConnection extends MinecraftSession {
1359
+ playerSession = null;
1360
+ hasCompression = false;
1361
+ constructor(session, logger) {
1362
+ super(session, logger);
1363
+ }
1364
+ /**
1365
+ * @internal
1366
+ *
1367
+ * @param server - the server instance
1368
+ * @param player - the player instance
1369
+ * @returns the new player session
1370
+ */
1371
+ initPlayerConnection(server, player) {
1372
+ assert(this.playerSession === null, "Player session was already created");
1373
+ this.playerSession = new PlayerSession(server, this, player);
1374
+ return this.playerSession;
1375
+ }
1376
+ disconnect(reason = "disconnect.disconnected", hideReason = true) {
1377
+ const packet = new DisconnectPacket();
1378
+ packet.skipMessage = hideReason;
1379
+ packet.message = reason;
1380
+ void this.sendDataPacket(packet);
1381
+ this.rakSession.disconnect();
1382
+ }
1383
+ getPlayerSession() {
1384
+ return this.playerSession;
1385
+ }
1386
+ getRakNetSession() {
1387
+ return this.rakSession;
1388
+ }
1389
+ }
1390
+
1391
+ class PacketRegistry {
1392
+ server;
1393
+ packets = /* @__PURE__ */ new Map();
1394
+ handlers = /* @__PURE__ */ new Map();
1395
+ constructor(server) {
1396
+ this.server = server;
1397
+ }
1398
+ async onEnable() {
1399
+ await this.registerPackets();
1400
+ await this.registerHandlers();
1401
+ }
1402
+ async onDisable() {
1403
+ this.handlers.clear();
1404
+ this.packets.clear();
1405
+ }
1406
+ /**
1407
+ * Register a packet.
1408
+ * @param packet - the packet.
1409
+ */
1410
+ registerPacket(packet) {
1411
+ if (this.packets.has(packet.NetID))
1412
+ throw new Error(
1413
+ `Packet ${packet.name} is trying to use id ${packet.NetID.toString(16)} which already exists!`
1414
+ );
1415
+ this.packets.set(packet.NetID, packet);
1416
+ this.server.getLogger()?.debug(`Packet with id §b${packet.name}§r registered`, "PacketRegistry/registerPacket");
1417
+ }
1418
+ /**
1419
+ * Get a packet by it's network ID.
1420
+ * @param id - the NetID.
1421
+ */
1422
+ getPacket(id) {
1423
+ if (!this.packets.has(id))
1424
+ throw new Error(`Invalid packet with id ${id}!`);
1425
+ return this.packets.get(id);
1426
+ }
1427
+ /**
1428
+ * Remove a packet from the registry.
1429
+ * @param id - the NetID.
1430
+ */
1431
+ removePacket(id) {
1432
+ this.packets.delete(id);
1433
+ }
1434
+ registerHandler(id, handler) {
1435
+ if (this.handlers.has(id))
1436
+ throw new Error(`Handler with id ${id} already exists!`);
1437
+ this.handlers.set(id, handler);
1438
+ this.server.getLogger()?.debug(`Handler with id §b${handler.constructor.name}§r registered`, "PacketRegistry/registerHandler");
1439
+ }
1440
+ getHandler(id) {
1441
+ if (!this.handlers.has(id))
1442
+ throw new Error(`Invalid handler with id ${id.toString(16)}!`);
1443
+ return this.handlers.get(id);
1444
+ }
1445
+ /**
1446
+ * Merge two handlers.
1447
+ * This is useful if you want to extend a handler without actually replacing it.
1448
+ *
1449
+ * @param handler - the first handler, executed first.
1450
+ * @param handler2 - the second handler.
1451
+ */
1452
+ appendHandler(handler, handler2) {
1453
+ const res = new class Handler {
1454
+ async handle(packet, server, session) {
1455
+ await handler.handle(packet, server, session);
1456
+ await handler2.handle(packet, server, session);
1457
+ }
1458
+ }();
1459
+ return res;
1460
+ }
1461
+ /**
1462
+ * Remove a handler from the registry.
1463
+ * @param id - the handler id.
1464
+ */
1465
+ removeHandler(id) {
1466
+ this.handlers.delete(id);
1467
+ }
1468
+ /**
1469
+ * Dynamically register all packets exported by './Protocol'.
1470
+ */
1471
+ async registerPackets() {
1472
+ const timer = new Timer();
1473
+ Object.entries(Packets).filter(([, value]) => value.name !== "DataPacket" && value.name !== "BatchPacket").map(([, value]) => this.registerPacket(value));
1474
+ this.server.getLogger()?.verbose(
1475
+ `Registered §b${this.packets.size}§r of §b${Array.from(Object.keys(Identifiers)).length - 2}§r packet(s) (took ${timer.stop()} ms)!`,
1476
+ "PacketRegistry/registerPackets"
1477
+ );
1478
+ }
1479
+ /**
1480
+ * Dynamically register all handlers exported by './Handlers'.
1481
+ */
1482
+ async registerHandlers() {
1483
+ const timer = new Timer();
1484
+ Object.entries(Handlers).map(([, value]) => this.registerHandler(value.NetID, new value()));
1485
+ this.server.getLogger()?.verbose(
1486
+ `Registered §b${this.handlers.size}§r packet handler(s) (took ${timer.stop()} ms)!`,
1487
+ "PacketRegistry/registerHandlers"
1488
+ );
1489
+ }
1490
+ /**
1491
+ * Get all packets from the registry.
1492
+ */
1493
+ getPackets() {
1494
+ return this.packets;
1495
+ }
1496
+ /**
1497
+ * Get all handlers from the registry.
1498
+ */
1499
+ getHandlers() {
1500
+ return this.handlers;
1501
+ }
1502
+ }
1503
+
1504
+ class Server {
1505
+ version;
1506
+ raknet;
1507
+ logger;
1508
+ config;
1509
+ tps = 20;
1510
+ console;
1511
+ eventManager = new EventManager();
1512
+ packetRegistry;
1513
+ sessionManager = new SessionManager();
1514
+ pluginManager;
1515
+ commandManager;
1516
+ worldManager;
1517
+ itemManager;
1518
+ blockManager;
1519
+ queryManager;
1520
+ chatManager;
1521
+ permissionManager;
1522
+ banManager;
1523
+ stopping = false;
1524
+ tickerTimer;
1525
+ static MINECRAFT_TICK_TIME_MS = 1e3 / 20;
1526
+ /**
1527
+ * @deprecated
1528
+ */
1529
+ static instance;
1530
+ constructor({ logger, config, version }) {
1531
+ const advertisedVersion = Identifiers.MinecraftVersions.length <= 1 ? `§ev${Identifiers.MinecraftVersions.at(0)}§r` : `§ev${Identifiers.MinecraftVersions.at(0)}§r-§ev${Identifiers.MinecraftVersions.at(-1)}§r`;
1532
+ logger?.info(
1533
+ `Starting JSPrismarine server version §ev${version}§r for Minecraft: Bedrock Edition ${advertisedVersion} (protocol version §e${Identifiers.Protocol}§r)`,
1534
+ "Server"
1535
+ );
1536
+ this.version = version;
1537
+ this.logger = logger;
1538
+ this.config = config;
1539
+ this.console = new Console(this);
1540
+ this.packetRegistry = new PacketRegistry(this);
1541
+ this.itemManager = new ItemManager(this);
1542
+ this.blockManager = new BlockManager(this);
1543
+ this.worldManager = new WorldManager(this);
1544
+ this.commandManager = new CommandManager(this);
1545
+ this.pluginManager = new PluginManager(this);
1546
+ this.queryManager = new QueryManager(this);
1547
+ this.chatManager = new ChatManager(this);
1548
+ this.permissionManager = new PermissionManager(this);
1549
+ this.banManager = new BanManager(this);
1550
+ Server.instance = this;
1551
+ }
1552
+ async onEnable() {
1553
+ this.config.onEnable();
1554
+ await this.logger.onEnable();
1555
+ await this.permissionManager.onEnable();
1556
+ await this.pluginManager.onEnable();
1557
+ await this.banManager.onEnable();
1558
+ await this.itemManager.onEnable();
1559
+ await this.blockManager.onEnable();
1560
+ await this.commandManager.onEnable();
1561
+ }
1562
+ async onDisable() {
1563
+ await this.commandManager.onDisable();
1564
+ await this.blockManager.onDisable();
1565
+ await this.itemManager.onDisable();
1566
+ await this.banManager.onDisable();
1567
+ await this.pluginManager.onDisable();
1568
+ await this.permissionManager.onDisable();
1569
+ await this.packetRegistry.onDisable();
1570
+ this.config.onDisable();
1571
+ await this.logger.onDisable();
1572
+ }
1573
+ async reload() {
1574
+ await this.onDisable();
1575
+ await this.onEnable();
1576
+ }
1577
+ async bootstrap(serverIp = "0.0.0.0", port = 19132) {
1578
+ await this.onEnable();
1579
+ BlockMappings.initMappings();
1580
+ await this.worldManager.onEnable();
1581
+ await this.packetRegistry.onEnable();
1582
+ this.raknet = new RakNetListener(this.getConfig().getMaxPlayers(), false);
1583
+ this.raknet.start(serverIp, port);
1584
+ this.raknet.on("openConnection", async (session) => {
1585
+ const event = new RaknetConnectEvent(session);
1586
+ await this.eventManager.emit("raknetConnect", event);
1587
+ if (event.isCancelled()) {
1588
+ session.disconnect();
1589
+ return;
1590
+ }
1591
+ const token = session.getAddress().toToken();
1592
+ if (this.sessionManager.has(token)) {
1593
+ this.logger.error(
1594
+ `Another client with token (${token}) is already connected!`,
1595
+ "Server/listen/openConnection"
1596
+ );
1597
+ session.disconnect("Already connected from another location");
1598
+ return;
1599
+ }
1600
+ const timer = new Timer();
1601
+ this.logger.debug(`${token} is attempting to connect`, "Server/listen/openConnection");
1602
+ this.sessionManager.add(token, new ClientConnection(session, this.logger));
1603
+ this.logger.verbose(`New connection handling took ${timer.stop()} ms`, "Server/listen/openConnection");
1604
+ });
1605
+ this.raknet.on("closeConnection", async (inetAddr, reason) => {
1606
+ const event = new RaknetDisconnectEvent(inetAddr, reason);
1607
+ await this.eventManager.emit("raknetDisconnect", event);
1608
+ const time = Date.now();
1609
+ const token = inetAddr.toToken();
1610
+ try {
1611
+ const player = this.sessionManager.getPlayer(token);
1612
+ await player.getNetworkSession().removeFromPlayerList();
1613
+ for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1614
+ await player.getNetworkSession().sendDespawn(onlinePlayer);
1615
+ }
1616
+ if (player.getName()) {
1617
+ const event2 = new ChatEvent(
1618
+ new Chat(
1619
+ this.console,
1620
+ `§e%multiplayer.player.left`,
1621
+ [player.getName()],
1622
+ true,
1623
+ "*.everyone",
1624
+ ChatType.TRANSLATION
1625
+ )
1626
+ );
1627
+ await this.eventManager.emit("chat", event2);
1628
+ }
1629
+ await player.onDisable();
1630
+ await player.getWorld().removeEntity(player);
1631
+ this.sessionManager.remove(token);
1632
+ } catch (error) {
1633
+ this.logger.debug(
1634
+ `Cannot remove connection from non-existing player (${token})`,
1635
+ "Server/listen/raknetDisconnect"
1636
+ );
1637
+ this.logger.error(error, "Server/listen/raknetDisconnect");
1638
+ }
1639
+ this.logger.debug(`${token} disconnected due to ${reason}`, "Server/listen/raknetDisconnect");
1640
+ this.logger.debug(
1641
+ `Player destruction took about ${Date.now() - time} ms`,
1642
+ "Server/listen/raknetDisconnect"
1643
+ );
1644
+ });
1645
+ this.raknet.on("encapsulated", async (packet, inetAddr) => {
1646
+ const event = new RaknetEncapsulatedPacketEvent(inetAddr, packet);
1647
+ await this.eventManager.emit("raknetEncapsulatedPacket", event);
1648
+ let connection;
1649
+ if ((connection = this.sessionManager.get(inetAddr.toToken()) ?? null) === null) {
1650
+ this.logger.error(`Got a packet from a closed connection (${inetAddr.toToken()})`);
1651
+ return;
1652
+ }
1653
+ try {
1654
+ const batched = new BatchPacket(packet.content);
1655
+ batched.compressed = connection.hasCompression;
1656
+ for (const buf of await batched.asyncDecode()) {
1657
+ const pid = buf[0];
1658
+ if (!this.packetRegistry.getPackets().has(pid)) {
1659
+ this.logger.warn(
1660
+ `Packet 0x${pid.toString(16)} isn't implemented`,
1661
+ "Server/listen/raknetEncapsulatedPacket"
1662
+ );
1663
+ continue;
1664
+ }
1665
+ const packet2 = new (this.packetRegistry.getPackets().get(pid))(buf);
1666
+ try {
1667
+ packet2.decode();
1668
+ } catch (error) {
1669
+ this.logger.error(error);
1670
+ this.logger.error(
1671
+ `Error while decoding packet: ${packet2.constructor.name}: ${error}`,
1672
+ "Server/listen/raknetEncapsulatedPacket"
1673
+ );
1674
+ continue;
1675
+ }
1676
+ try {
1677
+ const handler = this.packetRegistry.getHandler(pid);
1678
+ this.logger.silly(
1679
+ `Received §b${packet2.constructor.name}§r packet`,
1680
+ "Server/listen/raknetEncapsulatedPacket"
1681
+ );
1682
+ await handler.handle(packet2, this, connection.getPlayerSession() ?? connection);
1683
+ } catch (error) {
1684
+ this.logger.error(
1685
+ `Handler error ${packet2.constructor.name}-handler: (${error})`,
1686
+ "Server/listen/raknetEncapsulatedPacket"
1687
+ );
1688
+ this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1689
+ }
1690
+ }
1691
+ } catch (error) {
1692
+ this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1693
+ }
1694
+ });
1695
+ this.raknet.on("raw", async (buffer, inetAddr) => {
1696
+ try {
1697
+ await this.queryManager.onRaw(buffer, inetAddr);
1698
+ } catch (error) {
1699
+ this.logger.error(error, "Server/listen/raw");
1700
+ this.logger.verbose(`QueryManager failed with error: ${error}`, "Server/listen/raw");
1701
+ }
1702
+ });
1703
+ let tickCount = 0;
1704
+ const tick = () => setTimeout(() => {
1705
+ const event = new TickEvent(tickCount);
1706
+ void this.eventManager.emit("tick", event);
1707
+ for (const world of this.worldManager.getWorlds()) {
1708
+ void world.update(event.getTick());
1709
+ }
1710
+ ++tickCount;
1711
+ tick();
1712
+ }, Server.MINECRAFT_TICK_TIME_MS);
1713
+ this.tickerTimer = tick();
1714
+ this.tickerTimer.unref();
1715
+ this.logger.info(`JSPrismarine is now listening on port §b${port}`, "Server/listen");
1716
+ }
1717
+ /**
1718
+ * Kills the server asynchronously.
1719
+ */
1720
+ async shutdown(options) {
1721
+ if (this.stopping)
1722
+ return;
1723
+ this.stopping = true;
1724
+ this.logger.info("Stopping server", "Server/kill");
1725
+ await this.console.onDisable();
1726
+ clearInterval(this.tickerTimer);
1727
+ try {
1728
+ for (const player of this.sessionManager.getAllPlayers()) {
1729
+ await player.kick("Server closed.");
1730
+ }
1731
+ if (!options?.withoutSaving)
1732
+ await this.worldManager.save();
1733
+ await this.worldManager.onDisable();
1734
+ await this.onDisable();
1735
+ this.raknet.kill();
1736
+ process.exit(options?.crash ? 1 : 0);
1737
+ } catch (error) {
1738
+ this.logger.error(error, "Server/kill");
1739
+ process.exit(1);
1740
+ }
1741
+ }
1742
+ async broadcastPacket(dataPacket) {
1743
+ for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1744
+ await onlinePlayer.getNetworkSession().getConnection().sendDataPacket(dataPacket);
1745
+ }
1746
+ }
1747
+ getVersion() {
1748
+ return this.version;
1749
+ }
1750
+ getIdentifiers() {
1751
+ return Identifiers;
1752
+ }
1753
+ /**
1754
+ * Returns the query manager
1755
+ */
1756
+ getQueryManager() {
1757
+ return this.queryManager;
1758
+ }
1759
+ /**
1760
+ * Returns the command manager
1761
+ */
1762
+ getCommandManager() {
1763
+ return this.commandManager;
1764
+ }
1765
+ /**
1766
+ * Returns the player manager
1767
+ */
1768
+ getSessionManager() {
1769
+ return this.sessionManager;
1770
+ }
1771
+ /**
1772
+ * Returns the world manager
1773
+ */
1774
+ getWorldManager() {
1775
+ return this.worldManager;
1776
+ }
1777
+ /**
1778
+ * Returns the item manager
1779
+ */
1780
+ getItemManager() {
1781
+ return this.itemManager;
1782
+ }
1783
+ /**
1784
+ * Returns the block manager
1785
+ */
1786
+ getBlockManager() {
1787
+ return this.blockManager;
1788
+ }
1789
+ /**
1790
+ * Returns the logger
1791
+ */
1792
+ getLogger() {
1793
+ return this.logger;
1794
+ }
1795
+ /**
1796
+ * Returns the packet registry
1797
+ */
1798
+ getPacketRegistry() {
1799
+ return this.packetRegistry;
1800
+ }
1801
+ /**
1802
+ * Returns the raknet instance
1803
+ */
1804
+ getRaknet() {
1805
+ return this.raknet;
1806
+ }
1807
+ /**
1808
+ * Returns the plugin manager
1809
+ */
1810
+ getPluginManager() {
1811
+ return this.pluginManager;
1812
+ }
1813
+ /**
1814
+ * Returns the event manager
1815
+ */
1816
+ getEventManager() {
1817
+ return this.eventManager;
1818
+ }
1819
+ /**
1820
+ * Returns the chat manager
1821
+ */
1822
+ getChatManager() {
1823
+ return this.chatManager;
1824
+ }
1825
+ /**
1826
+ * Returns the config
1827
+ */
1828
+ getConfig() {
1829
+ return this.config;
1830
+ }
1831
+ /**
1832
+ * Returns the console instance
1833
+ */
1834
+ getConsole() {
1835
+ return this.console;
1836
+ }
1837
+ /**
1838
+ * Returns the permission manager
1839
+ */
1840
+ getPermissionManager() {
1841
+ return this.permissionManager;
1842
+ }
1843
+ /**
1844
+ * Returns the ban manager
1845
+ */
1846
+ getBanManager() {
1847
+ return this.banManager;
1848
+ }
1849
+ /**
1850
+ * Returns this Prismarine instance
1851
+ */
1852
+ getServer() {
1853
+ return this;
1854
+ }
1855
+ /**
1856
+ * Returns the current TPS
1857
+ */
1858
+ getTPS() {
1859
+ return this.tps;
1860
+ }
1861
+ }
1862
+
1863
+ export { BooleanArgumentCommand as B, CommandArgument as C, Handlers as H, LoginHandler as L, Player as P, Server as S, VANILLA_DEFAULT_SPAWN_RADIUS as V, PlayerSession as a, CommandArgumentCommand as b, CommandArgumentEntity as c, CommandArgumentGamemode as d, CommandArgumentMob as e, CommandArgumentPosition as f, PlayerArgumentCommand as g, ClientConnection as h, PacketRegistry as i };
1864
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVyLURBWG1PMlJtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29tbWFuZC9Db21tYW5kQXJndW1lbnRzLnRzIiwiLi4vc3JjL25ldHdvcmsvaGFuZGxlci9Mb2dpbkhhbmRsZXIudHMiLCIuLi9zcmMvbmV0d29yay9QbGF5ZXJTZXNzaW9uLnRzIiwiLi4vc3JjL1BsYXllci50cyIsIi4uL3NyYy9uZXR3b3JrL0NsaWVudENvbm5lY3Rpb24udHMiLCIuLi9zcmMvbmV0d29yay9QYWNrZXRSZWdpc3RyeS50cyIsIi4uL3NyYy9TZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRW50aXRpZXMgZnJvbSAnLi4vZW50aXR5L0VudGl0aWVzJztcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kQ29udGV4dCwgU3RyaW5nUmVhZGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IHsgU3VnZ2VzdGlvbnMgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JyaWdhZGllcic7XG5pbXBvcnQgQ29tbWFuZFBhcmFtZXRlciwgeyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MsIENvbW1hbmRQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnLi4vbmV0d29yay90eXBlL0NvbW1hbmRQYXJhbWV0ZXInO1xuXG5pbXBvcnQgQ29tbWFuZEVudW0gZnJvbSAnLi4vbmV0d29yay90eXBlL0NvbW1hbmRFbnVtJztcbmltcG9ydCBHYW1lbW9kZSBmcm9tICcuLi93b3JsZC9HYW1lbW9kZSc7XG5pbXBvcnQgUGFyc2VUYXJnZXRTZWxlY3RvciBmcm9tICcuLi91dGlscy9QYXJzZVRhcmdldFNlbGVjdG9yJztcbmltcG9ydCBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbiBmcm9tICcuLi91dGlscy9QYXJzZVRpbGRlQ2FyZXROb3RhdGlvbic7XG5pbXBvcnQgdHlwZSBQbGF5ZXIgZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJy4uLyc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdnYW1lTW9kZSc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBnbSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG5cbiAgICAgICAgR2FtZW1vZGUuZ2V0R2FtZW1vZGVJZChnbSk7XG4gICAgICAgIHJldHVybiBnbTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGxpc3RTdWdnZXN0aW9ucyhfY29udGV4dDogYW55LCBfYnVpbGRlcjogYW55KSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgcmV0dXJuIFN1Z2dlc3Rpb25zLmVtcHR5KCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRFeGFtcGxlcygpIHtcbiAgICAgICAgcmV0dXJuIFsnc3Vydml2YWwnLCAnY3JlYXRpdmUnLCAnYWR2ZW50dXJlJywgJ3NwZWN0YXRvciddO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBnYW1lTW9kZUVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgZ2FtZU1vZGVFbnVtLmVudW1OYW1lID0gJ0dhbWVNb2RlJztcblxuICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBkeW5hbWljXG4gICAgICAgIGdhbWVNb2RlRW51bS5lbnVtVmFsdWVzID0gWydzdXJ2aXZhbCcsICdjcmVhdGl2ZScsICdhZHZlbnR1cmUnLCAnc3BlY3RhdG9yJ107XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGdhbWVNb2RlRW51bSxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudE1vYiBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdlbnRpdHlUeXBlJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmICghcmVhZGVyLmNhblJlYWQoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgbGlzdFN1Z2dlc3Rpb25zKF9jb250ZXh0OiBhbnksIF9idWlsZGVyOiBhbnkpIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICByZXR1cm4gU3VnZ2VzdGlvbnMuZW1wdHkoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEV4YW1wbGVzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVR5cGVFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGVudGl0eVR5cGVFbnVtLmVudW1OYW1lID0gJ0VudGl0eVR5cGUnO1xuICAgICAgICBlbnRpdHlUeXBlRW51bS5lbnVtVmFsdWVzID0gT2JqZWN0LmVudHJpZXMoRW50aXRpZXMpLm1hcCgoWywgZW50aXR5XSkgPT4gZW50aXR5Lk1PQl9JRCk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGVudGl0eVR5cGVFbnVtLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50RW50aXR5IGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3RhcmdldCc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBwbGF5ZXIgPSAnJztcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmICghcmVhZGVyLmNhblJlYWQoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxheWVyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxheWVyLnN0YXJ0c1dpdGgoJ0AnKSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVGFyZ2V0U2VsZWN0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzOiBjb250ZXh0LmdldFNvdXJjZSgpLmdldFdvcmxkKCkuZ2V0RW50aXRpZXMoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShlcnJvciBhcyBhbnkpLm1lc3NhZ2UuaW5jbHVkZXMoJ25vIHJlc3VsdHMnKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dC5nZXRTb3VyY2UoKS5nZXRTZXJ2ZXIoKS5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckJ5RXhhY3ROYW1lKHBsYXllcildOyAvLyBUT0RPOiBieSBuYW1lIG5vdCBleGFjdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5UYXJnZXQsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudFBvc2l0aW9uIGV4dGVuZHMgVmVjdG9yMyBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdwb3NpdGlvbic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGdldFBvcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSAnJztcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkZXIuY2FuUmVhZCgpKSBicmVhaztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zICs9IGNoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2V0WChcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd4J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmVhZGVyLnNraXAoKTtcbiAgICAgICAgdGhpcy5zZXRZKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3knXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZWFkZXIuc2tpcCgpO1xuICAgICAgICB0aGlzLnNldFooXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneidcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdjb21tYW5kJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdib29sZWFuJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW4gPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIGlmIChib29sZWFuID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgYm9vbGVhbkVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgYm9vbGVhbkVudW0uZW51bU5hbWUgPSAnQm9vbGVhbic7XG4gICAgICAgIGJvb2xlYW5FbnVtLmVudW1WYWx1ZXMgPSBbJ3RydWUnLCAnZmFsc2UnXTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZW51bTogYm9vbGVhbkVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJBcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAncGxheWVyJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IHBsYXllckVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgcGxheWVyRW51bS5lbnVtTmFtZSA9ICdQbGF5ZXInO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGxheWVyRW51bS5lbnVtVmFsdWVzID0gU2VydmVyLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBwbGF5ZXJFbnVtLmVudW1WYWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IHBsYXllckVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBDbGllbnRDb25uZWN0aW9uIGZyb20gJy4uL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4uL0lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIExvZ2luUGFja2V0IGZyb20gJy4uL3BhY2tldC9Mb2dpblBhY2tldCc7XG5pbXBvcnQgeyBQbGF5U3RhdHVzUGFja2V0IH0gZnJvbSAnLi4vUGFja2V0cyc7XG5pbXBvcnQgUGxheVN0YXR1c1R5cGUgZnJvbSAnLi4vdHlwZS9QbGF5U3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHR5cGUgUHJlTG9naW5QYWNrZXRIYW5kbGVyIGZyb20gJy4vUHJlTG9naW5QYWNrZXRIYW5kbGVyJztcbmltcG9ydCBSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCBmcm9tICcuLi9wYWNrZXQvUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uLy4uL1NlcnZlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2luSGFuZGxlciBpbXBsZW1lbnRzIFByZUxvZ2luUGFja2V0SGFuZGxlcjxMb2dpblBhY2tldD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5Mb2dpblBhY2tldDtcblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocGFja2V0OiBMb2dpblBhY2tldCwgc2VydmVyOiBTZXJ2ZXIsIGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgcGxheWVyIGNvdW50ID49IG1heCBwbGF5ZXJzXG5cbiAgICAgICAgY29uc3QgcGxheVN0YXR1cyA9IG5ldyBQbGF5U3RhdHVzUGFja2V0KCk7XG5cbiAgICAgICAgLy8gS2ljayBjbGllbnQgaWYgaGFzIG5ld2VyIC8gb2xkZXIgY2xpZW50IHZlcnNpb25cbiAgICAgICAgaWYgKHBhY2tldC5wcm90b2NvbCAhPT0gSWRlbnRpZmllcnMuUHJvdG9jb2wpIHtcbiAgICAgICAgICAgIHBsYXlTdGF0dXMuc3RhdHVzID1cbiAgICAgICAgICAgICAgICBwYWNrZXQucHJvdG9jb2wgPCBJZGVudGlmaWVycy5Qcm90b2NvbFxuICAgICAgICAgICAgICAgICAgICA/IFBsYXlTdGF0dXNUeXBlLkxvZ2luRmFpbGVkQ2xpZW50XG4gICAgICAgICAgICAgICAgICAgIDogUGxheVN0YXR1c1R5cGUuTG9naW5GYWlsZWRTZXJ2ZXI7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBsYXlTdGF0dXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2ljayB0aGUgcGxheWVyIGlmIHRoZWlyIHVzZXJuYW1lIGlzIGludmFsaWRcbiAgICAgICAgaWYgKCFwYWNrZXQuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgnSW52YWxpZCB1c2VybmFtZSEnLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgdHJhc2hcbiAgICAgICAgY29uc3Qgd29ybGQgPSBzZXJ2ZXIuZ2V0V29ybGRNYW5hZ2VyKCkuZ2V0RGVmYXVsdFdvcmxkKCkhO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBuZXcgUGxheWVyKGNvbm5lY3Rpb24sIHdvcmxkLCBzZXJ2ZXIpO1xuICAgICAgICBwbGF5ZXIudXNlcm5hbWUubmFtZSA9IHBhY2tldC5kaXNwbGF5TmFtZTtcbiAgICAgICAgcGxheWVyLmxvY2FsZSA9IHBhY2tldC5sYW5ndWFnZUNvZGU7XG4gICAgICAgIHBsYXllci5yYW5kb21JZCA9IHBhY2tldC5jbGllbnRSYW5kb21JZDtcbiAgICAgICAgcGxheWVyLnV1aWQgPSBwYWNrZXQuaWRlbnRpdHk7XG4gICAgICAgIHBsYXllci54dWlkID0gcGFja2V0LlhVSUQ7XG4gICAgICAgIHBsYXllci5za2luID0gcGFja2V0LnNraW47XG4gICAgICAgIHBsYXllci5kZXZpY2UgPSBwYWNrZXQuZGV2aWNlO1xuXG4gICAgICAgIC8vIFBsYXllciB3aXRoIHNhbWUgbmFtZSBpcyBhbHJlYWR5IG9ubGluZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb2xkUGxheWVyID0gc2VydmVyLmdldFNlc3Npb25NYW5hZ2VyKCkuZ2V0UGxheWVyQnlFeGFjdE5hbWUocGFja2V0LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IG9sZFBsYXllci5raWNrKCdMb2dnZWQgaW4gZnJvbSBhbm90aGVyIGxvY2F0aW9uJyk7XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICBpZiAoIXBsYXllci54dWlkICYmIHNlcnZlci5nZXRDb25maWcoKS5nZXRPbmxpbmVNb2RlKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHBsYXllci5raWNrKCdTZXJ2ZXIgaXMgaW4gb25saW5lLW1vZGUhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBwbGF5ZXIub25FbmFibGUoKTtcblxuICAgICAgICAvLyBUT0RPOiBlbmNyeXB0aW9uIGhhbmRzaGFrZVxuXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHNlcnZlci5nZXRCYW5NYW5hZ2VyKCkuaXNCYW5uZWQocGxheWVyKTtcbiAgICAgICAgaWYgKHJlYXNvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHBsYXllci5raWNrKGBZb3UgaGF2ZSBiZWVuIGJhbm5lZCR7cmVhc29uID8gYCBmb3IgcmVhc29uOiAke3JlYXNvbn1gIDogJyd9IWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5ZXIgY29ubmVjdGlvbiB0byBiZSByZWNvZ25pemVkIGFzIGEgY29ubmVjdGVkIHBsYXllclxuICAgICAgICBjb25zdCBzZXNzaW9uID0gY29ubmVjdGlvbi5pbml0UGxheWVyQ29ubmVjdGlvbihzZXJ2ZXIsIHBsYXllcik7XG4gICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuTG9naW5TdWNjZXNzKTtcblxuICAgICAgICBhd2FpdCB3b3JsZC5hZGRFbnRpdHkocGxheWVyKTtcblxuICAgICAgICAvLyBGaW5hbGl6ZSBjb25uZWN0aW9uIGhhbmRzaGFrZVxuICAgICAgICBjb25zdCByZXNvdXJjZVBhY2tzSW5mbyA9IG5ldyBSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCgpO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5yZXNvdXJjZVBhY2tSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5mb3JjZVNlcnZlclBhY2tzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5oYXNTY3JpcHRzID0gZmFsc2U7XG4gICAgICAgIHJlc291cmNlUGFja3NJbmZvLmhhc0FkZG9uUGFja3MgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChyZXNvdXJjZVBhY2tzSW5mbywgdHJ1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZEFyZ3VtZW50RW50aXR5LCBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSB9IGZyb20gJy4uL2NvbW1hbmQvQ29tbWFuZEFyZ3VtZW50cyc7XG5pbXBvcnQgQ29tbWFuZFBhcmFtZXRlciwgeyBDb21tYW5kUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4vdHlwZS9Db21tYW5kUGFyYW1ldGVyJztcbmltcG9ydCB0eXBlIHsgQ2h1bmtDb29yZCB9IGZyb20gJy4vcGFja2V0L05ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCc7XG5pbXBvcnQgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0IGZyb20gJy4vcGFja2V0L05ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCc7XG5pbXBvcnQgUGxheWVyTGlzdFBhY2tldCwgeyBQbGF5ZXJMaXN0QWN0aW9uLCBQbGF5ZXJMaXN0RW50cnkgfSBmcm9tICcuL3BhY2tldC9QbGF5ZXJMaXN0UGFja2V0JztcbmltcG9ydCBVcGRhdGVBYmlsaXRpZXNQYWNrZXQsIHtcbiAgICBBYmlsaXR5TGF5ZXIsXG4gICAgQWJpbGl0eUxheWVyRmxhZyxcbiAgICBBYmlsaXR5TGF5ZXJUeXBlXG59IGZyb20gJy4vcGFja2V0L1VwZGF0ZUFiaWxpdGllc1BhY2tldCc7XG5cbmltcG9ydCBBZGRQbGF5ZXJQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQWRkUGxheWVyUGFja2V0JztcbmltcG9ydCB0eXBlIHsgQXR0cmlidXRlIH0gZnJvbSAnLi4vZW50aXR5L0F0dHJpYnV0ZSc7XG5pbXBvcnQgQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQnO1xuaW1wb3J0IHsgQmF0Y2hQYWNrZXQgfSBmcm9tICcuL1BhY2tldHMnO1xuaW1wb3J0IEJsb2NrUG9zaXRpb24gZnJvbSAnLi4vd29ybGQvQmxvY2tQb3NpdGlvbic7XG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi4vd29ybGQvY2h1bmsvQ2h1bmsnO1xuaW1wb3J0IENodW5rUmFkaXVzVXBkYXRlZFBhY2tldCBmcm9tICcuL3BhY2tldC9DaHVua1JhZGl1c1VwZGF0ZWRQYWNrZXQnO1xuaW1wb3J0IHR5cGUgQ2xpZW50Q29ubmVjdGlvbiBmcm9tICcuL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IENvbW1hbmREYXRhIGZyb20gJy4vdHlwZS9Db21tYW5kRGF0YSc7XG5pbXBvcnQgQ29tbWFuZEVudW0gZnJvbSAnLi90eXBlL0NvbW1hbmRFbnVtJztcbmltcG9ydCBDb29yZGluYXRlVXRpbHMgZnJvbSAnLi4vd29ybGQvQ29vcmRpbmF0ZVV0aWxzJztcbmltcG9ydCBDcmVhdGl2ZUNvbnRlbnRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQ3JlYXRpdmVDb250ZW50UGFja2V0JztcbmltcG9ydCBEaXNjb25uZWN0UGFja2V0IGZyb20gJy4vcGFja2V0L0Rpc2Nvbm5lY3RQYWNrZXQnO1xuaW1wb3J0IEdhbWVtb2RlIGZyb20gJy4uL3dvcmxkL0dhbWVtb2RlJztcbmltcG9ydCBIZWFwIGZyb20gJ2hlYXAnO1xuaW1wb3J0IHR5cGUgSUZvcm0gZnJvbSAnLi4vZm9ybS9JRm9ybSc7XG5pbXBvcnQgSW52ZW50b3J5Q29udGVudFBhY2tldCBmcm9tICcuL3BhY2tldC9JbnZlbnRvcnlDb250ZW50UGFja2V0JztcbmltcG9ydCBJdGVtIGZyb20gJy4uL2l0ZW0vSXRlbSc7XG5pbXBvcnQgTGV2ZWxDaHVua1BhY2tldCBmcm9tICcuL3BhY2tldC9MZXZlbENodW5rUGFja2V0JztcbmltcG9ydCBNb2JFcXVpcG1lbnRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTW9iRXF1aXBtZW50UGFja2V0JztcbmltcG9ydCBNb2RhbEZvcm1SZXF1ZXN0UGFja2V0IGZyb20gJy4vcGFja2V0L01vZGFsRm9ybVJlcXVlc3RQYWNrZXQnO1xuaW1wb3J0IE1vdmVQbGF5ZXJQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTW92ZVBsYXllclBhY2tldCc7XG5pbXBvcnQgTW92ZW1lbnRUeXBlIGZyb20gJy4vdHlwZS9Nb3ZlbWVudFR5cGUnO1xuaW1wb3J0IFBlcm1pc3Npb25UeXBlIGZyb20gJy4vdHlwZS9QZXJtaXNzaW9uVHlwZSc7XG5pbXBvcnQgUGxheVN0YXR1c1BhY2tldCBmcm9tICcuL3BhY2tldC9QbGF5U3RhdHVzUGFja2V0JztcbmltcG9ydCB0eXBlIFBsYXllciBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IFBsYXllclBlcm1pc3Npb25UeXBlIGZyb20gJy4vdHlwZS9QbGF5ZXJQZXJtaXNzaW9uVHlwZSc7XG5pbXBvcnQgUmVtb3ZlQWN0b3JQYWNrZXQgZnJvbSAnLi9wYWNrZXQvUmVtb3ZlQWN0b3JQYWNrZXQnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgU2V0QWN0b3JEYXRhUGFja2V0IGZyb20gJy4vcGFja2V0L1NldEFjdG9yRGF0YVBhY2tldCc7XG5pbXBvcnQgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQgZnJvbSAnLi9wYWNrZXQvU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQnO1xuaW1wb3J0IFNldFRpbWVQYWNrZXQgZnJvbSAnLi9wYWNrZXQvU2V0VGltZVBhY2tldCc7XG5pbXBvcnQgVGV4dFBhY2tldCBmcm9tICcuL3BhY2tldC9UZXh0UGFja2V0JztcbmltcG9ydCBUZXh0VHlwZSBmcm9tICcuL3R5cGUvVGV4dFR5cGUnO1xuaW1wb3J0IFRvYXN0UmVxdWVzdFBhY2tldCBmcm9tICcuL3BhY2tldC9Ub2FzdFJlcXVlc3RQYWNrZXQnO1xuaW1wb3J0IFVVSUQgZnJvbSAnLi4vdXRpbHMvVVVJRCc7XG5pbXBvcnQgVXBkYXRlQWR2ZW50dXJlU2V0dGluZ3NQYWNrZXQgZnJvbSAnLi9wYWNrZXQvVXBkYXRlQWR2ZW50dXJlU2V0dGluZ3NQYWNrZXQnO1xuaW1wb3J0IFVwZGF0ZUF0dHJpYnV0ZXNQYWNrZXQgZnJvbSAnLi9wYWNrZXQvVXBkYXRlQXR0cmlidXRlc1BhY2tldCc7XG5pbXBvcnQgeyBXaW5kb3dJZHMgfSBmcm9tICcuLi9pbnZlbnRvcnkvV2luZG93TWFuYWdlcic7XG5pbXBvcnQgeyBjcmVhdGl2ZWl0ZW1zIH0gZnJvbSAnQGpzcHJpc21hcmluZS9iZWRyb2NrLWRhdGEnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbGF5ZXJTZXNzaW9uIHtcbiAgICBwcml2YXRlIGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb247XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2ZXI6IFNlcnZlcjtcbiAgICBwcml2YXRlIHBsYXllcjogUGxheWVyO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaHVua1NlbmRRdWV1ZTogQ2h1bmtbXSA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVkQ2h1bmtzOiBTZXQ8YmlnaW50PiA9IG5ldyBTZXQoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdDaHVua3M6IFNldDxiaWdpbnQ+ID0gbmV3IFNldCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyLCBjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uLCBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShfdGljazogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNodW5rU2VuZFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rc1RvU2VuZCA9IHRoaXMuY2h1bmtTZW5kUXVldWUuc3BsaWNlKDAsIE1hdGgubWluKHRoaXMuY2h1bmtTZW5kUXVldWUubGVuZ3RoLCA1MCkpO1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgQmF0Y2hQYWNrZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzVG9TZW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuICAgICAgICAgICAgICAgIHBrLmNodW5rWCA9IGNodW5rLmdldFgoKTtcbiAgICAgICAgICAgICAgICBway5jaHVua1ogPSBjaHVuay5nZXRaKCk7XG4gICAgICAgICAgICAgICAgcGsuY2xpZW50U3ViQ2h1bmtSZXF1ZXN0c0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBway5zdWJDaHVua0NvdW50ID0gY2h1bmsuZ2V0VG9wRW1wdHkoKSArIDQ7XG4gICAgICAgICAgICAgICAgcGsuZGF0YSA9IGNodW5rLm5ldHdvcmtTZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgICBiYXRjaC5hZGRQYWNrZXQocGspO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzaCA9IENodW5rLnBhY2tYWihjaHVuay5nZXRYKCksIGNodW5rLmdldFooKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuYWRkKGhhc2gpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZEJhdGNoKGJhdGNoLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsYXllci52aWV3RGlzdGFuY2UgJiYgKGF3YWl0IHRoaXMubmVlZE5ld0NodW5rcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpZnkgYSBjbGllbnQgYWJvdXQgY2hhbmdlKHMpIHRvIHRoZSBhZHZlbnR1cmUgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxheWVyIC0gVGhlIGNsaWVudC1jb250cm9sbGVkIGVudGl0eVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kU2V0dGluZ3MocGxheWVyPzogUGxheWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBsYXllciA/PyB0aGlzLnBsYXllcjtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBVcGRhdGVBZHZlbnR1cmVTZXR0aW5nc1BhY2tldCgpO1xuICAgICAgICBway53b3JsZEltbXV0YWJsZSA9IHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuU3BlY3RhdG9yO1xuICAgICAgICBway5ub0F0dGFja2luZ1BsYXllcnMgPSB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcjtcbiAgICAgICAgcGsubm9BdHRhY2tpbmdNb2JzID0gdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3I7XG4gICAgICAgIHBrLmF1dG9KdW1wID0gdHJ1ZTsgLy8gVE9ETzogZ3JhYiB0aGlzIGluZm8gZWxzZXdoZXJlXG4gICAgICAgIHBrLnNob3dOYW1lVGFncyA9IHRydWU7IC8vIFRPRE86IHBsYXllciBtYXkgYmUgYWJsZSB0byBoaWRlIHRoZW1cblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQWJpbGl0aWVzKHBsYXllcj86IFBsYXllcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwbGF5ZXIgPz8gdGhpcy5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQWJpbGl0aWVzUGFja2V0KCk7XG4gICAgICAgIHBrLmNvbW1hbmRQZXJtaXNzaW9uID0gdGFyZ2V0LmlzT3AoKSA/IFBlcm1pc3Npb25UeXBlLk9wZXJhdG9yIDogUGVybWlzc2lvblR5cGUuTm9ybWFsO1xuICAgICAgICBway5wbGF5ZXJQZXJtaXNzaW9uID0gdGFyZ2V0LmlzT3AoKSA/IFBsYXllclBlcm1pc3Npb25UeXBlLk9wZXJhdG9yIDogUGxheWVyUGVybWlzc2lvblR5cGUuTWVtYmVyO1xuICAgICAgICBway50YXJnZXRBY3RvclVuaXF1ZUlkID0gdGFyZ2V0LmdldFJ1bnRpbWVJZCgpO1xuXG4gICAgICAgIGNvbnN0IG1haW5MYXllciA9IG5ldyBBYmlsaXR5TGF5ZXIoKTtcbiAgICAgICAgbWFpbkxheWVyLmxheWVyVHlwZSA9IEFiaWxpdHlMYXllclR5cGUuQkFTRTtcbiAgICAgICAgbWFpbkxheWVyLmxheWVyRmxhZ3MgPSBuZXcgTWFwKFtcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkZMWV9TUEVFRCwgdHJ1ZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5XQUxLX1NQRUVELCB0cnVlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk1BWV9GTFksIHRhcmdldC5nZXRBbGxvd0ZsaWdodCgpXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkZMWUlORywgdGFyZ2V0LmlzRmx5aW5nKCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuTk9fQ0xJUCwgdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuT1BFUkFUT1JfQ09NTUFORFMsIHRhcmdldC5pc09wKCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuVEVMRVBPUlQsIHRhcmdldC5pc09wKCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuSU5WVUxORVJBQkxFLCB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk1VVEVELCBmYWxzZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5XT1JMRF9CVUlMREVSLCBmYWxzZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5JTlNUQUJVSUxELCB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkxJR0hUTklORywgZmFsc2VdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuQlVJTEQsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk1JTkUsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkRPT1JTX0FORF9TV0lUQ0hFUywgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuT1BFTl9DT05UQUlORVJTLCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5BVFRBQ0tfUExBWUVSUywgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuQVRUQUNLX01PQlMsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXVxuICAgICAgICBdKTtcbiAgICAgICAgbWFpbkxheWVyLmZseVNwZWVkID0gMC4wNTtcbiAgICAgICAgbWFpbkxheWVyLndhbGtTcGVlZCA9IDAuMTtcblxuICAgICAgICBway5hYmlsaXR5TGF5ZXJzID0gW21haW5MYXllcl07XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbmVlZE5ld0NodW5rcyhmb3JjZVJlc2VuZCA9IGZhbHNlLCBkaXN0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRYQ2h1bmsgPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLnBsYXllci5nZXRYKCkpO1xuICAgICAgICBjb25zdCBjdXJyZW50WkNodW5rID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy5wbGF5ZXIuZ2V0WigpKTtcblxuICAgICAgICBjb25zdCB2aWV3RGlzdGFuY2UgPSB0aGlzLnBsYXllci52aWV3RGlzdGFuY2UgfHwgZGlzdCB8fCAwO1xuXG4gICAgICAgIGNvbnN0IGNodW5rc1RvU2VuZEhlYXAgPSBuZXcgSGVhcCgoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXN0WEZpcnN0ID0gTWF0aC5hYnMoYVswXSEgLSBjdXJyZW50WENodW5rKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RYU2Vjb25kID0gTWF0aC5hYnMoYlswXSEgLSBjdXJyZW50WENodW5rKTtcblxuICAgICAgICAgICAgY29uc3QgZGlzdFpGaXJzdCA9IE1hdGguYWJzKGFbMV0hIC0gY3VycmVudFpDaHVuayk7XG4gICAgICAgICAgICBjb25zdCBkaXN0WlNlY29uZCA9IE1hdGguYWJzKGJbMV0hIC0gY3VycmVudFpDaHVuayk7XG5cbiAgICAgICAgICAgIHJldHVybiBkaXN0WEZpcnN0ICsgZGlzdFpGaXJzdCA+IGRpc3RYU2Vjb25kICsgZGlzdFpTZWNvbmQgPyAxIDogLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAobGV0IHNlbmRYQ2h1bmsgPSAtdmlld0Rpc3RhbmNlOyBzZW5kWENodW5rIDw9IHZpZXdEaXN0YW5jZTsgc2VuZFhDaHVuaysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzZW5kWkNodW5rID0gLXZpZXdEaXN0YW5jZTsgc2VuZFpDaHVuayA8PSB2aWV3RGlzdGFuY2U7IHNlbmRaQ2h1bmsrKykge1xuICAgICAgICAgICAgICAgIGlmIChzZW5kWENodW5rICogc2VuZFhDaHVuayArIHNlbmRaQ2h1bmsgKiBzZW5kWkNodW5rID4gdmlld0Rpc3RhbmNlICogdmlld0Rpc3RhbmNlKSBjb250aW51ZTsgLy8gZWFybHkgZXhpdCBpZiBjaHVuayBpcyBvdXRzaWRlIG9mIHZpZXcgZGlzdGFuY2VcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDaHVuayA9IFtjdXJyZW50WENodW5rICsgc2VuZFhDaHVuaywgY3VycmVudFpDaHVuayArIHNlbmRaQ2h1bmtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBDaHVuay5wYWNrWFoobmV3Q2h1bmtbMF0hLCBuZXdDaHVua1sxXSEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlUmVzZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rc1RvU2VuZEhlYXAucHVzaChuZXdDaHVuayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5sb2FkZWRDaHVua3MuaGFzKGhhc2gpICYmICF0aGlzLmxvYWRpbmdDaHVua3MuaGFzKGhhc2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rc1RvU2VuZEhlYXAucHVzaChuZXdDaHVuayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGNodW5rc1RvU2VuZEhlYXAuc2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY2xvc2VzdENodW5rID0gY2h1bmtzVG9TZW5kSGVhcC5wb3AoKSE7XG4gICAgICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmsucGFja1haKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgaWYgKGZvcmNlUmVzZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZENodW5rcy5oYXMoaGFzaCkgJiYgIXRoaXMubG9hZGluZ0NodW5rcy5oYXMoaGFzaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0Q2h1bmsoY2xvc2VzdENodW5rWzBdISwgY2xvc2VzdENodW5rWzFdISk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkQ2h1bmsgPSBhd2FpdCB0aGlzLnBsYXllci5nZXRXb3JsZCgpLmdldENodW5rKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRDaHVuayhsb2FkZWRDaHVuayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuYWRkKGhhc2gpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdENodW5rKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVubG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMubG9hZGVkQ2h1bmtzKSB7XG4gICAgICAgICAgICBjb25zdCBbeCwgel0gPSBDaHVuay51bnBhY2tYWihoYXNoKTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHghIC0gY3VycmVudFhDaHVuaykgPiB2aWV3RGlzdGFuY2UgfHwgTWF0aC5hYnMoeiEgLSBjdXJyZW50WkNodW5rKSA+IHZpZXdEaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHVubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZENodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgdGhpcy5sb2FkaW5nQ2h1bmtzKSB7XG4gICAgICAgICAgICBjb25zdCBbeCwgel0gPSBDaHVuay51bnBhY2tYWihoYXNoKTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHghIC0gY3VycmVudFhDaHVuaykgPiB2aWV3RGlzdGFuY2UgfHwgTWF0aC5hYnMoeiEgLSBjdXJyZW50WkNodW5rKSA+IHZpZXdEaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVubG9hZGVkICYmIHRoaXMuY2h1bmtTZW5kUXVldWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmROZXR3b3JrQ2h1bmtQdWJsaXNoZXIoZGlzdCA/PyB2aWV3RGlzdGFuY2UsIFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0Q2h1bmsoeDogbnVtYmVyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBhd2FpdCB0aGlzLnBsYXllci5nZXRXb3JsZCgpLmdldENodW5rKHgsIHopO1xuICAgICAgICB0aGlzLmNodW5rU2VuZFF1ZXVlLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjdXJyZW50bHkgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXN1YWxseSB1c2VkIGZvciBjaGFuZ2luZyBkaW1lbnNpb24sIHdvcmxkLCBldGMuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNsZWFyQ2h1bmtzKCkge1xuICAgICAgICB0aGlzLmxvYWRlZENodW5rcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEludmVudG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgSW52ZW50b3J5Q29udGVudFBhY2tldCgpO1xuICAgICAgICBway5pdGVtcyA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW1zKHRydWUpO1xuICAgICAgICBway53aW5kb3dJZCA9IFdpbmRvd0lkcy5JTlZFTlRPUlk7IC8vIEludmVudG9yeSB3aW5kb3dcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSGFuZEl0ZW0odGhpcy5wbGF5ZXIuZ2V0SW52ZW50b3J5KCkuZ2V0SXRlbUluSGFuZCgpKTtcblxuICAgICAgICAvKiBUT0RPOiBub3Qgd29ya2luZy4uXG4gICAgICAgIHBrID0gbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQoKTtcbiAgICAgICAgcGsuaXRlbXMgPSBbXTsgLy8gVE9ET1xuICAgICAgICBway53aW5kb3dJZCA9IDc4OyAvLyBBcm1vckludmVudG9yeSB3aW5kb3dcbiAgICAgICAgdGhpcy5zZW5kRGF0YVBhY2tldChwayk7XG5cbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL05pY2xhc09sb2Zzc29uL01pTkVUL2Jsb2IvbWFzdGVyL3NyYy9NaU5FVC9NaU5FVC9QbGF5ZXIuY3MjTDE3MzZcbiAgICAgICAgLy8gVE9ETzogZG9jdW1lbnRhdGUgYWJvdXRcbiAgICAgICAgMHg3YyAodWkgY29udGVudClcbiAgICAgICAgMHg3NyAob2ZmIGhhbmQpXG4gICAgICAgICovXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRDcmVhdGl2ZUNvbnRlbnRzKGVtcHR5ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQ3JlYXRpdmVDb250ZW50UGFja2V0KCk7XG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLnBsYXllci5nZXRTZXJ2ZXIoKS5nZXRCbG9ja01hbmFnZXIoKS5nZXRCbG9ja3MoKSxcbiAgICAgICAgICAgIC4uLnRoaXMucGxheWVyLmdldFNlcnZlcigpLmdldEl0ZW1NYW5hZ2VyKCkuZ2V0SXRlbXMoKVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFNvcnQgYmFzZWQgb24gUG1tUCBCZWRyb2NrLWRhdGFcbiAgICAgICAgY3JlYXRpdmVpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHBrLml0ZW1zLnB1c2goXG4gICAgICAgICAgICAgICAgLi4uZW50cmllc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubWV0YSA9PT0gKGl0ZW0uZGFtYWdlID8/IDApICYmIGVudHJ5LmdldElkKCkgPT09IGl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZW50cnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZW50cnkuZ2V0SWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW50cnkuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBlbnRyeS5tZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpdGVtIGluIHRoZSBwbGF5ZXIgaGFuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEhhbmRJdGVtKGl0ZW06IEl0ZW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTW9iRXF1aXBtZW50UGFja2V0KCk7XG4gICAgICAgIHBrLnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICBway5pdGVtID0gaXRlbTtcbiAgICAgICAgcGsuaW52ZW50b3J5U2xvdCA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEhhbmRTbG90SW5kZXgoKTtcbiAgICAgICAgcGsuaG90YmFyU2xvdCA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEhhbmRTbG90SW5kZXgoKTtcbiAgICAgICAgcGsud2luZG93SWQgPSAwOyAvLyBJbnZlbnRvcnkgSURcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEZvcm0oZm9ybTogSUZvcm0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnBsYXllci5nZXRGb3JtTWFuYWdlcigpLmFkZEZvcm0oZm9ybSk7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE1vZGFsRm9ybVJlcXVlc3RQYWNrZXQoKTtcbiAgICAgICAgcGsuZm9ybUlkID0gaWQ7XG4gICAgICAgIHBrLmZvcm1EYXRhID0gZm9ybS5qc29uU2VyaWFsaXplKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjbGllbnQncyBjdXJyZW50IHRpY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGljayAtIFRoZSB0aWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRUaW1lKHRpY2s6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBTZXRUaW1lUGFja2V0KCk7XG4gICAgICAgIHBrLnRpbWUgPSB0aWNrO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2xpZW50J3MgZ2FtZW1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ2FtZW1vZGUgLSB0aGUgbnVtZXJpYyBnYW1lbW9kZSBJRFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kR2FtZW1vZGUoZ2FtZW1vZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCgpO1xuICAgICAgICBway5nYW1lbW9kZSA9IGdhbWVtb2RlO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKGRpc3RhbmNlOiBudW1iZXIsIHNhdmVkQ2h1bmtzOiBDaHVua0Nvb3JkW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0KCk7XG4gICAgICAgIHBrLnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi5mcm9tVmVjdG9yMyh0aGlzLnBsYXllcik7XG4gICAgICAgIHBrLnJhZGl1cyA9IGRpc3RhbmNlIDw8IDQ7XG4gICAgICAgIHBrLnNhdmVkQ2h1bmtzID0gc2F2ZWRDaHVua3M7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRBdmFpbGFibGVDb21tYW5kcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQoKTtcblxuICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgLmdldENvbW1hbmRNYW5hZ2VyKClcbiAgICAgICAgICAgIC5nZXRDb21tYW5kc0xpc3QoKVxuICAgICAgICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kQ2xhc3MgPSBBcnJheS5mcm9tKHRoaXMuc2VydmVyLmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0Q29tbWFuZHMoKS52YWx1ZXMoKSkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGNtZCkgPT4gY21kLmlkLnNwbGl0KCc6JylbMV0gPT09IGNvbW1hbmRbMF1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjb21tYW5kQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lndhcm4oYENhbid0IGZpbmQgY29ycmVzcG9uZGluZyBjb21tYW5kIGNsYXNzIGZvciBcIiR7Y29tbWFuZFswXX1cImApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBsYXllci5nZXRTZXJ2ZXIoKS5nZXRQZXJtaXNzaW9uTWFuYWdlcigpLmNhbih0aGlzLnBsYXllcikuZXhlY3V0ZShjb21tYW5kQ2xhc3MucGVybWlzc2lvbikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kRGF0YSgpO1xuICAgICAgICAgICAgICAgIGNtZC5jb21tYW5kTmFtZSA9IGNvbW1hbmRbMF07XG4gICAgICAgICAgICAgICAgY21kLmNvbW1hbmREZXNjcmlwdGlvbiA9IGNvbW1hbmRDbGFzcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZENsYXNzLmFsaWFzZXMhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21kQWxpYXNlcyA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICAgICAgICAgICAgICBjbWRBbGlhc2VzLmVudW1OYW1lID0gYCR7Y29tbWFuZFswXX1BbGlhc2VzYDtcbiAgICAgICAgICAgICAgICAgICAgY21kQWxpYXNlcy5lbnVtVmFsdWVzID0gY29tbWFuZENsYXNzLmFsaWFzZXMhLmNvbmNhdChjb21tYW5kWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY21kLmFsaWFzZXMgPSBjbWRBbGlhc2VzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbW1hbmRbMl0uZm9yRWFjaCgoYXJnLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gYXJnXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyYW1ldGVyLmdldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycykgcmV0dXJuIEFycmF5LmZyb20ocGFyYW1ldGVycy52YWx1ZXMoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgQ29tbWFuZEFyZ3VtZW50RW50aXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ3RhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5UYXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlciBpbnN0YW5jZW9mIENvbW1hbmRBcmd1bWVudEdhbWVtb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ2dhbWVtb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdTdHJpbmdBcmd1bWVudFR5cGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdJbnRlZ2VyQXJndW1lbnRUeXBlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuSW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCk/Lndhcm4oYEludmFsaWQgcGFyYW1ldGVyICR7cGFyYW1ldGVyLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNtZC5vdmVybG9hZHNbaW5kZXhdID0gcGFyYW1ldGVycztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBway5jb21tYW5kRGF0YS5wdXNoKGNtZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGxheWVyRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBwbGF5ZXJFbnVtLmVudW1OYW1lID0gJ1BsYXllcic7XG4gICAgICAgIHBsYXllckVudW0uZW51bVZhbHVlcyA9IHRoaXMucGxheWVyXG4gICAgICAgICAgICAuZ2V0U2VydmVyKClcbiAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAubWFwKChwbGF5ZXIpID0+IHBsYXllci5nZXROYW1lKCkpO1xuICAgICAgICBway5zb2Z0RW51bXMgPSBbcGxheWVyRW51bV07XG4gICAgICAgIC8vIFRPRE86IHVwZGF0ZSBjb21tYW5kc1xuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjbGllbnQncyBtYXhpbXVtIHZpZXcgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlzdGFuY2UgLSBUaGUgdmlldyBkaXN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZXRWaWV3RGlzdGFuY2UoZGlzdGFuY2U6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnBsYXllci52aWV3RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQ2h1bmtSYWRpdXNVcGRhdGVkUGFja2V0KCk7XG4gICAgICAgIHBrLnJhZGl1cyA9IGRpc3RhbmNlO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVzUGFja2V0KCk7XG4gICAgICAgIHBrLnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICBway5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5sZW5ndGggPiAwID8gYXR0cmlidXRlcyA6IHRoaXMucGxheWVyLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5nZXRBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHBrLnRpY2sgPSBCaWdJbnQoMCk7IC8vIFRPRE9cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE1ldGFkYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBTZXRBY3RvckRhdGFQYWNrZXQoKTtcbiAgICAgICAgcGsucnVudGltZUVudGl0eUlkID0gdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgIHBrLm1ldGFkYXRhID0gdGhpcy5wbGF5ZXIuZ2V0TWV0YWRhdGFNYW5hZ2VyKCk7XG4gICAgICAgIHBrLnRpY2sgPSBCaWdJbnQoMCk7IC8vIFRPRE9cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2hhdCBtZXNzYWdlIHRvIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlZmFjdG9yIHRoaXMgY29tcGxldGVseS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0geHVpZCAtIFRoZSBzb3VyY2UgeHVpZFxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIC1cbiAgICAgKiBAcGFyYW0gbmVlZHNUcmFuc2xhdGlvbiAtIElmIHRoZSBUZXh0VHlwZSByZXF1aXJlcyB0cmFuc2xhdGlvblxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIHRleHQgdHlwZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kTWVzc2FnZShcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICB4dWlkID0gJycsXG4gICAgICAgIHBhcmFtZXRlcnM6IHN0cmluZ1tdID0gW10sXG4gICAgICAgIG5lZWRzVHJhbnNsYXRpb24gPSBmYWxzZSxcbiAgICAgICAgdHlwZSA9IFRleHRUeXBlLlJhd1xuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHRocm93IG5ldyBFcnJvcignQSBtZXNzYWdlIGlzIHJlcXVpcmVkJyk7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVGV4dFBhY2tldCgpO1xuICAgICAgICBway50eXBlID0gdHlwZTtcbiAgICAgICAgcGsuc291cmNlTmFtZSA9ICcnO1xuICAgICAgICBway5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgcGsubmVlZHNUcmFuc2xhdGlvbiA9IG5lZWRzVHJhbnNsYXRpb247XG4gICAgICAgIHBrLnh1aWQgPSB4dWlkO1xuICAgICAgICBway5wbGF0Zm9ybUNoYXRJZCA9ICcnOyAvLyBUT0RPXG4gICAgICAgIHBrLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kVG9hc3QodGl0bGU6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGl0bGUpIHRocm93IG5ldyBFcnJvcignQSB0b2FzdCB0aXRsZSBpcyByZXF1aXJlZCcpO1xuICAgICAgICBpZiAoIWJvZHkpIHRocm93IG5ldyBFcnJvcignQSB0b2FzdCBib2R5IGlzIHJlcXVpcmVkLicpO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFRvYXN0UmVxdWVzdFBhY2tldCgpO1xuICAgICAgICBway50aXRsZSA9IHRpdGxlO1xuICAgICAgICBway5ib2R5ID0gYm9keTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQ2h1bmsoY2h1bms6IENodW5rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IExldmVsQ2h1bmtQYWNrZXQoKTtcbiAgICAgICAgcGsuY2h1bmtYID0gY2h1bmsuZ2V0WCgpO1xuICAgICAgICBway5jaHVua1ogPSBjaHVuay5nZXRaKCk7XG4gICAgICAgIHBrLmNsaWVudFN1YkNodW5rUmVxdWVzdHNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHBrLnN1YkNodW5rQ291bnQgPSBjaHVuay5nZXRUb3BFbXB0eSgpICsgNDsgLy8gYWRkIHRoZSB1c2VsZXNzIGxheWVycyBoYWNrXG4gICAgICAgIHBrLmRhdGEgPSBjaHVuay5uZXR3b3JrU2VyaWFsaXplKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwaywgdW5kZWZpbmVkLCBmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgaGFzaCA9IENodW5rLnBhY2tYWihjaHVuay5nZXRYKCksIGNodW5rLmdldFooKSk7XG4gICAgICAgIHRoaXMubG9hZGVkQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmRlbGV0ZShoYXNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3QgdGhlIG1vdmVtZW50IHRvIGEgZGVmaW5lZCBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYnJvYWRjYXN0TW92ZShwbGF5ZXI6IFBsYXllciwgbW9kZSA9IE1vdmVtZW50VHlwZS5Ob3JtYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTW92ZVBsYXllclBhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSBwbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG5cbiAgICAgICAgcGsucG9zaXRpb25YID0gcGxheWVyLmdldFgoKTtcbiAgICAgICAgcGsucG9zaXRpb25ZID0gcGxheWVyLmdldFkoKTtcbiAgICAgICAgcGsucG9zaXRpb25aID0gcGxheWVyLmdldFooKTtcblxuICAgICAgICBway5waXRjaCA9IHBsYXllci5waXRjaDtcbiAgICAgICAgcGsueWF3ID0gcGxheWVyLnlhdztcbiAgICAgICAgcGsuaGVhZFlhdyA9IHBsYXllci5oZWFkWWF3O1xuXG4gICAgICAgIHBrLm1vZGUgPSBtb2RlO1xuXG4gICAgICAgIHBrLm9uR3JvdW5kID0gcGxheWVyLmlzT25Hcm91bmQoKTtcblxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIGlmIChtb2RlID09PSBNb3ZlbWVudFR5cGUuVGVsZXBvcnQpIHtcbiAgICAgICAgICAgIHBrLnRlbGVwb3J0Q2F1c2UgPSAwO1xuICAgICAgICAgICAgcGsudGVsZXBvcnRJdGVtSWQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcGsucmlkaW5nRW50aXR5UnVudGltZUlkID0gQmlnSW50KDApO1xuICAgICAgICBway50aWNrID0gQmlnSW50KDApOyAvLyBUT0RPXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgY2xpZW50IHRvIHRoZSBwbGF5ZXIgbGlzdCBvZiBldmVyeSBwbGF5ZXIgaW5zaWRlXG4gICAgICogdGhlIHNlcnZlciBhbmQgYWxzbyB0byB0aGUgcGxheWVyIGl0c2VsZi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYWRkVG9QbGF5ZXJMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwbGF5ZXJMaXN0ID0gbmV3IFBsYXllckxpc3RQYWNrZXQoKTtcbiAgICAgICAgcGxheWVyTGlzdC50eXBlID0gUGxheWVyTGlzdEFjdGlvbi5UWVBFX0FERDtcblxuICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBQbGF5ZXJMaXN0RW50cnkoe1xuICAgICAgICAgICAgdXVpZDogVVVJRC5mcm9tU3RyaW5nKHRoaXMucGxheWVyLnV1aWQpLFxuICAgICAgICAgICAgdW5pcXVlRW50aXR5aWQ6IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5wbGF5ZXIuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgeHVpZDogdGhpcy5wbGF5ZXIueHVpZCxcbiAgICAgICAgICAgIHBsYXRmb3JtQ2hhdElkOiAnJywgLy8gVE9ETzogcmVhZCB0aGlzIHZhbHVlIGZyb20gTG9naW5cbiAgICAgICAgICAgIGJ1aWxkUGxhdGZvcm06IHRoaXMucGxheWVyLmRldmljZSA/IHRoaXMucGxheWVyLmRldmljZS5vcyA6IC0xLFxuICAgICAgICAgICAgc2tpbjogdGhpcy5wbGF5ZXIuc2tpbiEsXG4gICAgICAgICAgICBpc1RlYWNoZXI6IGZhbHNlLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoZXJlIHRvIHJlYWQgdGVhY2hlciBhbmQgaG9zdFxuICAgICAgICAgICAgaXNIb3N0OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcGxheWVyTGlzdC5lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2VydmVyLmJyb2FkY2FzdFBhY2tldChwbGF5ZXJMaXN0KTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJMaXN0KCkuc2V0KHRoaXMucGxheWVyLnV1aWQsIGVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcGxheWVyIGZyb20gb3RoZXIgcGxheWVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUZyb21QbGF5ZXJMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMucGxheWVyLnV1aWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgICAgIHBrLnR5cGUgPSBQbGF5ZXJMaXN0QWN0aW9uLlRZUEVfUkVNT1ZFO1xuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IFBsYXllckxpc3RFbnRyeSh7XG4gICAgICAgICAgICB1dWlkOiBVVUlELmZyb21TdHJpbmcodGhpcy5wbGF5ZXIuZ2V0VVVJRCgpKVxuICAgICAgICB9KTtcbiAgICAgICAgcGsuZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgICAgICB0aGlzLnNlcnZlci5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckxpc3QoKS5kZWxldGUodGhpcy5wbGF5ZXIudXVpZCk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKHBsYXllcikgPT4gcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGUgZnVsbCBwbGF5ZXIgbGlzdCB0byB0aGUgcGxheWVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kUGxheWVyTGlzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGxheWVyTGlzdCA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgICAgIHBsYXllckxpc3QudHlwZSA9IFBsYXllckxpc3RBY3Rpb24uVFlQRV9BREQ7XG4gICAgICAgIHBsYXllckxpc3QuZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5zZXJ2ZXIuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJMaXN0KCkudmFsdWVzKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGxheWVyTGlzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3Bhd24gdGhlIHBsYXllciBmb3IgYW5vdGhlciBwbGF5ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGF5ZXIgLSB0aGUgcGxheWVyIHRvIHNlbmQgdGhlIEFkZFBsYXllclBhY2tldCB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kU3Bhd24ocGxheWVyOiBQbGF5ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFwbGF5ZXIuZ2V0VVVJRCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKT8uZXJyb3IoYFVVSUQgZm9yIHBsYXllciAke3BsYXllci5nZXROYW1lKCl9IGlzIHVuZGVmaW5lZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQWRkUGxheWVyUGFja2V0KCk7XG4gICAgICAgIHBrLnV1aWQgPSBVVUlELmZyb21TdHJpbmcodGhpcy5wbGF5ZXIuZ2V0VVVJRCgpKTsgLy8gVE9ETzogdGVtcCBzb2x1dGlvblxuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsubmFtZSA9IHRoaXMucGxheWVyLmdldE5hbWUoKTtcblxuICAgICAgICBway5wb3NpdGlvblggPSB0aGlzLnBsYXllci5nZXRYKCk7XG4gICAgICAgIHBrLnBvc2l0aW9uWSA9IHRoaXMucGxheWVyLmdldFkoKTtcbiAgICAgICAgcGsucG9zaXRpb25aID0gdGhpcy5wbGF5ZXIuZ2V0WigpO1xuXG4gICAgICAgIC8vIFRPRE86IG1vdGlvblxuICAgICAgICBway5tb3Rpb25YID0gMDtcbiAgICAgICAgcGsubW90aW9uWSA9IDA7XG4gICAgICAgIHBrLm1vdGlvblogPSAwO1xuXG4gICAgICAgIHBrLnBpdGNoID0gdGhpcy5wbGF5ZXIucGl0Y2g7XG4gICAgICAgIHBrLnlhdyA9IHRoaXMucGxheWVyLnlhdztcbiAgICAgICAgcGsuaGVhZFlhdyA9IHRoaXMucGxheWVyLmhlYWRZYXc7XG5cbiAgICAgICAgcGsuaXRlbSA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW1JbkhhbmQoKTtcblxuICAgICAgICBway5kZXZpY2VJZCA9IHRoaXMucGxheWVyLmRldmljZT8uaWQgPz8gJyc7XG4gICAgICAgIHBrLm1ldGFkYXRhID0gdGhpcy5wbGF5ZXIuZ2V0TWV0YWRhdGFNYW5hZ2VyKCk7XG4gICAgICAgIGF3YWl0IHBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgICAgIC8vIFRPRE86IGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKHBsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzcGF3biB0aGUgcGxheWVyIGVudGl0eSBmcm9tIGFub3RoZXIgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmREZXNwYXduKHBsYXllcjogUGxheWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFJlbW92ZUFjdG9yUGFja2V0KCk7XG4gICAgICAgIHBrLnVuaXF1ZUVudGl0eUlkID0gdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCk7IC8vIFdlIHVzZSBydW50aW1lIGFzIHVuaXF1ZVxuICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kUGxheVN0YXR1cyhzdGF0dXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBQbGF5U3RhdHVzUGFja2V0KCk7XG4gICAgICAgIHBrLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMga2ljayhyZWFzb24gPSAndW5rbm93biByZWFzb24nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IERpc2Nvbm5lY3RQYWNrZXQoKTtcbiAgICAgICAgcGsuc2tpcE1lc3NhZ2UgPSBmYWxzZTtcbiAgICAgICAgcGsubWVzc2FnZSA9IHJlYXNvbjtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29ubmVjdGlvbigpOiBDbGllbnRDb25uZWN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGxheWVyKCk6IFBsYXllciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaGFuZ2VEaW1lbnNpb25QYWNrZXQsIExldmVsQ2h1bmtQYWNrZXQgfSBmcm9tICcuL25ldHdvcmsvUGFja2V0cyc7XG5pbXBvcnQgeyBGbGFnVHlwZSwgTWV0YWRhdGFGbGFnIH0gZnJvbSAnLi9lbnRpdHkvTWV0YWRhdGEnO1xuaW1wb3J0IHR5cGUgQ2hhdEV2ZW50IGZyb20gJy4vZXZlbnRzL2NoYXQvQ2hhdEV2ZW50JztcbmltcG9ydCB0eXBlIENodW5rIGZyb20gJy4vd29ybGQvY2h1bmsvQ2h1bmsnO1xuaW1wb3J0IHR5cGUgeyBDaHVua0Nvb3JkIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9OZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQnO1xuaW1wb3J0IHR5cGUgQ2xpZW50Q29ubmVjdGlvbiBmcm9tICcuL25ldHdvcmsvQ2xpZW50Q29ubmVjdGlvbic7XG5pbXBvcnQgQ29udGFpbmVyRW50cnkgZnJvbSAnLi9pbnZlbnRvcnkvQ29udGFpbmVyRW50cnknO1xuaW1wb3J0IENvb3JkaW5hdGVVdGlscyBmcm9tICcuL3dvcmxkL0Nvb3JkaW5hdGVVdGlscyc7XG5pbXBvcnQgdHlwZSBEZXZpY2UgZnJvbSAnLi91dGlscy9EZXZpY2UnO1xuaW1wb3J0IEZvcm1NYW5hZ2VyIGZyb20gJy4vZm9ybS9Gb3JtTWFuYWdlcic7XG5pbXBvcnQgR2FtZW1vZGUgZnJvbSAnLi93b3JsZC9HYW1lbW9kZSc7XG5pbXBvcnQgSHVtYW4gZnJvbSAnLi9lbnRpdHkvSHVtYW4nO1xuaW1wb3J0IHR5cGUgeyBJbmV0QWRkcmVzcyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCBNb3ZlbWVudFR5cGUgZnJvbSAnLi9uZXR3b3JrL3R5cGUvTW92ZW1lbnRUeXBlJztcbmltcG9ydCBQbGF5U3RhdHVzVHlwZSBmcm9tICcuL25ldHdvcmsvdHlwZS9QbGF5U3RhdHVzVHlwZSc7XG5pbXBvcnQgUGxheWVyU2Vzc2lvbiBmcm9tICcuL25ldHdvcmsvUGxheWVyU2Vzc2lvbic7XG5pbXBvcnQgUGxheWVyU2V0R2FtZW1vZGVFdmVudCBmcm9tICcuL2V2ZW50cy9wbGF5ZXIvUGxheWVyU2V0R2FtZW1vZGVFdmVudCc7XG5pbXBvcnQgUGxheWVyVG9nZ2xlRmxpZ2h0RXZlbnQgZnJvbSAnLi9ldmVudHMvcGxheWVyL1BsYXllclRvZ2dsZUZsaWdodEV2ZW50JztcbmltcG9ydCBQbGF5ZXJUb2dnbGVTcHJpbnRFdmVudCBmcm9tICcuL2V2ZW50cy9wbGF5ZXIvUGxheWVyVG9nZ2xlU3ByaW50RXZlbnQnO1xuaW1wb3J0IHR5cGUgU2tpbiBmcm9tICcuL3V0aWxzL3NraW4vU2tpbic7XG5pbXBvcnQgVGV4dFR5cGUgZnJvbSAnLi9uZXR3b3JrL3R5cGUvVGV4dFR5cGUnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vdXRpbHMvVGltZXInO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IFdpbmRvd01hbmFnZXIgZnJvbSAnLi9pbnZlbnRvcnkvV2luZG93TWFuYWdlcic7XG5pbXBvcnQgdHlwZSBXb3JsZCBmcm9tICcuL3dvcmxkL1dvcmxkJztcblxuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4vU2VydmVyJztcblxuLy8gRGVmYXVsdCBzcGF3biB2aWV3IGRpc3RhbmNlIHVzZWQgaW4gdmFuaWxsYVxuZXhwb3J0IGNvbnN0IFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMgPSA0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBIdW1hbiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiBJbmV0QWRkcmVzcztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5ldHdvcmtTZXNzaW9uOiBQbGF5ZXJTZXNzaW9uO1xuICAgIHByaXZhdGUgcGVybWlzc2lvbnM6IHN0cmluZ1tdO1xuXG4gICAgLy8gT25seSB1c2VkIGZvciBtZXRyaWNzXG4gICAgcHJpdmF0ZSBqb2luVGltZXIgPSBuZXcgVGltZXIoKTtcblxuICAgIC8vIFRPRE86IGZpbmlzaCBpbXBsZW1lbnRhdGlvblxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93czogV2luZG93TWFuYWdlcjtcblxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIHVzZXJuYW1lID0ge1xuICAgICAgICBwcmVmaXg6ICc8JyxcbiAgICAgICAgc3VmZml4OiAnPicsXG4gICAgICAgIG5hbWU6ICcnXG4gICAgfTtcblxuICAgIHB1YmxpYyBsb2NhbGUgPSAnJztcbiAgICBwdWJsaWMgcmFuZG9tSWQgPSAwO1xuXG4gICAgcHVibGljIHV1aWQgPSAnJztcbiAgICBwdWJsaWMgeHVpZCA9ICcnO1xuICAgIHB1YmxpYyBza2luOiBTa2luIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgdmlld0Rpc3RhbmNlID0gMDtcbiAgICBwdWJsaWMgZ2FtZW1vZGUgPSAwO1xuXG4gICAgcHVibGljIHBpdGNoID0gMDtcbiAgICBwdWJsaWMgeWF3ID0gMDtcbiAgICBwdWJsaWMgaGVhZFlhdyA9IDA7XG5cbiAgICBwcml2YXRlIG9uR3JvdW5kID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzcHJpbnRpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGZseWluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgc25lYWtpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFsbG93RmlnaHQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBwbGF0Zm9ybUNoYXRJZCA9ICcnO1xuXG4gICAgcHVibGljIGRldmljZTogRGV2aWNlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY2FjaGVTdXBwb3J0ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2h1bmtTZW5kUXVldWUgPSBuZXcgU2V0PENodW5rPigpO1xuICAgIHB1YmxpYyBjdXJyZW50Q2h1bms6IGJpZ2ludCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtczogRm9ybU1hbmFnZXI7XG5cbiAgICBwcml2YXRlIGNoYXRIYW5kbGVyOiAoZXZlbnQ6IENoYXRFdmVudCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFBsYXllcidzIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uLCB3b3JsZDogV29ybGQsIHNlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHN1cGVyKHdvcmxkLCBzZXJ2ZXIpO1xuICAgICAgICB0aGlzLmFkZHJlc3MgPSBjb25uZWN0aW9uLmdldFJha05ldFNlc3Npb24oKS5nZXRBZGRyZXNzKCk7XG4gICAgICAgIHRoaXMubmV0d29ya1Nlc3Npb24gPSBuZXcgUGxheWVyU2Vzc2lvbihzZXJ2ZXIsIGNvbm5lY3Rpb24sIHRoaXMpO1xuICAgICAgICB0aGlzLndpbmRvd3MgPSBuZXcgV2luZG93TWFuYWdlcigpO1xuICAgICAgICB0aGlzLmZvcm1zID0gbmV3IEZvcm1NYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5qb2luVGltZXIucmVzZXQoKTtcblxuICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBtZXNzIDovXG4gICAgICAgIHRoaXMuY2hhdEhhbmRsZXIgPSBhc3luYyAoZXZ0OiBDaGF0RXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldnQuaXNDYW5jZWxsZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBwcm9wZXIgY2hhbm5lbCBzeXN0ZW1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmdldENoYW5uZWwoKSA9PT0gJyouZXZlcnlvbmUnIHx8XG4gICAgICAgICAgICAgICAgKGV2dC5nZXRDaGF0KCkuZ2V0Q2hhbm5lbCgpID09PSAnKi5vcHMnICYmIHRoaXMuaXNPcCgpKSB8fFxuICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0Q2hhbm5lbCgpID09PSBgKi5wbGF5ZXIuJHt0aGlzLmdldE5hbWUoKX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRNZXNzYWdlKCksXG4gICAgICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0VHlwZSgpIGFzIG51bWJlciBhcyBUZXh0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRQYXJhbWV0ZXJzKCksXG4gICAgICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuaXNOZWVkc1RyYW5zbGF0aW9uKClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNlcnZlci5nZXRFdmVudE1hbmFnZXIoKS5vbignY2hhdCcsIHRoaXMuY2hhdEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0U2VydmVyKCkuZ2V0UGVybWlzc2lvbk1hbmFnZXIoKS5nZXRQZXJtaXNzaW9ucyh0aGlzKTtcblxuICAgICAgICBjb25zdCBwbGF5ZXJEYXRhID0gYXdhaXQgdGhpcy5nZXRXb3JsZCgpLmdldFBsYXllckRhdGEodGhpcyk7XG5cbiAgICAgICAgLy8gdm9pZCB0aGlzLnNldEdhbWVtb2RlKEdhbWVtb2RlLmdldEdhbWVtb2RlSWQocGxheWVyRGF0YS5nYW1lbW9kZSkpO1xuICAgICAgICAvLyBUT0RPOiBjYWxsaW5nIHRoaXMgYmVmb3JlIHRoZSBwbGF5ZXIgaXMgc3Bhd25pbmcgd2lsbCBjcmVhdGUgYW4gdW5kZWZpbmVkIGJlaGF2aW9yXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgU2V0UGxheWVyR2FtZVR5cGUgcGFja2V0IGJyZWFraW5nIHRoZSBsb2dpbiBzZXF1ZW5jZVxuICAgICAgICAvLyBpJ2xsIGtlZXAgdGhpcyBjb21tZW50IHdoaWxlIGl0J3MgYnJva2VuXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WChwbGF5ZXJEYXRhLnBvc2l0aW9uLngpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFkocGxheWVyRGF0YS5wb3NpdGlvbi55KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRaKHBsYXllckRhdGEucG9zaXRpb24ueik7XG4gICAgICAgIHRoaXMucGl0Y2ggPSBwbGF5ZXJEYXRhLnBvc2l0aW9uLnBpdGNoO1xuICAgICAgICB0aGlzLnlhdyA9IHBsYXllckRhdGEucG9zaXRpb24ueWF3O1xuXG4gICAgICAgIHBsYXllckRhdGEuaW52ZW50b3J5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID1cbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEl0ZW1NYW5hZ2VyKCkuZ2V0SXRlbShpdGVtLmlkKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0QmxvY2tNYW5hZ2VyKCkuZ2V0QmxvY2soaXRlbS5pZCk7XG5cbiAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldExvZ2dlcigpPy53YXJuKGBJdGVtL2Jsb2NrIHdpdGggaWQgJHtpdGVtLmlkfSBpcyBpbnZhbGlkYCwgJ1BsYXllci9vbkVuYWJsZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nZXRJbnZlbnRvcnkoKS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgIGl0ZW0ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgbmV3IENvbnRhaW5lckVudHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbTogZW50cnksXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBpdGVtLmNvdW50XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpXG4gICAgICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAgICAgPy5kZWJ1ZyhgKENvbXBsZXRlIHBsYXllciBjcmVhdGlvbiB0b29rICR7dGhpcy5qb2luVGltZXIuc3RvcCgpfSBtcylgLCAnUGxheWVyL29uRW5hYmxlJyk7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25EaXNhYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQgJiYgdGhpcy54dWlkKSBhd2FpdCB0aGlzLmdldFdvcmxkKCkuc2F2ZVBsYXllckRhdGEodGhpcyk7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldEV2ZW50TWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKCdjaGF0JywgdGhpcy5jaGF0SGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIG1hdGNoIHZhbmlsbGEgYmVoYXZpb3IsIHdpbGwgc2VuZCBjaHVua3NcbiAgICAgKiB3aXRoIGFuIGluaXRpYWwgdmlldyByYWRpdXMgb2YgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEluaXRpYWxTcGF3bkNodW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWluWCA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMueCkgLSBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTO1xuICAgICAgICBjb25zdCBtaW5aID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy56KSAtIFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVM7XG4gICAgICAgIGNvbnN0IG1heFggPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLngpICsgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUztcbiAgICAgICAgY29uc3QgbWF4WiA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMueikgKyBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTO1xuXG4gICAgICAgIGNvbnN0IHNhdmVkQ2h1bmtzOiBDaHVua0Nvb3JkW10gPSBbXTtcbiAgICAgICAgY29uc3Qgc2VuZFF1ZXVlOiBBcnJheTxQcm9taXNlPENodW5rPj4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY2h1bmtYID0gbWluWDsgY2h1bmtYIDw9IG1heFg7ICsrY2h1bmtYKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaHVua1ogPSBtaW5aOyBjaHVua1ogPD0gbWF4WjsgKytjaHVua1opIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB2YW5pbGxhIGRvZXMgbm90IHNlbmQgYWxsIG9mIHRoZW0sIGJ1dCBpbiBhIHJhbmdlXG4gICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUgaXQgZG9lcyBzZW5kIHRoZW0gZnJvbSB4ID0+IFstMzsgM10gYW5kIHogPT4gWy0zOyAyXVxuICAgICAgICAgICAgICAgIHNhdmVkQ2h1bmtzLnB1c2goeyB4OiBjaHVua1gsIHo6IGNodW5rWiB9KTtcbiAgICAgICAgICAgICAgICBzZW5kUXVldWUucHVzaCh0aGlzLmdldFdvcmxkKCkuZ2V0Q2h1bmsoY2h1bmtYLCBjaHVua1opKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE5ldHdvcmtDaHVua1B1Ymxpc2hlcihWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTLCBzYXZlZENodW5rcyk7XG5cbiAgICAgICAgY29uc3QgZ2V0VW5pcXVlQ2h1bmtzID0gKHNlbmRMaXN0OiBDaHVua0Nvb3JkW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHhTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgICAgICAgIGNvbnN0IHpTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiBzZW5kTGlzdCkge1xuICAgICAgICAgICAgICAgIHhTZXQuYWRkKGNvb3JkLngpO1xuICAgICAgICAgICAgICAgIHpTZXQuYWRkKGNvb3JkLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoeFNldC5zaXplICsgelNldC5zaXplKSAvIDIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0VW5pcXVlQ2h1bmtzKHNhdmVkQ2h1bmtzKTsgKytpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmROZXR3b3JrQ2h1bmtQdWJsaXNoZXIoVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUywgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzZW5kUXVldWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZENodW5rKGNodW5rKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgcGxheWVyJ3MgY3VycmVudCB3b3JsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3b3JsZCAtIHRoZSBuZXcgd29ybGRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0V29ybGQod29ybGQ6IFdvcmxkKSB7XG4gICAgICAgIGNvbnN0IGRpbTAgPSBuZXcgQ2hhbmdlRGltZW5zaW9uUGFja2V0KCk7XG4gICAgICAgIGRpbTAuZGltZW5zaW9uID0gMDtcbiAgICAgICAgZGltMC5wb3NpdGlvbiA9IHRoaXM7XG4gICAgICAgIGRpbTAucmVzcGF3biA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGRpbTEgPSBuZXcgQ2hhbmdlRGltZW5zaW9uUGFja2V0KCk7XG4gICAgICAgIGRpbTEuZGltZW5zaW9uID0gMTtcbiAgICAgICAgZGltMS5wb3NpdGlvbiA9IG5ldyBWZWN0b3IzKDAsIDAsIDApOyAvLyBUT0RPOiBsb2FkIHRoaXMgcHJvcGVybHlcbiAgICAgICAgZGltMS5yZXNwYXduID0gZmFsc2U7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChkaW0xKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kUGxheVN0YXR1cyhQbGF5U3RhdHVzVHlwZS5QbGF5ZXJTcGF3bik7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5nZXRXb3JsZCgpLnJlbW92ZUVudGl0eSh0aGlzKTtcbiAgICAgICAgYXdhaXQgd29ybGQuYWRkRW50aXR5KHRoaXMpO1xuICAgICAgICBhd2FpdCBzdXBlci5zZXRXb3JsZC5iaW5kKHRoaXMpKHdvcmxkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNldFBvc2l0aW9uKG5ldyBWZWN0b3IzKDAsIDAsIDApKTtcbiAgICAgICAgZm9yIChsZXQgeCA9IC0zOyB4IDwgMzsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB6ID0gLTM7IHogPCAzOyB6KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IG5ldyBMZXZlbENodW5rUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgcGsuY2xpZW50U3ViQ2h1bmtSZXF1ZXN0c0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBway5jaHVua1ggPSB4OyAvLyBUT0RPXG4gICAgICAgICAgICAgICAgcGsuY2h1bmtaID0gejsgLy8gVE9ET1xuICAgICAgICAgICAgICAgIHBrLmRhdGEgPSBCdWZmZXIuZnJvbSgnJyk7XG4gICAgICAgICAgICAgICAgcGsuc3ViQ2h1bmtDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMSk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChkaW0wKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kUGxheVN0YXR1cyhQbGF5U3RhdHVzVHlwZS5QbGF5ZXJTcGF3bik7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmsgPSBudWxsO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmNsZWFyQ2h1bmtzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24ubmVlZE5ld0NodW5rcygpO1xuICAgICAgICBhd2FpdCB0aGlzLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc09ubGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUodGljazogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIENhbGwgc3VwZXIgbWV0aG9kXG4gICAgICAgIGF3YWl0IHN1cGVyLnVwZGF0ZS5iaW5kKHRoaXMpKHRpY2spO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnVwZGF0ZSh0aWNrKTtcblxuICAgICAgICAvLyBUT0RPOiBnZXQgZG9jdW1lbnRhdGlvbiBhYm91dCB0aW1pbmdzIGZyb20gdmFuaWxsYVxuICAgICAgICAvLyAxIHNlY29uZCAvIDIwID0gMSB0aWNrLCAyMCAqIDUgPSAxIHNlY29uZFxuICAgICAgICAvLyAxIHNlY29uZCAqIDYwID0gMSBtaW51dGVcbiAgICAgICAgaWYgKHRpY2sgJSAoMjAgKiA1ICogNjAgKiAxKSA9PT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kVGltZSh0aWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgdGhpcy5jaHVua1NlbmRRdWV1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKHRoaXMudmlld0Rpc3RhbmNlIHx8IFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMsIFtdKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZENodW5rKGNodW5rKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtTZW5kUXVldWUuZGVsZXRlKGNodW5rKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBraWNrKHJlYXNvbiA9ICd1bmtub3duIHJlYXNvbicpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICA/LnZlcmJvc2UoYFBsYXllciB3aXRoIGlkIMKnYiR7dGhpcy5nZXRSdW50aW1lSWQoKX3Cp3Igd2FzIGtpY2tlZDogJHtyZWFzb259YCwgJ1BsYXllci9raWNrJyk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24ua2ljayhyZWFzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8qIFxuICAgICAgICAgICAgVE9ET1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRhcmdldC5nZXROZXR3b3JrU2Vzc2lvbigpLnNlbmRTZXR0aW5ncyh0aGlzKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApOyAqL1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhbGwgdGhlIHBsYXllcnMgaW4gdGhlIHNhbWUgY2h1bmssLlxuICAgIC8vIFRPRE86IG1vdmUgdG8gd29ybGRcbiAgICBwdWJsaWMgZ2V0UGxheWVyc0luQ2h1bmsoKTogUGxheWVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHBsYXllcikgPT4gcGxheWVyLmdldEN1cnJlbnRDaHVuaygpID09PSB0aGlzLmdldEN1cnJlbnRDaHVuaygpKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiB0aGVzZVxuICAgIHB1YmxpYyBhc3luYyBzZW5kU3Bhd24oKSB7fVxuICAgIHB1YmxpYyBhc3luYyBzZW5kRGVzcGF3bigpIHt9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2hhdCBtZXNzYWdlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kTWVzc2FnZShcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICB0eXBlOiBUZXh0VHlwZSA9IFRleHRUeXBlLlJhdyxcbiAgICAgICAgcGFyYW1ldGVyczogc3RyaW5nW10gPSBbXSxcbiAgICAgICAgbmVlZHNUcmFuc2xhdGlvbiA9IGZhbHNlXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRPRE86IERvIHRoaXMgcHJvcGVybHkgbGlrZSBqYXZhIGVkaXRpb24sXG4gICAgICAgIC8vIGluIG90aGVyIHdvcmRzLCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgSlNPTiBmb3JtYXR0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE1lc3NhZ2UobWVzc2FnZSwgJycsIHBhcmFtZXRlcnMsIG5lZWRzVHJhbnNsYXRpb24sIHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgYSB0b2FzdCBub3RpZmljYXRpb24gKGxpa2UgWGJveCBMaXZlIG5vdGlmaWNhdGlvbnMpXG4gICAgICogQHBhcmFtIHRpdGxlIC0gdGhlIHRvYXN0IHRpdGxlXG4gICAgICogQHBhcmFtIGJvZHkgLSB0aGUgdG9hc3QgYm9keVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kVG9hc3QodGl0bGU6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFRvYXN0KHRpdGxlLCBib2R5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0R2FtZW1vZGUobW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFBsYXllclNldEdhbWVtb2RlRXZlbnQodGhpcywgbW9kZSk7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucG9zdChbJ3BsYXllclNldEdhbWVtb2RlJywgZXZlbnRdKTtcbiAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmdhbWVtb2RlID0gZXZlbnQuZ2V0R2FtZW1vZGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kR2FtZW1vZGUodGhpcy5nYW1lbW9kZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlIHx8IHRoaXMuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcikgdGhpcy5hbGxvd0ZpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFsbG93RmlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Rmx5aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdhbWVtb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBHYW1lbW9kZS5nZXRHYW1lbW9kZU5hbWUodGhpcy5nYW1lbW9kZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmV0d29ya1Nlc3Npb24oKTogUGxheWVyU2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtTZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJuYW1lLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZFVzZXJuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnVzZXJuYW1lLnByZWZpeH0ke3RoaXMudXNlcm5hbWUubmFtZX0ke3RoaXMudXNlcm5hbWUuc3VmZml4fWA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBlcm1pc3Npb25zKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFVVSUQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLnV1aWQpIHRocm93IG5ldyBFcnJvcigndXVpZCBpcyBtaXNzaW5nIScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnV1aWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFhVSUQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLnh1aWQpIHRocm93IG5ldyBFcnJvcigneHVpZCBpcyBtaXNzaW5nIScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnh1aWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1NYW5hZ2VyKCk6IEZvcm1NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdpbmRvd3MoKTogV2luZG93TWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLndpbmRvd3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbG93RmxpZ2h0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxvd0ZpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BsYXllcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGBQbGF5ZXJgIGlzIGFuIG9wZXJhdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgcGxheWVyIGlzIGFuIG9wZXJhdG9yIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc09wKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXJ2ZXIoKS5nZXRQZXJtaXNzaW9uTWFuYWdlcigpLmlzT3AodGhpcy5nZXROYW1lKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBgUGxheWVyYCBpcyBzcHJpbnRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBwbGF5ZXIgaXMgc3ByaW50aW5nIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NwcmludGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ByaW50aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRTcHJpbnRpbmcoc3ByaW50aW5nOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzcHJpbnRpbmcgPT09IHRoaXMuaXNTcHJpbnRpbmcoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFBsYXllclRvZ2dsZVNwcmludEV2ZW50KHRoaXMsIHNwcmludGluZyk7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucG9zdChbJ3BsYXllclRvZ2dsZVNwcmludCcsIGV2ZW50XSk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zcHJpbnRpbmcgPSBldmVudC5nZXRJc1NwcmludGluZygpO1xuXG4gICAgICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIHB1dCB0aGlzXG4gICAgICAgIHRoaXMuc2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBNZXRhZGF0YUZsYWcuU1BSSU5USU5HLCB0aGlzLmlzU3ByaW50aW5nKCksIEZsYWdUeXBlLkJZVEUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE1ldGFkYXRhKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmx5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbHlpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEZseWluZyhmbHlpbmc6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGZseWluZyA9PT0gdGhpcy5pc0ZseWluZygpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5nZXRBbGxvd0ZsaWdodCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZseWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUGxheWVyVG9nZ2xlRmxpZ2h0RXZlbnQodGhpcywgZmx5aW5nKTtcbiAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRFdmVudE1hbmFnZXIoKS5wb3N0KFsncGxheWVyVG9nZ2xlRmxpZ2h0JywgZXZlbnRdKTtcbiAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmZseWluZyA9IGV2ZW50LmdldElzRmx5aW5nKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU25lYWtpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNuZWFraW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRTbmVha2luZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zbmVha2luZyA9IHZhbDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPbkdyb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25Hcm91bmQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldE9uR3JvdW5kKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsID09PSB0aGlzLm9uR3JvdW5kKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5vbkdyb3VuZCA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgbm90aWZ5IHRoZSBwbGF5ZXIncyBjbGllbnQgYWJvdXQgdGhlIHBvc2l0aW9uIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIG1vdmVtZW50IHR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0UG9zaXRpb24ocG9zaXRpb246IFZlY3RvcjMsIHR5cGU6IE1vdmVtZW50VHlwZSA9IE1vdmVtZW50VHlwZS5Ob3JtYWwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRYKHBvc2l0aW9uLmdldFgoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WShwb3NpdGlvbi5nZXRZKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFoocG9zaXRpb24uZ2V0WigpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5icm9hZGNhc3RNb3ZlKHRoaXMsIHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDdXJyZW50Q2h1bmsoY2h1bms6IGJpZ2ludCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2h1bmsgPT09IGNodW5rKSByZXR1cm47XG4gICAgICAgIHRoaXMuY3VycmVudENodW5rID0gY2h1bms7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRDaHVuaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENodW5rITtcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IExvZ2dlciwgUGxheWVyLCBTZXJ2ZXIgfSBmcm9tICcuLi8nO1xuaW1wb3J0IHsgUGxheWVyU2Vzc2lvbiB9IGZyb20gJy4uLyc7XG5cbmltcG9ydCB7IERpc2Nvbm5lY3RQYWNrZXQgfSBmcm9tICcuL1BhY2tldHMnO1xuaW1wb3J0IE1pbmVjcmFmdFNlc3Npb24gZnJvbSAnLi9NaW5lY3JhZnRTZXNzaW9uJztcbmltcG9ydCB0eXBlIHsgUmFrTmV0U2Vzc2lvbiB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgcGxheWVyIGNyZWF0aW9uIGl0c2VsZiwgdmVyeSBoZWxwZnVsIGFzXG4gKiBpdCBoZWxwcyB0byBub3Qgd2FzdGUgcmVzb3VyY2VzIGluIGNhc2UgdGhlIGNsaWVudCB0cnlpbmcgdG8gY29ubmVjdCBpcyBzaW1wbHlcbiAqIG91dGRhdGVkIG9yIHNlbmRzIGludmFsaWQgZGF0YSBkdXJpbmcgdGhlIGxvZ2luIGhhbmRzaGFrZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIE1pbmVjcmFmdFNlc3Npb24ge1xuICAgIHByaXZhdGUgcGxheWVyU2Vzc2lvbjogUGxheWVyU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBoYXNDb21wcmVzc2lvbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlc3Npb246IFJha05ldFNlc3Npb24sIGxvZ2dlcj86IExvZ2dlcikge1xuICAgICAgICBzdXBlcihzZXNzaW9uLCBsb2dnZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZlciAtIHRoZSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gcGxheWVyIC0gdGhlIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgcGxheWVyIHNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdFBsYXllckNvbm5lY3Rpb24oc2VydmVyOiBTZXJ2ZXIsIHBsYXllcjogUGxheWVyKTogUGxheWVyU2Vzc2lvbiB7XG4gICAgICAgIGFzc2VydCh0aGlzLnBsYXllclNlc3Npb24gPT09IG51bGwsICdQbGF5ZXIgc2Vzc2lvbiB3YXMgYWxyZWFkeSBjcmVhdGVkJyk7XG5cbiAgICAgICAgdGhpcy5wbGF5ZXJTZXNzaW9uID0gbmV3IFBsYXllclNlc3Npb24oc2VydmVyLCB0aGlzLCBwbGF5ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXJTZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNjb25uZWN0KHJlYXNvbiA9ICdkaXNjb25uZWN0LmRpc2Nvbm5lY3RlZCcsIGhpZGVSZWFzb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBEaXNjb25uZWN0UGFja2V0KCk7XG4gICAgICAgIHBhY2tldC5za2lwTWVzc2FnZSA9IGhpZGVSZWFzb247XG4gICAgICAgIHBhY2tldC5tZXNzYWdlID0gcmVhc29uO1xuICAgICAgICB2b2lkIHRoaXMuc2VuZERhdGFQYWNrZXQocGFja2V0KTtcblxuICAgICAgICAvLyBGb3JjZSBSYWtOZXQgdG8gcmVtb3ZlIHRoZSBzZXNzaW9uXG4gICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gaGFuZGxlIHRoZSBkZWFkIHNlc3Npb25cbiAgICAgICAgdGhpcy5yYWtTZXNzaW9uLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGxheWVyU2Vzc2lvbigpOiBQbGF5ZXJTZXNzaW9uIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllclNlc3Npb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJha05ldFNlc3Npb24oKTogUmFrTmV0U2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJha1Nlc3Npb247XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgSGFuZGxlcnMgZnJvbSAnLi9IYW5kbGVycyc7XG5pbXBvcnQgKiBhcyBQYWNrZXRzIGZyb20gJy4vUGFja2V0cyc7XG5cbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuL0lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIFBhY2tldEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL1BhY2tldEhhbmRsZXInO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXJTZXNzaW9uIH0gZnJvbSAnLi4vJztcbmltcG9ydCB0eXBlIFByZUxvZ2luUGFja2V0SGFuZGxlciBmcm9tICcuL2hhbmRsZXIvUHJlTG9naW5QYWNrZXRIYW5kbGVyJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4uL3V0aWxzL1RpbWVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFja2V0UmVnaXN0cnkge1xuICAgIHByaXZhdGUgc2VydmVyOiBTZXJ2ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRzOiBNYXA8bnVtYmVyLCB0eXBlb2YgUGFja2V0cy5EYXRhUGFja2V0PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBNYXA8bnVtYmVyLCBQYWNrZXRIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkVuYWJsZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBhY2tldHMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckhhbmRsZXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhY2tldHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHBhY2tldC5cbiAgICAgKiBAcGFyYW0gcGFja2V0IC0gdGhlIHBhY2tldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJQYWNrZXQocGFja2V0OiB0eXBlb2YgUGFja2V0cy5EYXRhUGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhY2tldHMuaGFzKHBhY2tldC5OZXRJRCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBhY2tldCAke3BhY2tldC5uYW1lfSBpcyB0cnlpbmcgdG8gdXNlIGlkICR7cGFja2V0Lk5ldElELnRvU3RyaW5nKDE2KX0gd2hpY2ggYWxyZWFkeSBleGlzdHMhYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnBhY2tldHMuc2V0KHBhY2tldC5OZXRJRCwgcGFja2V0KTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCk/LmRlYnVnKGBQYWNrZXQgd2l0aCBpZCDCp2Ike3BhY2tldC5uYW1lfcKnciByZWdpc3RlcmVkYCwgJ1BhY2tldFJlZ2lzdHJ5L3JlZ2lzdGVyUGFja2V0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcGFja2V0IGJ5IGl0J3MgbmV0d29yayBJRC5cbiAgICAgKiBAcGFyYW0gaWQgLSB0aGUgTmV0SUQuXG4gICAgICovXG4gICAgcHVibGljIGdldFBhY2tldChpZDogbnVtYmVyKTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLnBhY2tldHMuaGFzKGlkKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2tldCB3aXRoIGlkICR7aWR9IWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBhY2tldHMuZ2V0KGlkKSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgcGFja2V0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqIEBwYXJhbSBpZCAtIHRoZSBOZXRJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUGFja2V0KGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWNrZXRzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogbnVtYmVyLCBoYW5kbGVyOiBQYWNrZXRIYW5kbGVyPGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnMuaGFzKGlkKSkgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIHdpdGggaWQgJHtpZH0gYWxyZWFkeSBleGlzdHMhYCk7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5zZXQoaWQsIGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICA/LmRlYnVnKGBIYW5kbGVyIHdpdGggaWQgwqdiJHtoYW5kbGVyLmNvbnN0cnVjdG9yLm5hbWV9wqdyIHJlZ2lzdGVyZWRgLCAnUGFja2V0UmVnaXN0cnkvcmVnaXN0ZXJIYW5kbGVyJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhhbmRsZXIoaWQ6IG51bWJlcik6IFBhY2tldEhhbmRsZXI8YW55PiB8IFByZUxvZ2luUGFja2V0SGFuZGxlcjxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhbmRsZXJzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBoYW5kbGVyIHdpdGggaWQgJHtpZC50b1N0cmluZygxNil9IWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmdldChpZCkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIHR3byBoYW5kbGVycy5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleHRlbmQgYSBoYW5kbGVyIHdpdGhvdXQgYWN0dWFsbHkgcmVwbGFjaW5nIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgZmlyc3QgaGFuZGxlciwgZXhlY3V0ZWQgZmlyc3QuXG4gICAgICogQHBhcmFtIGhhbmRsZXIyIC0gdGhlIHNlY29uZCBoYW5kbGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBlbmRIYW5kbGVyKGhhbmRsZXI6IFBhY2tldEhhbmRsZXI8YW55PiwgaGFuZGxlcjI6IFBhY2tldEhhbmRsZXI8YW55Pik6IFBhY2tldEhhbmRsZXI8YW55PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyAoY2xhc3MgSGFuZGxlciB7XG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHBhY2tldDogYW55LCBzZXJ2ZXI6IFNlcnZlciwgc2Vzc2lvbjogUGxheWVyU2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHBhY2tldCwgc2VydmVyLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyMi5oYW5kbGUocGFja2V0LCBzZXJ2ZXIsIHNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiByZXMgYXMgUGFja2V0SGFuZGxlcjxhbnk+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGhhbmRsZXIgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICogQHBhcmFtIGlkIC0gdGhlIGhhbmRsZXIgaWQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUhhbmRsZXIoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYWxsIHBhY2tldHMgZXhwb3J0ZWQgYnkgJy4vUHJvdG9jb2wnLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQYWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIHBhY2tldHNcbiAgICAgICAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBpZ25vcmUgRGF0YVBhY2tldCAmIEJhdGNoUGFja2V0XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKFBhY2tldHMpXG4gICAgICAgICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlLm5hbWUgIT09ICdEYXRhUGFja2V0JyAmJiB2YWx1ZS5uYW1lICE9PSAnQmF0Y2hQYWNrZXQnKVxuICAgICAgICAgICAgLm1hcCgoWywgdmFsdWVdKSA9PiB0aGlzLnJlZ2lzdGVyUGFja2V0KHZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5wYWNrZXRzLnNpemV9wqdyIG9mIMKnYiR7XG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oT2JqZWN0LmtleXMoSWRlbnRpZmllcnMpKS5sZW5ndGggLSAyXG4gICAgICAgICAgICAgICAgfcKnciBwYWNrZXQocykgKHRvb2sgJHt0aW1lci5zdG9wKCl9IG1zKSFgLFxuICAgICAgICAgICAgICAgICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlclBhY2tldHMnXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGFsbCBoYW5kbGVycyBleHBvcnRlZCBieSAnLi9IYW5kbGVycycuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckhhbmRsZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEhhbmRsZXJzKS5tYXAoKFssIHZhbHVlXSkgPT4gdGhpcy5yZWdpc3RlckhhbmRsZXIodmFsdWUuTmV0SUQhLCBuZXcgKHZhbHVlIGFzIGFueSkoKSkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgID8udmVyYm9zZShcbiAgICAgICAgICAgICAgICBgUmVnaXN0ZXJlZCDCp2Ike3RoaXMuaGFuZGxlcnMuc2l6ZX3Cp3IgcGFja2V0IGhhbmRsZXIocykgKHRvb2sgJHt0aW1lci5zdG9wKCl9IG1zKSFgLFxuICAgICAgICAgICAgICAgICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlckhhbmRsZXJzJ1xuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHBhY2tldHMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcHVibGljIGdldFBhY2tldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2tldHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBoYW5kbGVycyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFJha05ldExpc3RlbmVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuaW1wb3J0IENoYXQsIHsgQ2hhdFR5cGUgfSBmcm9tICcuL2NoYXQvQ2hhdCc7XG5pbXBvcnQgQmFuTWFuYWdlciBmcm9tICcuL2Jhbi9CYW5NYW5hZ2VyJztcbmltcG9ydCBCYXRjaFBhY2tldCBmcm9tICcuL25ldHdvcmsvcGFja2V0L0JhdGNoUGFja2V0JztcbmltcG9ydCBCbG9ja01hbmFnZXIgZnJvbSAnLi9ibG9jay9CbG9ja01hbmFnZXInO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4vYmxvY2svQmxvY2tNYXBwaW5ncyc7XG5pbXBvcnQgQ2hhdEV2ZW50IGZyb20gJy4vZXZlbnRzL2NoYXQvQ2hhdEV2ZW50JztcbmltcG9ydCBDaGF0TWFuYWdlciBmcm9tICcuL2NoYXQvQ2hhdE1hbmFnZXInO1xuaW1wb3J0IENsaWVudENvbm5lY3Rpb24gZnJvbSAnLi9uZXR3b3JrL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IENvbW1hbmRNYW5hZ2VyIGZyb20gJy4vY29tbWFuZC9Db21tYW5kTWFuYWdlcic7XG5pbXBvcnQgQ29uc29sZSBmcm9tICcuL0NvbnNvbGUnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUGFja2V0IH0gZnJvbSAnLi9uZXR3b3JrL1BhY2tldHMnO1xuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9ldmVudHMvRXZlbnRNYW5hZ2VyJztcbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuL25ldHdvcmsvSWRlbnRpZmllcnMnO1xuaW1wb3J0IEl0ZW1NYW5hZ2VyIGZyb20gJy4vaXRlbS9JdGVtTWFuYWdlcic7XG5pbXBvcnQgUGFja2V0UmVnaXN0cnkgZnJvbSAnLi9uZXR3b3JrL1BhY2tldFJlZ2lzdHJ5JztcbmltcG9ydCBQZXJtaXNzaW9uTWFuYWdlciBmcm9tICcuL3Blcm1pc3Npb24vUGVybWlzc2lvbk1hbmFnZXInO1xuaW1wb3J0IFBsdWdpbk1hbmFnZXIgZnJvbSAnLi9wbHVnaW4vUGx1Z2luTWFuYWdlcic7XG5pbXBvcnQgUXVlcnlNYW5hZ2VyIGZyb20gJy4vcXVlcnkvUXVlcnlNYW5hZ2VyJztcbmltcG9ydCBSYWtuZXRDb25uZWN0RXZlbnQgZnJvbSAnLi9ldmVudHMvcmFrbmV0L1Jha25ldENvbm5lY3RFdmVudCc7XG5pbXBvcnQgUmFrbmV0RGlzY29ubmVjdEV2ZW50IGZyb20gJy4vZXZlbnRzL3Jha25ldC9SYWtuZXREaXNjb25uZWN0RXZlbnQnO1xuaW1wb3J0IFJha25ldEVuY2Fwc3VsYXRlZFBhY2tldEV2ZW50IGZyb20gJy4vZXZlbnRzL3Jha25ldC9SYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXRFdmVudCc7XG5pbXBvcnQgU2Vzc2lvbk1hbmFnZXIgZnJvbSAnLi9TZXNzaW9uTWFuYWdlcic7XG5pbXBvcnQgeyBUaWNrRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9FdmVudHMnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vdXRpbHMvVGltZXInO1xuaW1wb3J0IFdvcmxkTWFuYWdlciBmcm9tICcuL3dvcmxkL1dvcmxkTWFuYWdlcic7XG5cbmltcG9ydCB0eXBlIENvbmZpZyBmcm9tICcuL2NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHR5cGUgTG9nZ2VyQnVpbGRlciBmcm9tICcuL3V0aWxzL0xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IFJha05ldFNlc3Npb24sIEluZXRBZGRyZXNzIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXIge1xuICAgIHByaXZhdGUgdmVyc2lvbiE6IHN0cmluZztcbiAgICBwcml2YXRlIHJha25ldCE6IFJha05ldExpc3RlbmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJCdWlsZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDb25maWc7XG4gICAgcHJpdmF0ZSB0cHMgPSAyMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnNvbGU6IENvbnNvbGU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudE1hbmFnZXIgPSBuZXcgRXZlbnRNYW5hZ2VyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRSZWdpc3RyeTogUGFja2V0UmVnaXN0cnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uTWFuYWdlciA9IG5ldyBTZXNzaW9uTWFuYWdlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTWFuYWdlcjogUGx1Z2luTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRNYW5hZ2VyOiBDb21tYW5kTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmxkTWFuYWdlcjogV29ybGRNYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXRlbU1hbmFnZXI6IEl0ZW1NYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tNYW5hZ2VyOiBCbG9ja01hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBxdWVyeU1hbmFnZXI6IFF1ZXJ5TWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoYXRNYW5hZ2VyOiBDaGF0TWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25NYW5hZ2VyOiBQZXJtaXNzaW9uTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhbk1hbmFnZXI6IEJhbk1hbmFnZXI7XG4gICAgcHJpdmF0ZSBzdG9wcGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgdGlja2VyVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUlORUNSQUZUX1RJQ0tfVElNRV9NUyA9IDEwMDAgLyAyMDtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTogU2VydmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHsgbG9nZ2VyLCBjb25maWcsIHZlcnNpb24gfTogeyBsb2dnZXI/OiBMb2dnZXJCdWlsZGVyOyBjb25maWc6IENvbmZpZzsgdmVyc2lvbjogc3RyaW5nIH0pIHtcbiAgICAgICAgY29uc3QgYWR2ZXJ0aXNlZFZlcnNpb24gPVxuICAgICAgICAgICAgSWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMubGVuZ3RoIDw9IDFcbiAgICAgICAgICAgICAgICA/IGDCp2V2JHtJZGVudGlmaWVycy5NaW5lY3JhZnRWZXJzaW9ucy5hdCgwKX3Cp3JgXG4gICAgICAgICAgICAgICAgOiBgwqdldiR7SWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMuYXQoMCl9wqdyLcKnZXYke0lkZW50aWZpZXJzLk1pbmVjcmFmdFZlcnNpb25zLmF0KC0xKX3Cp3JgO1xuXG4gICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBTdGFydGluZyBKU1ByaXNtYXJpbmUgc2VydmVyIHZlcnNpb24gwqdldiR7dmVyc2lvbn3Cp3IgZm9yIE1pbmVjcmFmdDogQmVkcm9jayBFZGl0aW9uICR7YWR2ZXJ0aXNlZFZlcnNpb259IChwcm90b2NvbCB2ZXJzaW9uIMKnZSR7SWRlbnRpZmllcnMuUHJvdG9jb2x9wqdyKWAsXG4gICAgICAgICAgICAnU2VydmVyJ1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyITtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuY29uc29sZSA9IG5ldyBDb25zb2xlKHRoaXMpO1xuICAgICAgICB0aGlzLnBhY2tldFJlZ2lzdHJ5ID0gbmV3IFBhY2tldFJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLml0ZW1NYW5hZ2VyID0gbmV3IEl0ZW1NYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLmJsb2NrTWFuYWdlciA9IG5ldyBCbG9ja01hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMud29ybGRNYW5hZ2VyID0gbmV3IFdvcmxkTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5jb21tYW5kTWFuYWdlciA9IG5ldyBDb21tYW5kTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5wbHVnaW5NYW5hZ2VyID0gbmV3IFBsdWdpbk1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMucXVlcnlNYW5hZ2VyID0gbmV3IFF1ZXJ5TWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5jaGF0TWFuYWdlciA9IG5ldyBDaGF0TWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uTWFuYWdlciA9IG5ldyBQZXJtaXNzaW9uTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iYW5NYW5hZ2VyID0gbmV3IEJhbk1hbmFnZXIodGhpcyk7XG5cbiAgICAgICAgU2VydmVyLmluc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uRW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZy5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25NYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJhbk1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pdGVtTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJsb2NrTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1hbmRNYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkRpc2FibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tbWFuZE1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYmxvY2tNYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLml0ZW1NYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJhbk1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJtaXNzaW9uTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYWNrZXRSZWdpc3RyeS5vbkRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5jb25maWcub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLm9uRGlzYWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMub25FbmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwKHNlcnZlcklwID0gJzAuMC4wLjAnLCBwb3J0ID0gMTkxMzIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkVuYWJsZSgpO1xuICAgICAgICBCbG9ja01hcHBpbmdzLmluaXRNYXBwaW5ncygpO1xuICAgICAgICBhd2FpdCB0aGlzLndvcmxkTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBhY2tldFJlZ2lzdHJ5Lm9uRW5hYmxlKCk7XG5cbiAgICAgICAgdGhpcy5yYWtuZXQgPSBuZXcgUmFrTmV0TGlzdGVuZXIodGhpcy5nZXRDb25maWcoKS5nZXRNYXhQbGF5ZXJzKCksIGZhbHNlKTtcbiAgICAgICAgdGhpcy5yYWtuZXQuc3RhcnQoc2VydmVySXAsIHBvcnQpO1xuXG4gICAgICAgIHRoaXMucmFrbmV0Lm9uKCdvcGVuQ29ubmVjdGlvbicsIGFzeW5jIChzZXNzaW9uOiBSYWtOZXRTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBSYWtuZXRDb25uZWN0RXZlbnQoc2Vzc2lvbik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50TWFuYWdlci5lbWl0KCdyYWtuZXRDb25uZWN0JywgZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuaXNDYW5jZWxsZWQoKSkge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBzZXNzaW9uLmdldEFkZHJlc3MoKS50b1Rva2VuKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uTWFuYWdlci5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBBbm90aGVyIGNsaWVudCB3aXRoIHRva2VuICgke3Rva2VufSkgaXMgYWxyZWFkeSBjb25uZWN0ZWQhYCxcbiAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vb3BlbkNvbm5lY3Rpb24nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoJ0FscmVhZHkgY29ubmVjdGVkIGZyb20gYW5vdGhlciBsb2NhdGlvbicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGltZXIgPSBuZXcgVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3Rva2VufSBpcyBhdHRlbXB0aW5nIHRvIGNvbm5lY3RgLCAnU2VydmVyL2xpc3Rlbi9vcGVuQ29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uTWFuYWdlci5hZGQodG9rZW4sIG5ldyBDbGllbnRDb25uZWN0aW9uKHNlc3Npb24sIHRoaXMubG9nZ2VyKSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBOZXcgY29ubmVjdGlvbiBoYW5kbGluZyB0b29rICR7dGltZXIuc3RvcCgpfSBtc2AsICdTZXJ2ZXIvbGlzdGVuL29wZW5Db25uZWN0aW9uJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmFrbmV0Lm9uKCdjbG9zZUNvbm5lY3Rpb24nLCBhc3luYyAoaW5ldEFkZHI6IEluZXRBZGRyZXNzLCByZWFzb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUmFrbmV0RGlzY29ubmVjdEV2ZW50KGluZXRBZGRyLCByZWFzb24pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgncmFrbmV0RGlzY29ubmVjdCcsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IGluZXRBZGRyLnRvVG9rZW4oKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRQbGF5ZXIodG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgLy8gRGUtc3Bhd24gdGhlIHBsYXllciB0byBhbGwgb25saW5lIHBsYXllcnNcbiAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5yZW1vdmVGcm9tUGxheWVyTGlzdCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb25saW5lUGxheWVyIG9mIHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0QWxsUGxheWVycygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLnNlbmREZXNwYXduKG9ubGluZVBsYXllcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHdlIGZhaWwgYXQgZGVjb2RpbmcgdGhlIHVzZXJuYW1lIGZvciB3aGF0ZXZlciByZWFzb25cbiAgICAgICAgICAgICAgICBpZiAocGxheWVyLmdldE5hbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSBkaXNjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IENoYXRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaGF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgwqdlJW11bHRpcGxheWVyLnBsYXllci5sZWZ0YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheWVyLmdldE5hbWUoKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKi5ldmVyeW9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdFR5cGUuVFJBTlNMQVRJT05cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgnY2hhdCcsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIub25EaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLmdldFdvcmxkKCkucmVtb3ZlRW50aXR5KHBsYXllcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uTWFuYWdlci5yZW1vdmUodG9rZW4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCByZW1vdmUgY29ubmVjdGlvbiBmcm9tIG5vbi1leGlzdGluZyBwbGF5ZXIgKCR7dG9rZW59KWAsXG4gICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldERpc2Nvbm5lY3QnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciwgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RGlzY29ubmVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHt0b2tlbn0gZGlzY29ubmVjdGVkIGR1ZSB0byAke3JlYXNvbn1gLCAnU2VydmVyL2xpc3Rlbi9yYWtuZXREaXNjb25uZWN0Jyk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBQbGF5ZXIgZGVzdHJ1Y3Rpb24gdG9vayBhYm91dCAke0RhdGUubm93KCkgLSB0aW1lfSBtc2AsXG4gICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RGlzY29ubmVjdCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmFrbmV0Lm9uKCdlbmNhcHN1bGF0ZWQnLCBhc3luYyAocGFja2V0OiBhbnksIGluZXRBZGRyOiBJbmV0QWRkcmVzcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0RXZlbnQoaW5ldEFkZHIsIHBhY2tldCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50TWFuYWdlci5lbWl0KCdyYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnLCBldmVudCk7XG5cbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uIHwgbnVsbDtcbiAgICAgICAgICAgIGlmICgoY29ubmVjdGlvbiA9IHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0KGluZXRBZGRyLnRvVG9rZW4oKSkgPz8gbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgR290IGEgcGFja2V0IGZyb20gYSBjbG9zZWQgY29ubmVjdGlvbiAoJHtpbmV0QWRkci50b1Rva2VuKCl9KWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBSZWFkIGJhdGNoIGNvbnRlbnQgYW5kIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hlZCA9IG5ldyBCYXRjaFBhY2tldChwYWNrZXQuY29udGVudCk7XG4gICAgICAgICAgICAgICAgYmF0Y2hlZC5jb21wcmVzc2VkID0gY29ubmVjdGlvbi5oYXNDb21wcmVzc2lvbjtcblxuICAgICAgICAgICAgICAgIC8vIFJlYWQgYWxsIHBhY2tldHMgaW5zaWRlIGJhdGNoIGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnVmIG9mIGF3YWl0IGJhdGNoZWQuYXN5bmNEZWNvZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWQgPSBidWZbMF0hO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYWNrZXRSZWdpc3RyeS5nZXRQYWNrZXRzKCkuaGFzKHBpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFBhY2tldCAweCR7cGlkLnRvU3RyaW5nKDE2KX0gaXNuJ3QgaW1wbGVtZW50ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBwYWNrZXQgZnJvbSByZWdpc3RyeVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgKHRoaXMucGFja2V0UmVnaXN0cnkuZ2V0UGFja2V0cygpLmdldChwaWQpISkoYnVmKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LmRlY29kZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHdoaWxlIGRlY29kaW5nIHBhY2tldDogJHtwYWNrZXQuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMucGFja2V0UmVnaXN0cnkuZ2V0SGFuZGxlcihwaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuc2lsbHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFJlY2VpdmVkIMKnYiR7cGFja2V0LmNvbnN0cnVjdG9yLm5hbWV9wqdyIHBhY2tldGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IChoYW5kbGVyIGFzIGFueSkuaGFuZGxlKHBhY2tldCwgdGhpcywgY29ubmVjdGlvbi5nZXRQbGF5ZXJTZXNzaW9uKCkgPz8gY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgSGFuZGxlciBlcnJvciAke3BhY2tldC5jb25zdHJ1Y3Rvci5uYW1lfS1oYW5kbGVyOiAoJHtlcnJvcn0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciwgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmFrbmV0Lm9uKCdyYXcnLCBhc3luYyAoYnVmZmVyOiBCdWZmZXIsIGluZXRBZGRyOiBJbmV0QWRkcmVzcykgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5TWFuYWdlci5vblJhdyhidWZmZXIsIGluZXRBZGRyKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIvbGlzdGVuL3JhdycpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYFF1ZXJ5TWFuYWdlciBmYWlsZWQgd2l0aCBlcnJvcjogJHtlcnJvcn1gLCAnU2VydmVyL2xpc3Rlbi9yYXcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVE9ETzogY2FsY3VsYXRlIFRQUy5cbiAgICAgICAgbGV0IHRpY2tDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgVGlja0V2ZW50KHRpY2tDb3VudCk7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmV2ZW50TWFuYWdlci5lbWl0KCd0aWNrJywgZXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB3b3JsZCBvZiB0aGlzLndvcmxkTWFuYWdlci5nZXRXb3JsZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHdvcmxkLnVwZGF0ZShldmVudC5nZXRUaWNrKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICsrdGlja0NvdW50O1xuICAgICAgICAgICAgICAgIHRpY2soKTtcbiAgICAgICAgICAgIH0sIFNlcnZlci5NSU5FQ1JBRlRfVElDS19USU1FX01TKTtcblxuICAgICAgICAvLyBTdGFydCB0aWNraW5nXG4gICAgICAgIHRoaXMudGlja2VyVGltZXIgPSB0aWNrKCk7XG4gICAgICAgIHRoaXMudGlja2VyVGltZXIudW5yZWYoKTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBKU1ByaXNtYXJpbmUgaXMgbm93IGxpc3RlbmluZyBvbiBwb3J0IMKnYiR7cG9ydH1gLCAnU2VydmVyL2xpc3RlbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEtpbGxzIHRoZSBzZXJ2ZXIgYXN5bmNocm9ub3VzbHkuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiB7IHdpdGhvdXRTYXZpbmc/OiBib29sZWFuOyBjcmFzaD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5zdG9wcGluZykgcmV0dXJuO1xuICAgICAgICB0aGlzLnN0b3BwaW5nID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdTdG9wcGluZyBzZXJ2ZXInLCAnU2VydmVyL2tpbGwnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25zb2xlLm9uRGlzYWJsZSgpO1xuXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aWNrZXJUaW1lcik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEtpY2sgYWxsIG9ubGluZSBwbGF5ZXJzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldEFsbFBsYXllcnMoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllci5raWNrKCdTZXJ2ZXIgY2xvc2VkLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYXZlIGFsbCB3b3JsZHNcbiAgICAgICAgICAgIGlmICghb3B0aW9ucz8ud2l0aG91dFNhdmluZykgYXdhaXQgdGhpcy53b3JsZE1hbmFnZXIuc2F2ZSgpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndvcmxkTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25EaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLnJha25ldC5raWxsKCk7IC8vIHRoaXMucmFrbmV0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB3ZSBraWxsIHRoZSBzZXJ2ZXIgcmVhbGx5IGVhcmx5XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQob3B0aW9ucz8uY3Jhc2ggPyAxIDogMCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciwgJ1NlcnZlci9raWxsJyk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYnJvYWRjYXN0UGFja2V0PFQgZXh0ZW5kcyBEYXRhUGFja2V0PihkYXRhUGFja2V0OiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIE1heWJlIGkgY2FuIGltcHJvdmUgdGhpcyBieSB1c2luZyB0aGUgVURQIGJyb2FkY2FzdCwgYWxsIHVuY29ubmVjdGVkIGNsaWVudHNcbiAgICAgICAgLy8gd2lsbCBpZ25vcmUgdGhlIGNvbm5lY3RlZCBwYWNrZXQgcHJvYmFibHksIGJ1dCBtYXkgY2F1c2UgaXNzdWVzLlxuICAgICAgICBmb3IgKGNvbnN0IG9ubGluZVBsYXllciBvZiB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldEFsbFBsYXllcnMoKSkge1xuICAgICAgICAgICAgYXdhaXQgb25saW5lUGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KGRhdGFQYWNrZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SWRlbnRpZmllcnMoKSB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBxdWVyeSBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFF1ZXJ5TWFuYWdlcigpOiBRdWVyeU1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeU1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29tbWFuZCBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldENvbW1hbmRNYW5hZ2VyKCk6IENvbW1hbmRNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZE1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGxheWVyIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2Vzc2lvbk1hbmFnZXIoKTogU2Vzc2lvbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB3b3JsZCBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFdvcmxkTWFuYWdlcigpOiBXb3JsZE1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy53b3JsZE1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaXRlbSBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldEl0ZW1NYW5hZ2VyKCk6IEl0ZW1NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbU1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmxvY2sgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCbG9ja01hbmFnZXIoKTogQmxvY2tNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxvZ2dlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMb2dnZXIoKTogTG9nZ2VyQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYWNrZXQgcmVnaXN0cnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFja2V0UmVnaXN0cnkoKTogUGFja2V0UmVnaXN0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRSZWdpc3RyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByYWtuZXQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UmFrbmV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYWtuZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGx1Z2luIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGx1Z2luTWFuYWdlcigpOiBQbHVnaW5NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBldmVudCBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldEV2ZW50TWFuYWdlcigpOiBFdmVudE1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudE1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2hhdCBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldENoYXRNYW5hZ2VyKCk6IENoYXRNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhdE1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGdldENvbmZpZygpOiBDb25maWcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29uc29sZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25zb2xlKCk6IENvbnNvbGUge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zb2xlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBlcm1pc3Npb24gbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQZXJtaXNzaW9uTWFuYWdlcigpOiBQZXJtaXNzaW9uTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJhbiBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldEJhbk1hbmFnZXIoKTogQmFuTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIFByaXNtYXJpbmUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VydmVyKCk6IFNlcnZlciB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgVFBTXG4gICAgICovXG4gICAgcHVibGljIGdldFRQUygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50cHM7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbImNtZCIsInBhcmFtZXRlcnMiLCJldmVudCIsInBhY2tldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY08sTUFBZSxlQUFnQixDQUFBO0FBQUEsRUFDM0IsZUFBMEIsR0FBQTtBQUM3QixJQUFPLE9BQUEsRUFBQSxDQUFBO0FBQUEsR0FDWDtBQUFBLEVBQ08sYUFBbUQsR0FBQTtBQUN0RCxJQUFBLDJCQUFXLEdBQUksRUFBQSxDQUFBO0FBQUEsR0FDbkI7QUFDSixDQUFBO0FBRU8sTUFBTSx1QkFBbUQsQ0FBQTtBQUFBLEVBQ3BELElBQUEsQ0FBQTtBQUFBLEVBQ0EsUUFBQSxDQUFBO0FBQUEsRUFDQSxLQUFBLENBQUE7QUFBQSxFQUNBLE9BQUEsQ0FBQTtBQUFBLEVBRUQsWUFBWSxJQUErRixFQUFBO0FBQzlHLElBQUssSUFBQSxDQUFBLElBQUEsR0FBTyxNQUFNLElBQVEsSUFBQSxVQUFBLENBQUE7QUFDMUIsSUFBSyxJQUFBLENBQUEsUUFBQSxHQUFXLE1BQU0sUUFBWSxJQUFBLEtBQUEsQ0FBQTtBQUNsQyxJQUFLLElBQUEsQ0FBQSxLQUFBLEdBQVEsSUFBTSxFQUFBLEtBQUEsSUFBUyxxQkFBc0IsQ0FBQSxJQUFBLENBQUE7QUFDbEQsSUFBSyxJQUFBLENBQUEsT0FBQSxHQUFVLE1BQU0sT0FBVyxJQUFBLElBQUEsQ0FBQTtBQUFBLEdBQ3BDO0FBQUEsRUFFTyxLQUFBLENBQU0sUUFBc0IsUUFBa0MsRUFBQTtBQUNqRSxJQUFNLE1BQUEsRUFBQSxHQUFLLE9BQU8sVUFBVyxFQUFBLENBQUE7QUFFN0IsSUFBQSxRQUFBLENBQVMsY0FBYyxFQUFFLENBQUEsQ0FBQTtBQUN6QixJQUFPLE9BQUEsRUFBQSxDQUFBO0FBQUEsR0FDWDtBQUFBLEVBQ0EsTUFBYSxl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