PlotManager.js
33.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/script/avg/PlotManager.js';
var __require = nodeEnv ? function (request) {
return cc.require(request);
} : function (request) {
return __quick_compile_project__.require(request, __filename);
};
function __define (exports, require, module) {
if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '53477m/IolGY50slmiyXtaj', 'PlotManager');
// script/avg/PlotManager.ts
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PlotManager = void 0;
const simba_eventkit_1 = require("simba-eventkit");
const ActionManager_1 = require("./ActionManager");
const EditorEvents_1 = require("./EditorEvents");
const GameRecord_1 = require("./game-data/GameRecord");
const PlotsData_1 = require("./game-data/PlotsData");
const PlotModel_1 = require("./model/PlotModel");
const PlotUtils_1 = require("./utils/PlotUtils");
var PlotManager;
(function (PlotManager) {
let emitter = new simba_eventkit_1.Emitter;
let currentPlots = [];
function getCurrentPlots() {
return currentPlots;
}
PlotManager.getCurrentPlots = getCurrentPlots;
// 剧情开始,需要在特定场景展现、执行Action等
PlotManager.PlotStartEvent = emitter.createEvent();
// 剧情将要开始,可根据将要开始的剧情修改存档数据保存
PlotManager.PlotWillStart = emitter.createEvent();
PlotManager.PlotsRollbackEvent = emitter.createEvent();
let customPlotId = PlotModel_1.SpecialPlotId.CustomPlotStart;
let plotSelections;
function getPlotSelection(plotId) {
return plotSelections[plotId];
}
PlotManager.getPlotSelection = getPlotSelection;
async function init() {
await PlotsData_1.initPlotsData();
GameRecord_1.GameRecord.initRecords();
customPlotId = GameRecord_1.GameRecord.globalVariables.customPlotId;
PlotsData_1.initCustomPlots(GameRecord_1.GameRecord.globalVariables.customPlots);
EditorEvents_1.EditorEvents.START_PLOT_BRANCH.on((param) => {
let plotId = parseInt(param);
return startNewPlotBranch(plotId);
});
}
PlotManager.init = init;
// Add custom plot and return plot id
function addCustomPlot(plot) {
plot.id = customPlotId--;
PlotsData_1.addCustomPlotData(plot);
GameRecord_1.GameRecord.globalVariables.customPlotId = customPlotId;
GameRecord_1.GameRecord.globalVariables.customPlots = PlotsData_1.getChapterPlots(-100);
GameRecord_1.GameRecord.autoSave();
}
PlotManager.addCustomPlot = addCustomPlot;
function addCustomPlots(plots) {
for (let plot of plots) {
plot.id = customPlotId--;
PlotsData_1.addCustomPlotData(plot);
}
GameRecord_1.GameRecord.globalVariables.customPlotId = customPlotId;
GameRecord_1.GameRecord.globalVariables.customPlots = PlotsData_1.getChapterPlots(-100);
GameRecord_1.GameRecord.autoSave();
}
PlotManager.addCustomPlots = addCustomPlots;
async function start(recordIndex = 0) {
let plots = GameRecord_1.GameRecord.startGameWithRecord(recordIndex);
currentPlots = await Promise.all(plots.map(v => PlotsData_1.getPlot(v)));
plotSelections = {};
let items = GameRecord_1.GameRecord.getCurrentRecordItems();
for (let p of items) {
if (p.s) {
for (let i = 0; i < p.p.length; i++) {
if (p.s[i] !== undefined) {
plotSelections[p.p[i]] = p.s[i];
}
}
}
}
// 检查未完待续剧情,如有新剧情修改存档数据
for (let i = 0; i < plots.length; i++) {
let plotId = plots[i];
if (plotId === PlotModel_1.SpecialPlotId.ToBeContinued) {
let index = items.length - 2;
for (; index >= 0; index--) {
if (items[index].p[i] >= 0) {
plotId = items[index].p[i];
break;
}
}
if (plotId < 0)
throw new Error("Record error.");
let plot = (await PlotsData_1.getPlot(plotId));
let sels = items[index].s;
let nextPlot = (await getNextPlot(plot, sels ? sels[i] : undefined));
if (nextPlot.id >= 0) {
for (let j = index + 1; j < items.length; j++) { // 修改存档数据
items[index].p[i] = nextPlot.id;
}
}
currentPlots[i] = nextPlot;
}
}
PlotManager.PlotStartEvent.emit(currentPlots);
return currentPlots;
}
PlotManager.start = start;
async function startNewPlotBranch(plotId) {
let index = currentPlots.findIndex(v => v && v.id === plotId);
if (index >= 0) {
console.warn("startNewPlotBranch: plot already exist.", plotId);
return -1;
}
let plot = await PlotsData_1.getPlot(plotId);
await Promise.all(PlotManager.PlotWillStart.emit(plot, index));
let history = GameRecord_1.GameRecord.getCurrentRecordItems();
index = history[history.length - 1].p.length;
let plots = GameRecord_1.GameRecord.startPlot(plotId, index);
currentPlots = await Promise.all(plots.map(v => PlotsData_1.getPlot(v)));
PlotManager.PlotStartEvent.emit(currentPlots);
return index;
}
PlotManager.startNewPlotBranch = startNewPlotBranch;
async function getNextPlot(plot, selectOption) {
let id = getNextPlotId(plot, selectOption);
return PlotsData_1.getPlot(id);
}
PlotManager.getNextPlot = getNextPlot;
function getNextPlotId(plot, selectOption, saveToRecord) {
let nextPlotId;
if (selectOption !== undefined && selectOption !== null) {
if (plot.jump.type !== PlotModel_1.PlotJumpType.Select) {
throw new Error("Plot jump type error");
}
let selectIndex;
if (typeof selectOption === "string") {
for (let i = 0; i < plot.jump.jumps.length; i++) {
if (plot.jump.jumps[i].id == selectOption) {
selectIndex = i;
}
}
}
else {
selectIndex = selectOption;
}
if (selectIndex >= plot.jump.jumps.length) {
throw new Error("Invalid option");
}
if (saveToRecord) {
GameRecord_1.GameRecord.setSelectOptionForPlot(plot.id, selectIndex);
}
nextPlotId = plot.jump.jumps[selectIndex].toPlot;
}
else {
if (plot.jump.type !== PlotModel_1.PlotJumpType.Condition) {
throw new Error("Plot jump type error");
}
let conditions = plot.jump.conditionBranches;
if (conditions) {
try {
for (let cond of conditions) {
if (cond.condition && PlotUtils_1.evalConditionExpr(cond.condition)) {
nextPlotId = cond.toPlot;
break;
}
}
}
catch (e) {
}
}
if (nextPlotId === undefined)
nextPlotId = plot.jump.toPlot;
}
return nextPlotId;
}
async function completePlot(plot, selectOption, customData) {
let plotIndex = currentPlots.findIndex(v => v && v.id === plot.id);
if (plotIndex < 0)
throw new Error("Invalid plot");
GameRecord_1.GameRecord.startTransaction();
if (selectOption !== undefined) {
await Promise.all(EditorEvents_1.EditorEvents.emitter.emit("SELECT_OPTION_" + ((typeof selectOption === "number") ? selectOption + 1 : selectOption)));
}
await Promise.all(EditorEvents_1.EditorEvents.PLOT_END.emit(plot.id.toString()));
ActionManager_1.ActionManager.stop();
let nextPlotId = getNextPlotId(plot, selectOption, true);
if (customData) {
GameRecord_1.GameRecord.setPlotCustomData(plotIndex, customData);
}
let nextPlot = await PlotsData_1.getPlot(nextPlotId);
await Promise.all(PlotManager.PlotWillStart.emit(nextPlot, plotIndex));
let plots = GameRecord_1.GameRecord.startPlot(nextPlotId, plotIndex);
GameRecord_1.GameRecord.endTransaction();
if (typeof selectOption === "number") {
plotSelections[plot.id] = selectOption;
}
currentPlots = await Promise.all(plots.map(v => PlotsData_1.getPlot(v)));
PlotManager.PlotStartEvent.emit(currentPlots);
return currentPlots;
}
PlotManager.completePlot = completePlot;
async function rollbackToPlot(plot, reverseFind = false, preserveVars) {
GameRecord_1.GameRecord.rollbackToPlot(plot, reverseFind, preserveVars);
return rollbackFinished();
}
PlotManager.rollbackToPlot = rollbackToPlot;
function rollbackToIndex(index, preserveVars) {
GameRecord_1.GameRecord.rollbackToIndex(index, preserveVars);
return rollbackFinished();
}
PlotManager.rollbackToIndex = rollbackToIndex;
async function rollbackFinished() {
let recordItems = GameRecord_1.GameRecord.getCurrentRecordItems();
plotSelections = {};
for (let p of recordItems) {
if (p.s) {
for (let i = 0; i < p.p.length; i++) {
if (p.s[i] !== undefined) {
plotSelections[p.p[i]] = p.s[i];
}
}
}
}
let plots = recordItems[recordItems.length - 1].p;
currentPlots = await Promise.all(plots.map(v => PlotsData_1.getPlot(v)));
PlotManager.PlotsRollbackEvent.emit(currentPlots);
return currentPlots;
}
})(PlotManager = exports.PlotManager || (exports.PlotManager = {}));
cc._RF.pop();
}
if (nodeEnv) {
__define(__module.exports, __require, __module);
}
else {
__quick_compile_project__.registerModuleFunc(__filename, function () {
__define(__module.exports, __require, __module);
});
}
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvYXZnL1Bsb3RNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUF5QztBQUN6QyxtREFBZ0Q7QUFDaEQsaURBQThDO0FBQzlDLHVEQUFvRDtBQUNwRCxxREFBb0g7QUFDcEgsaURBQW1HO0FBQ25HLGlEQUFzRDtBQUV0RCxJQUFpQixXQUFXLENBNE4zQjtBQTVORCxXQUFpQixXQUFXO0lBQ3hCLElBQUksT0FBTyxHQUFHLElBQUksd0JBQU8sQ0FBQztJQUMxQixJQUFJLFlBQVksR0FBbUIsRUFBRSxDQUFDO0lBRXRDLFNBQWdCLGVBQWU7UUFDM0IsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUZlLDJCQUFlLGtCQUU5QixDQUFBO0lBRUQsMkJBQTJCO0lBQ2QsMEJBQWMsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFrQyxDQUFDO0lBRXBGLDRCQUE0QjtJQUNmLHlCQUFhLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBNEQsQ0FBQztJQUVoRyw4QkFBa0IsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFrQyxDQUFDO0lBRXhGLElBQUksWUFBWSxHQUFHLHlCQUFhLENBQUMsZUFBZSxDQUFDO0lBRWpELElBQUksY0FBeUMsQ0FBQztJQUU5QyxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjO1FBQzNDLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFGZSw0QkFBZ0IsbUJBRS9CLENBQUE7SUFFTSxLQUFLLFVBQVUsSUFBSTtRQUN0QixNQUFNLHlCQUFhLEVBQUUsQ0FBQztRQUN0Qix1QkFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLFlBQVksR0FBRyx1QkFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7UUFDdkQsMkJBQWUsQ0FBQyx1QkFBVSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4RCwyQkFBWSxDQUFDLGlCQUFpQixDQUFDLEVB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LENBQUM7SUFDeEIsQ0FBQztBQUNMLENBQUMsRUE1TmdCLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBNE4zQiIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tIFwic2ltYmEtZXZlbnRraXRcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi9BY3Rpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBFZGl0b3JFdmVudHMgfSBmcm9tIFwiLi9FZGl0b3JFdmVudHNcIjtcbmltcG9ydCB7IEdhbWVSZWNvcmQgfSBmcm9tIFwiLi9nYW1lLWRhdGEvR2FtZVJlY29yZFwiO1xuaW1wb3J0IHsgZ2V0UGxvdCwgaW5pdFBsb3RzRGF0YSwgaW5pdEN1c3RvbVBsb3RzLCBhZGRDdXN0b21QbG90RGF0YSwgZ2V0Q2hhcHRlclBsb3RzIH0gZnJvbSBcIi4vZ2FtZS1kYXRhL1Bsb3RzRGF0YVwiO1xuaW1wb3J0IHsgUGxvdEp1bXBUeXBlLCBSZWFkb25seVBsb3QsIFJlYWRvbmx5UGxvdHMsIFNwZWNpYWxQbG90SWQsIFBsb3QgfSBmcm9tIFwiLi9tb2RlbC9QbG90TW9kZWxcIjtcbmltcG9ydCB7IGV2YWxDb25kaXRpb25FeHByIH0gZnJvbSBcIi4vdXRpbHMvUGxvdFV0aWxzXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgUGxvdE1hbmFnZXIge1xuICAgIGxldCBlbWl0dGVyID0gbmV3IEVtaXR0ZXI7XG4gICAgbGV0IGN1cnJlbnRQbG90czogUmVhZG9ubHlQbG90W10gPSBbXTtcblxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50UGxvdHMoKTogUmVhZG9ubHlQbG90cyB7XG4gICAgICAgIHJldHVybiBjdXJyZW50UGxvdHM7XG4gICAgfVxuXG4gICAgLy8g5Ymn5oOF5byA5aeL77yM6ZyA6KaB5Zyo54m55a6a5Zy65pmv5bGV546w44CB5omn6KGMQWN0aW9u562JXG4gICAgZXhwb3J0IGNvbnN0IFBsb3RTdGFydEV2ZW50ID0gZW1pdHRlci5jcmVhdGVFdmVudDwocGxvdHM6IFJlYWRvbmx5UGxvdHMpID0+IHZvaWQ+KCk7XG5cbiAgICAvLyDliafmg4XlsIbopoHlvIDlp4vvvIzlj6/moLnmja7lsIbopoHlvIDlp4vnmoTliafmg4Xkv67mlLnlrZjmoaPmlbDmja7kv53lrZhcbiAgICBleHBvcnQgY29uc3QgUGxvdFdpbGxTdGFydCA9IGVtaXR0ZXIuY3JlYXRlRXZlbnQ8KHBsb3Q6IFJlYWRvbmx5UGxvdCB8IHVuZGVmaW5lZCwgYnJhbmNoOiBudW1iZXIpID0+IHZvaWQ+KCk7XG5cbiAgICBleHBvcnQgY29uc3QgUGxvdHNSb2xsYmFja0V2ZW50ID0gZW1pdHRlci5jcmVhdGVFdmVudDwocGxvdHM6IFJlYWRvbmx5UGxvdHMpID0+IHZvaWQ+KCk7XG5cbiAgICBsZXQgY3VzdG9tUGxvdElkID0gU3BlY2lhbFBsb3RJZC5DdXN0b21QbG90U3RhcnQ7XG5cbiAgICBsZXQgcGxvdFNlbGVjdGlvbnM6IHsgW2tleTogbnVtYmVyXTogbnVtYmVyIH07XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0UGxvdFNlbGVjdGlvbihwbG90SWQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcGxvdFNlbGVjdGlvbnNbcGxvdElkXTtcbiAgICB9XG5cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgYXdhaXQgaW5pdFBsb3RzRGF0YSgpO1xuICAgICAgICBHYW1lUmVjb3JkLmluaXRSZWNvcmRzKCk7XG4gICAgICAgIGN1c3RvbVBsb3RJZCA9IEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzLmN1c3RvbVBsb3RJZDtcbiAgICAgICAgaW5pdEN1c3RvbVBsb3RzKEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzLmN1c3RvbVBsb3RzKTtcblxuICAgICAgICBFZGl0b3JFdmVudHMuU1RBUlRfUExPVF9CUkFOQ0gub24oKHBhcmFtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBwbG90SWQgPSBwYXJzZUludChwYXJhbSk7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnROZXdQbG90QnJhbmNoKHBsb3RJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBjdXN0b20gcGxvdCBhbmQgcmV0dXJuIHBsb3QgaWRcbiAgICBleHBvcnQgZnVuY3Rpb24gYWRkQ3VzdG9tUGxvdChwbG90OiBQbG90KTogdm9pZCB7XG4gICAgICAgIHBsb3QuaWQgPSBjdXN0b21QbG90SWQtLTtcbiAgICAgICAgYWRkQ3VzdG9tUGxvdERhdGEocGxvdCk7XG4gICAgICAgIEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzLmN1c3RvbVBsb3RJZCA9IGN1c3RvbVBsb3RJZDtcbiAgICAgICAgR2FtZVJlY29yZC5nbG9iYWxWYXJpYWJsZXMuY3VzdG9tUGxvdHMgPSBnZXRDaGFwdGVyUGxvdHMoLTEwMCk7XG4gICAgICAgIEdhbWVSZWNvcmQuYXV0b1NhdmUoKTtcbiAgICB9XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gYWRkQ3VzdG9tUGxvdHMocGxvdHM6IFBsb3RbXSk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBwbG90IG9mIHBsb3RzKSB7XG4gICAgICAgICAgICBwbG90LmlkID0gY3VzdG9tUGxvdElkLS07XG4gICAgICAgICAgICBhZGRDdXN0b21QbG90RGF0YShwbG90KTtcbiAgICAgICAgfVxuICAgICAgICBHYW1lUmVjb3JkLmdsb2JhbFZhcmlhYmxlcy5jdXN0b21QbG90SWQgPSBjdXN0b21QbG90SWQ7XG4gICAgICAgIEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzLmN1c3RvbVBsb3RzID0gZ2V0Q2hhcHRlclBsb3RzKC0xMDApO1xuICAgICAgICBHYW1lUmVjb3JkLmF1dG9TYXZlKCk7XG4gICAgfVxuXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KHJlY29yZEluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGxldCBwbG90cyA9IEdhbWVSZWNvcmQuc3RhcnRHYW1lV2l0aFJlY29yZChyZWNvcmRJbmRleCk7XG4gICAgICAgIGN1cnJlbnRQbG90cyA9IGF3YWl0IFByb21pc2UuYWxsKHBsb3RzLm1hcCh2ID0+IGdldFBsb3QodikpKSBhcyBSZWFkb25seVBsb3RbXTtcblxuICAgICAgICBwbG90U2VsZWN0aW9ucyA9IHt9O1xuXG4gICAgICAgIGxldCBpdGVtcyA9IEdhbWVSZWNvcmQuZ2V0Q3VycmVudFJlY29yZEl0ZW1zKCk7XG5cbiAgICAgICAgZm9yIChsZXQgcCBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKHAucykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcC5wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnNbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxvdFNlbGVjdGlvbnNbcC5wW2ldXSA9IHAuc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOajgOafpeacquWujOW+hee7reWJp+aDhe+8jOWmguacieaWsOWJp+aDheS/ruaUueWtmOaho+aVsOaNrlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcGxvdElkID0gcGxvdHNbaV07XG4gICAgICAgICAgICBpZiAocGxvdElkID09PSBTcGVjaWFsUGxvdElkLlRvQmVDb250aW51ZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpdGVtcy5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc1tpbmRleF0ucFtpXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbG90SWQgPSBpdGVtc1tpbmRleF0ucFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwbG90SWQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWNvcmQgZXJyb3IuXCIpO1xuICAgICAgICAgICAgICAgIGxldCBwbG90ID0gKGF3YWl0IGdldFBsb3QocGxvdElkKSkhO1xuICAgICAgICAgICAgICAgIGxldCBzZWxzID0gaXRlbXNbaW5kZXhdLnM7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRQbG90ID0gKGF3YWl0IGdldE5leHRQbG90KHBsb3QsIHNlbHMgPyBzZWxzW2ldIDogdW5kZWZpbmVkKSkhO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0UGxvdC5pZCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpbmRleCArIDE7IGogPCBpdGVtcy5sZW5ndGg7IGorKykgeyAvLyDkv67mlLnlrZjmoaPmlbDmja5cbiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtc1tpbmRleF0ucCBhcyBudW1iZXJbXSlbaV0gPSBuZXh0UGxvdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50UGxvdHNbaV0gPSBuZXh0UGxvdCBhcyBSZWFkb25seVBsb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBQbG90U3RhcnRFdmVudC5lbWl0KGN1cnJlbnRQbG90cyk7XG4gICAgICAgIHJldHVybiBjdXJyZW50UGxvdHM7XG4gICAgfVxuXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TmV3UGxvdEJyYW5jaChwbG90SWQ6IG51bWJlcikge1xuICAgICAgICBsZXQgaW5kZXggPSBjdXJyZW50UGxvdHMuZmluZEluZGV4KHYgPT4gdiAmJiB2LmlkID09PSBwbG90SWQpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwic3RhcnROZXdQbG90QnJhbmNoOiBwbG90IGFscmVhZHkgZXhpc3QuXCIsIHBsb3RJZCk7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBsb3QgPSBhd2FpdCBnZXRQbG90KHBsb3RJZCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFBsb3RXaWxsU3RhcnQuZW1pdChwbG90LCBpbmRleCkpO1xuICAgICAgICBsZXQgaGlzdG9yeSA9IEdhbWVSZWNvcmQuZ2V0Q3VycmVudFJlY29yZEl0ZW1zKCk7XG4gICAgICAgIGluZGV4ID0gaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdLnAubGVuZ3RoO1xuICAgICAgICBsZXQgcGxvdHMgPSBHYW1lUmVjb3JkLnN0YXJ0UGxvdChwbG90SWQsIGluZGV4KTtcbiAgICAgICAgY3VycmVudFBsb3RzID0gYXdhaXQgUHJvbWlzZS5hbGwocGxvdHMubWFwKHYgPT4gZ2V0UGxvdCh2KSkpIGFzIFJlYWRvbmx5UGxvdFtdO1xuICAgICAgICBQbG90U3RhcnRFdmVudC5lbWl0KGN1cnJlbnRQbG90cyk7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dFBsb3QocGxvdDogUmVhZG9ubHlQbG90LCBzZWxlY3RPcHRpb24/OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGlkID0gZ2V0TmV4dFBsb3RJZChwbG90LCBzZWxlY3RPcHRpb24pO1xuICAgICAgICByZXR1cm4gZ2V0UGxvdChpZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0TmV4dFBsb3RJZChwbG90OiBSZWFkb25seVBsb3QsIHNlbGVjdE9wdGlvbj86IG51bWJlciB8IHN0cmluZywgc2F2ZVRvUmVjb3JkPzogYm9vbGVhbikge1xuICAgICAgICBsZXQgbmV4dFBsb3RJZDogbnVtYmVyO1xuICAgICAgICBpZiAoc2VsZWN0T3B0aW9uICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0T3B0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocGxvdC5qdW1wLnR5cGUgIT09IFBsb3RKdW1wVHlwZS5TZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbG90IGp1bXAgdHlwZSBlcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzZWxlY3RJbmRleDogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3RPcHRpb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsb3QuanVtcC5qdW1wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGxvdC5qdW1wLmp1bXBzW2ldLmlkID09IHNlbGVjdE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0SW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RJbmRleCA9IHNlbGVjdE9wdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxlY3RJbmRleCEgPj0gcGxvdC5qdW1wLmp1bXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb3B0aW9uXCIpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2F2ZVRvUmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgR2FtZVJlY29yZC5zZXRTZWxlY3RPcHRpb25Gb3JQbG90KHBsb3QuaWQsIHNlbGVjdEluZGV4ISk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0UGxvdElkID0gcGxvdC5qdW1wLmp1bXBzW3NlbGVjdEluZGV4IV0udG9QbG90O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsb3QuanVtcC50eXBlICE9PSBQbG90SnVtcFR5cGUuQ29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxvdCBqdW1wIHR5cGUgZXJyb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29uZGl0aW9ucyA9IHBsb3QuanVtcC5jb25kaXRpb25CcmFuY2hlcztcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29uZCBvZiBjb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZC5jb25kaXRpb24gJiYgZXZhbENvbmRpdGlvbkV4cHIoY29uZC5jb25kaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBsb3RJZCA9IGNvbmQudG9QbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHRQbG90SWQhID09PSB1bmRlZmluZWQpIG5leHRQbG90SWQgPSBwbG90Lmp1bXAudG9QbG90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0UGxvdElkO1xuICAgIH1cblxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wbGV0ZVBsb3QocGxvdDogUmVhZG9ubHlQbG90LCBzZWxlY3RPcHRpb24/OiBudW1iZXIgfCBzdHJpbmcsIGN1c3RvbURhdGE/OiBvYmplY3QpIHtcbiAgICAgICAgbGV0IHBsb3RJbmRleCA9IGN1cnJlbnRQbG90cy5maW5kSW5kZXgodiA9PiB2ICYmIHYuaWQgPT09IHBsb3QuaWQpO1xuICAgICAgICBpZiAocGxvdEluZGV4IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwbG90XCIpO1xuICAgICAgICBHYW1lUmVjb3JkLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICAgICAgaWYgKHNlbGVjdE9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChFZGl0b3JFdmVudHMuZW1pdHRlci5lbWl0KFwiU0VMRUNUX09QVElPTl9cIiArICgodHlwZW9mIHNlbGVjdE9wdGlvbiA9PT0gXCJudW1iZXJcIikgPyBzZWxlY3RPcHRpb24gKyAxIDogc2VsZWN0T3B0aW9uKSkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKEVkaXRvckV2ZW50cy5QTE9UX0VORC5lbWl0KHBsb3QuaWQudG9TdHJpbmcoKSkpO1xuICAgICAgICBBY3Rpb25NYW5hZ2VyLnN0b3AoKTtcbiAgICAgICAgbGV0IG5leHRQbG90SWQ6IG51bWJlciA9IGdldE5leHRQbG90SWQocGxvdCwgc2VsZWN0T3B0aW9uLCB0cnVlKTtcbiAgICAgICAgaWYgKGN1c3RvbURhdGEpIHtcbiAgICAgICAgICAgIEdhbWVSZWNvcmQuc2V0UGxvdEN1c3RvbURhdGEocGxvdEluZGV4LCBjdXN0b21EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFBsb3QgPSBhd2FpdCBnZXRQbG90KG5leHRQbG90SWQpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChQbG90V2lsbFN0YXJ0LmVtaXQobmV4dFBsb3QsIHBsb3RJbmRleCkpO1xuICAgICAgICBsZXQgcGxvdHMgPSBHYW1lUmVjb3JkLnN0YXJ0UGxvdChuZXh0UGxvdElkLCBwbG90SW5kZXgpO1xuICAgICAgICBHYW1lUmVjb3JkLmVuZFRyYW5zYWN0aW9uKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZWN0T3B0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBwbG90U2VsZWN0aW9uc1twbG90LmlkXSA9IHNlbGVjdE9wdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UGxvdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwbG90cy5tYXAodiA9PiBnZXRQbG90KHYpKSkgYXMgUmVhZG9ubHlQbG90W107XG4gICAgICAgIFBsb3RTdGFydEV2ZW50LmVtaXQoY3VycmVudFBsb3RzKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQbG90cztcbiAgICB9XG5cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcm9sbGJhY2tUb1Bsb3QocGxvdDogbnVtYmVyLCByZXZlcnNlRmluZCA9IGZhbHNlLCBwcmVzZXJ2ZVZhcnM/OiBzdHJpbmdbXSkge1xuICAgICAgICBHYW1lUmVjb3JkLnJvbGxiYWNrVG9QbG90KHBsb3QsIHJldmVyc2VGaW5kLCBwcmVzZXJ2ZVZhcnMpO1xuICAgICAgICByZXR1cm4gcm9sbGJhY2tGaW5pc2hlZCgpO1xuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiByb2xsYmFja1RvSW5kZXgoaW5kZXg6IG51bWJlciwgcHJlc2VydmVWYXJzPzogc3RyaW5nW10pIHtcbiAgICAgICAgR2FtZVJlY29yZC5yb2xsYmFja1RvSW5kZXgoaW5kZXgsIHByZXNlcnZlVmFycyk7XG4gICAgICAgIHJldHVybiByb2xsYmFja0ZpbmlzaGVkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcm9sbGJhY2tGaW5pc2hlZCgpIHtcbiAgICAgICAgbGV0IHJlY29yZEl0ZW1zID0gR2FtZVJlY29yZC5nZXRDdXJyZW50UmVjb3JkSXRlbXMoKTtcbiAgICAgICAgcGxvdFNlbGVjdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgcCBvZiByZWNvcmRJdGVtcykge1xuICAgICAgICAgICAgaWYgKHAucykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcC5wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnNbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxvdFNlbGVjdGlvbnNbcC5wW2ldXSA9IHAuc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGxvdHMgPSByZWNvcmRJdGVtc1tyZWNvcmRJdGVtcy5sZW5ndGggLSAxXS5wO1xuICAgICAgICBjdXJyZW50UGxvdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwbG90cy5tYXAodiA9PiBnZXRQbG90KHYpKSkgYXMgUmVhZG9ubHlQbG90W107XG4gICAgICAgIFBsb3RzUm9sbGJhY2tFdmVudC5lbWl0KGN1cnJlbnRQbG90cyk7XG4gICAgICAgIHJldHVybiBjdXJyZW50UGxvdHM7XG4gICAgfVxufSJdfQ==