Launcher.js
50.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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/script/game/Launcher.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, 'f191b3NyXtCubDaTGld/tHG', 'Launcher');
// script/game/Launcher.ts
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
const simba_sdk_1 = require("simba-sdk");
const AVG_1 = require("../avg/AVG");
const CCDummyObjects_1 = require("../common/CCDummyObjects");
const simba_cc_audio_manager_1 = require("simba-cc-audio-manager");
const UIManager_1 = require("../common/gameplay/managers/UIManager");
const AnimationUtils_1 = require("../common/utils/AnimationUtils");
const GameConfig_1 = require("../GameConfig");
const Enums_1 = require("./Enums");
const GameDotMgr_1 = require("./GameDotMgr");
const GameModelManager_1 = require("./model/GameModelManager");
const AlertDialogViewPresenter_1 = require("./ui/presenter/AlertDialogViewPresenter");
const MainViewPresenter_1 = require("./ui/presenter/MainViewPresenter");
const simba_cc_resutils_1 = require("simba-cc-resutils");
const CCGameCenterComponent_1 = require("../cooperation/script/CCGameCenterComponent");
const CCGameCenterNodeFactory_1 = require("../cooperation/script/CCGameCenterNodeFactory");
const CustomerServiceDataCenter_1 = require("../customerService/script/CustomerServiceDataCenter");
const EventCenter_1 = require("../cooperation/event/EventCenter");
const EventKit_1 = require("../cooperation/event/EventKit");
const UnlockSpecialPlotEventManager_1 = require("./model/UnlockSpecialPlotEventManager");
const BedRoomCatModelManager_1 = require("./model/BedRoomCatModelManager");
const simba_sdk_exchangecode_1 = require("simba-sdk-exchangecode");
const { ccclass, property } = cc._decorator;
let Launcher = /** @class */ (() => {
let Launcher = class Launcher extends cc.Component {
constructor() {
super(...arguments);
this.progressBar = CCDummyObjects_1.DummyProgressBar;
this.progressLabel = CCDummyObjects_1.DummyLabel;
this.uiRootNode = CCDummyObjects_1.DummyNode;
this.toastParentNode = CCDummyObjects_1.DummyNode;
this.loadingNode = CCDummyObjects_1.DummyNode;
this.loadingRoleNode = CCDummyObjects_1.DummyNode;
this.VerbRoot = CCDummyObjects_1.DummyNode;
this.isLoadGameCenter = false;
this.userIdLabel = CCDummyObjects_1.DummyLabel;
this.hotUpdateNode = CCDummyObjects_1.DummyNode;
this.bgSpr = CCDummyObjects_1.DummySprite;
this.loginCount = 0;
this._gameCenterViewNode = CCDummyObjects_1.DummyNode;
this._disposable = new EventKit_1.CompositeDisposable;
/**控制游戏列表是否展示 */
this.onShowGameCenterListView = (isShow) => {
if (!this._gameCenterViewNode) {
return;
}
this._gameCenterViewNode.active = isShow;
};
this.onGameStart = () => {
this.initializeGame();
};
this.lateInit = async () => {
let mainViewPromise = UIManager_1.UIManager.pushPresenter(MainViewPresenter_1.default, undefined);
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 0.6, 1, this.progressLabel);
if (CC_DEV) {
globalThis['PlotManager'] = AVG_1.PlotManager;
globalThis['GameRecord'] = AVG_1.GameRecord;
let ConfigManager = require('simba-config-manager');
globalThis['ConfigManager'] = ConfigManager;
}
await AVG_1.initAVG();
//解决清档
await this.dealEmptyRecord();
if (GameConfig_1.GameConfig.EMPTY_RECORD_WHEN_LOGIN) {
AVG_1.PlotManager.stop();
await AVG_1.GameRecord.emptyRecords();
}
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 0.8, 1, this.progressLabel);
await AVG_1.PlotManager.start(0, false);
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 0.9, 1, this.progressLabel);
await simba_sdk_exchangecode_1.initExchangeCode();
// init game data
await GameModelManager_1.GameModelManager.init((value) => {
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, value, 1, this.progressLabel);
});
GameDotMgr_1.default.getInstance().dotLoading(Enums_1.LoadingState.LoadingStart);
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 0.95, 1, this.progressLabel);
GameDotMgr_1.default.getInstance().dotLoading(Enums_1.LoadingState.LoadingEnd);
(await mainViewPromise).start();
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 1.0, 1, this.progressLabel);
// GameDotMgr.getInstance().dotLoading(LoadingState.EnterLobby);
this.loadingNode.active = false;
//检查是否解锁手表次留番外
UnlockSpecialPlotEventManager_1.default.getInstance().nextDayUnlockedSpecialPlot(4);
//进入游戏首先判断是否为第二天并改变相关功能状态
BedRoomCatModelManager_1.BedRoomCatModelManager.checkIsNextDay();
};
this.loginGame = async () => {
return new Promise(async (resolve, reject) => {
this.loginCount++;
try {
let ret = await simba_sdk_1.SDK.login();
if (ret) {
this.userIdLabel.string = ret.playerId;
await this.lateInit();
resolve();
}
}
catch (error) {
if (this.loginCount > 3) {
this.showLoginFailed();
reject(new Error("登录失败"));
}
else if (error == "timeout") {
this.loginGame();
}
}
});
};
}
async onLoad() {
this.screenAdapter();
if (cc.sys.isNative) {
this._disposable.add(EventCenter_1.EventCenter.GameStart.on(this.onGameStart));
let hotNode = await simba_cc_resutils_1.ResUtils.createWithPrefab('prefab/HotUpdate');
hotNode.parent = this.hotUpdateNode;
}
this.scheduleOnce(() => {
this.preloadView();
this.preloadDir();
});
//关闭fps展示
cc.debug.setDisplayStats(GameConfig_1.GameConfig.showFPS);
/**关闭多点触摸 特效层将不能使用 */
cc.macro.ENABLE_MULTI_TOUCH = false;
this.fixScreenSize();
this.scheduleOnce(async () => {
try {
let node = await simba_cc_resutils_1.ResUtils.createWithPrefab('prefab/ui/VerbView');
node.parent = this.VerbRoot;
}
catch (error) {
console.error(error);
}
if (!this.isLoadGameCenter)
return;
//加载矩阵导量UI
try {
this._disposable.add(EventCenter_1.EventCenter.SHOW_GAME_CENTER_LIST_VIEW.on(this.onShowGameCenterListView));
let gameCenterMomentItem = await simba_cc_resutils_1.ResUtils.loadRes('prefab/cooperation/GameCenterMomentItem', cc.Prefab);
CCGameCenterNodeFactory_1.default.getInstance().registerMomentPrefab(gameCenterMomentItem);
let gameCenterBtn = await simba_cc_resutils_1.ResUtils.loadRes('prefab/cooperation/GameCenterBtn', cc.Prefab);
let gameCenterView = await simba_cc_resutils_1.ResUtils.loadRes('prefab/cooperation/GameCenterView', cc.Prefab);
let cooperationItem = await simba_cc_resutils_1.ResUtils.loadRes('prefab/cooperation/CooperationItem', cc.Prefab);
let cCGameCenterComponent = this.node.addComponent(CCGameCenterComponent_1.default);
cCGameCenterComponent.gameCenterBtnPrefab = gameCenterBtn;
cCGameCenterComponent.gameCenterViewPrefab = gameCenterView;
cCGameCenterComponent.gameCenterItemPrefab = cooperationItem;
cCGameCenterComponent.gameCenterMomentPrefab = gameCenterMomentItem;
cCGameCenterComponent.gameCenterParentNode = this.node;
cCGameCenterComponent.appID = "wx7a067b995e670485";
cCGameCenterComponent.gameID = "yybs";
cCGameCenterComponent.gameChannel = "wechat";
cCGameCenterComponent.isRelease = !GameConfig_1.GameConfig.debug;
cCGameCenterComponent.init();
}
catch (error) {
console.error(error);
}
});
CustomerServiceDataCenter_1.default.getInstance().init();
simba_cc_resutils_1.ResUtils.loadRes("audio/bgm/bayinhe", cc.AudioClip);
simba_cc_resutils_1.ResUtils.loadRes("audio/bgm/wanshengj", cc.AudioClip);
}
/**创建prefab对应的节点 */
createNode(gameCenterViewPrefab) {
if (!gameCenterViewPrefab) {
cc.error("gameCenterViewPrefab is not set , please check it over");
}
else {
this._gameCenterViewNode = cc.instantiate(gameCenterViewPrefab);
}
let parentNode = cc.director.getScene();
this._gameCenterViewNode.parent = parentNode;
this._gameCenterViewNode.position = cc.v3(cc.winSize.width / 2, cc.winSize.height / 2, 0);
}
fixScreenSize() {
// let comp = this.loadingRoleNode.getComponent(PortraitFixComponent);
// if (comp) {
// comp.fixScreenSize(false);
// }
let sf = this.bgSpr.spriteFrame;
this.node.getComponent(cc.Widget).updateAlignment();
let sizeSF = sf.getOriginalSize();
let nodeSize = cc.size(this.node.width, this.node.height);
let scaleTemp = 1;
let scaleX = nodeSize.width / sizeSF.width;
let scaleY = nodeSize.height / sizeSF.height;
scaleTemp = Math.max(scaleX, scaleY);
this.bgSpr.node.scale = scaleTemp;
}
preloadView() {
// let viewList: string[] = [
// 'prefab/ui/MainView',
// 'prefab/ui/MessageView',
// 'prefab/ui/message/MessageEntryItem',
// 'prefab/ui/BedroomView',
// 'prefab/ui/discover/SettingView'
// ]
let viewList = [
'prefab/ui/MainView',
'prefab/ui/MessageView',
'prefab/ui/message/MessageEntryItem'
];
cc.resources.preload(viewList, (error, items) => {
});
}
preloadDir() {
cc.resources.preloadDir('plots'); //剧情数据
cc.resources.preloadDir('userdata/language'); //语言配置
cc.resources.preloadDir('config'); //剧情配置
// cc.resources.preloadDir('textures/items');
}
screenAdapter() {
let winSize = cc.winSize;
if (winSize.width / winSize.height > 720 / 1280) {
let canvas = this.node.getComponent(cc.Canvas);
canvas.fitWidth = true;
canvas.fitHeight = true;
}
}
start() {
if (!cc.sys.isNative)
this.initializeGame();
}
async initializeGame() {
simba_cc_audio_manager_1.AudioManager.init("audio/bgm/", "audio/effect/", "audio/voice/");
while (true) {
try {
await UIManager_1.UIManager.init(this.uiRootNode, this.toastParentNode);
break;
}
catch (e) {
console.error(e);
}
}
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 0.2);
let ret = false;
let tryCount = 0;
while (!ret && tryCount < 3) {
tryCount++;
ret = await simba_sdk_1.SDK.init();
// initExchangeCode();
}
if (!ret) {
UIManager_1.UIManager.showToast("SDK init failed. sdk初始化失败");
return;
}
AnimationUtils_1.AnimationUtils.animateProgress(this.progressBar, 0.4, 1, this.progressLabel);
await this.loginGame();
}
showLoginFailed() {
let temp = {
dataptr: {},
titlecontent: "网络错误",
content: "是否重新连接?",
ishasad: false,
istwobtn: true,
adconfig: "",
hasBanner: false,
callback: (type, ret) => {
if (ret) {
this.loginCount = 0;
this.loginGame();
}
else {
cc.director.end();
}
}
};
UIManager_1.UIManager.pushPresenter(AlertDialogViewPresenter_1.default, temp);
}
async dealEmptyRecord() {
/**此次执行清档操作的版本号 */
let optionV = "1.0.2";
/**需要清档的玩家注册版本号列表 */
let needEmptyRegVersionArr = ["1.0.0", "1.0.1"];
let emptyVersionRecordKey = "empty_record_versions";
let needEmpty = this.checkIsNeedEmptyRecord(optionV, emptyVersionRecordKey, needEmptyRegVersionArr);
console.log("是否需要清档操作:", needEmpty);
if (needEmpty) {
await AVG_1.GameRecord.emptyRecords();
AVG_1.GameRecord.globalVariables[emptyVersionRecordKey] = optionV;
AVG_1.GameRecord.saveRecord();
}
}
checkIsNeedEmptyRecord(optionV, emptyVersionRecordKey, needEmptyRegVersionArr) {
let empty = false;
let regV = AVG_1.GameRecord.globalVariables["register_version"];
//不存在或者当前注册版本不在需要清档的版本内容中,则直接返回不需要清档
if (!regV || needEmptyRegVersionArr.findIndex((v) => v == regV) === (-1)) {
return false;
}
let emptyRecordVersionString = AVG_1.GameRecord.globalVariables[emptyVersionRecordKey];
if (!emptyRecordVersionString || "" === emptyRecordVersionString.trim()) {
return true;
}
empty = emptyRecordVersionString != optionV;
return empty;
}
};
__decorate([
property({ type: cc.ProgressBar, displayName: "进度条" })
], Launcher.prototype, "progressBar", void 0);
__decorate([
property({ type: cc.Label, displayName: "进度展示文本" })
], Launcher.prototype, "progressLabel", void 0);
__decorate([
property({ type: cc.Node, displayName: "UI根结点" })
], Launcher.prototype, "uiRootNode", void 0);
__decorate([
property({ type: cc.Node, displayName: "场景最上层弱提示根结点" })
], Launcher.prototype, "toastParentNode", void 0);
__decorate([
property({ type: cc.Node, displayName: "加载界面节点" })
], Launcher.prototype, "loadingNode", void 0);
__decorate([
property({ type: cc.Node, displayName: "加载界面人物图" })
], Launcher.prototype, "loadingRoleNode", void 0);
__decorate([
property({ type: cc.Node })
], Launcher.prototype, "VerbRoot", void 0);
__decorate([
property({ tooltip: "是否加载导量UI" })
], Launcher.prototype, "isLoadGameCenter", void 0);
__decorate([
property({ type: cc.Label, displayName: "玩家ID文本" })
], Launcher.prototype, "userIdLabel", void 0);
__decorate([
property({ type: cc.Node, displayName: "热更节点" })
], Launcher.prototype, "hotUpdateNode", void 0);
__decorate([
property(cc.Sprite)
], Launcher.prototype, "bgSpr", void 0);
Launcher = __decorate([
ccclass
], Launcher);
return Launcher;
})();
exports.default = Launcher;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZ2FtZS9MYXVuY2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFnQztBQUNoQyxvQ0FBOEQ7QUFDOUQsNkRBQWdHO0FBQ2hHLG1FQUFzRDtBQUN0RCxxRUFBa0U7QUFDbEUsbUVBQWdFO0FBQ2hFLDhDQUEyQztBQUMzQyxtQ0FBdUM7QUFDdkMsNkNBQXNDO0FBQ3RDLCtEQUE0RDtBQUM1RCxzRkFBK0U7QUFDL0Usd0VBQWlFO0FBR2pFLHlEQUE2QztBQUM3Qyx1RkFBZ0Y7QUFDaEYsMkZBQW9GO0FBQ3BGLG1HQUE0RjtBQUM1RixrRUFBK0Q7QUFDL0QsNERBQW9FO0FBQ3BFLHlGQUFrRjtBQUdsRiwyRUFBd0U7QUFDeEUsbUVBQTBEO0FBRTFELE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztBQUk1QztJQUFBLElBQXFCLFFBQVEsR0FBN0IsTUFBcUIsUUFBUyxTQUFRLEVBQUUsQ0FBQyxTQUFTO1FBQWxEOztZQUdJLGdCQUFXLEdBQW1CLGlDQUFnQixDQUFDO1lBRy9DLGtCQUFhLEdBQWEsMkJBQVUsQ0FBQztZQUdyQyxlQUFVLEdBQVksMEJBQVMsQ0FBQztZQUdoQyxvQkFBZSxHQUFZLDBCQUFTLENBQUM7WUFHckMsZ0JBQVcsR0FBWSwwQkFBUyxDQUFDO1lBR2pDLG9CQUFlLEdBQVksMEJBQVMsQ0FBQztZQUdyQyxhQUFRLEdBQVksMEJBQVMsQ0FBQztZQUc5QixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7WUFHbEMsZ0JBQVcsR0FBYSwyQkFBVSxDQUFDO1lBR25DLGtCQUFhLEdBQVksMEJBQVMsQ0FBQztZQUduQyxVQUFLLEdBQWMsNEJBQVcsQ0FBQztZQUUvQixlQUFVLEdBQVcsQ0FBQyxDQUFDO1lBQ2Ysd0JBQW1CLEdBQVksMEJBQVMsQ0FBQztZQUN6QyxnQkFBVyxHQUF3QixJQUFJLDhCQUFtQixDQUFDO1lBbUVuRSxnQkFBZ0I7WUFDaEIsNkJBQXdCLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtvQkFDM0IsT0FBTztpQkFDVjtnQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUM3QyxDQUFDLENBQUE7WUF1REQsZ0JBQVcsR0FBRyxHQUFHLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQTtZQTZCRCxhQUFRLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQ2xCLElBQUksZUFBZSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLDJCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RSwrQkFBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLE1BQU0sRUFBRTtvQkFDUixVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsaUJBQVcsQ0FBQztvQkFDeEMsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLGdCQUFVLENBQUM7b0JBQ3RDLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO29CQUNuRCxVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDO2lCQUMvQztnQkFDRCxNQUFNLGFBQU8sRUFBRSxDQUFDO2dCQUNoQixNQUFNO2dCQUNOLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM3QixJQUFJLHVCQUFVLENBQUMsdUJBQXVCLEVBQUU7b0JBQ3BDLGlCQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ25CLE1BQU0sZ0JBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDbkM7Z0JBQ0QsK0JBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxpQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLCtCQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzdFLE1BQU0seUNBQWdCLEVBQUUsQ0FBQztnQkFDekIsaUJBQWlCO2dCQUNqQixNQUFNLG1DQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFO29CQUMxQywrQkFBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRixDQUFDLENBQUMsQ0FBQztnQkFDSCxvQkFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvRCwrQkFBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5RSxvQkFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLE1BQU0sZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLCtCQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzdFLGdFQUFnRTtnQkFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxjQUFjO2dCQUNkLHVDQUE2QixDQUFDLFdBQVcsRUFBRSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSx5QkFBeUI7Z0JBQ3pCLCtDQUFzQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVDLENBQUMsQ0FBQTtZQUVELGNBQVMsR0FBRyxLQUFLLElBQUksRUFBRTtnQkFDbkIsT0FBTyxJQUFJLE9BQU8sQ0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUMvQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2xCLElBQUk7d0JBQ0EsSUFBSSxHQUFHLEdBQUcsTUFBTSxlQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzVCLElBQUksR0FBRyxFQUFFOzRCQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7NEJBQ3ZDLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUN0QixPQUFPLEVBQUUsQ0FBQzt5QkFDYjtxQkFDSjtvQkFBQyxPQUFPLEtBQUssRUFBRTt3QkFDWixJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFOzRCQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7NEJBQ3ZCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3lCQUM3Qjs2QkFBTSxJQUFJLEtBQUssSUFBSSxTQUFTLEVBQUU7NEJBQzNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt5QkFDcEI7cUJBQ0o7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUE7UUFzREwsQ0FBQztRQTNRRyxLQUFLLENBQUMsTUFBTTtZQUNSLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyx5QkFBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLElBQUksT0FBTyxHQUFHLE1BQU0sNEJBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDdkM7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxTQUFTO1lBQ1QsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsdUJBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxxQkFBcUI7WUFDckIsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLElBQUk7b0JBQ0EsSUFBSSxJQUFJLEdBQUcsTUFBTSw0QkFBUSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDL0I7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7b0JBQUUsT0FBTztnQkFDbkMsVUFBVTtnQkFDVixJQUFJO29CQUNBLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLHlCQUFXLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7b0JBQy9GLElBQUksb0JBQW9CLEdBQUcsTUFBTSw0QkFBUSxDQUFDLE9BQU8sQ0FBQyx5Q0FBeUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hHLGlDQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ2pGLElBQUksYUFBYSxHQUFHLE1BQU0sNEJBQVEsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxRixJQUFJLGNBQWMsR0FBRyxNQUFNLDRCQUFRLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDNUYsSUFBSSxlQUFlLEdBQUcsTUFBTSw0QkFBUSxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzlGLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsK0JBQXFCLENBQUMsQ0FBQztvQkFDMUUscUJBQXFCLENBQUMsbUJBQW1CLEdBQUcsYUFBYSxDQUFDO29CQUMxRCxxQkFBcUIsQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLENBQUM7b0JBQzVELHFCQUFxQixDQUFDLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztvQkFDN0QscUJBQXFCLENBQUMsc0JBQXNCLEdBQUcsb0JBQW9CLENBQUM7b0JBQ3BFLHFCQUFxQixDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ3ZELHFCQUFxQixDQUFDLEtBQUssR0FBRyxvQkFBb0IsQ0FBQztvQkFDbkQscUJBQXFCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDdEMscUJBQXFCLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztvQkFDN0MscUJBQXFCLENBQUMsU0FBUyxHQUFHLENBQUMsdUJBQVUsQ0FBQyxLQUFLLENBQUM7b0JBRXBELHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNoQztnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN4QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsbUNBQXlCLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsNEJBQVEsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELDRCQUFRLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLFVBQVUsQ0FBQyxvQkFBK0I7WUFDdEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUN2QixFQUFFLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7YUFDdEU7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUNuRTtZQUNELElBQUksVUFBVSxHQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7WUFDN0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQVFELGFBQWE7WUFDVCxzRUFBc0U7WUFDdEUsY0FBYztZQUNkLGlDQUFpQztZQUNqQyxJQUFJO1lBQ0osSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3BELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNsQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUMzQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDN0MsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUVELFdBQVc7WUFDUCw2QkFBNkI7WUFDN0IsNEJBQTRCO1lBQzVCLCtCQUErQjtZQUMvQiw0Q0FBNEM7WUFDNUMsK0JBQStCO1lBQy9CLHVDQUF1QztZQUN2QyxJQUFJO1lBQ0osSUFBSSxRQUFRLEdBQWE7Z0JBQ3JCLG9CQUFvQjtnQkFDcEIsdUJBQXVCO2dCQUN2QixvQ0FBb0M7YUFDdkMsQ0FBQTtZQUNELEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQVksRUFBRSxLQUFZLEVBQUUsRUFBRTtZQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxVQUFVO1lBQ04sRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxNQUFNO1lBQ3ZDLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQSxNQUFNO1lBQ25ELEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUEsTUFBTTtZQUN4Qyw2Q0FBNkM7UUFDakQsQ0FBQztRQUVELGFBQWE7WUFDVCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3pCLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUU7Z0JBQzdDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1FBQ0wsQ0FBQztRQUVELEtBQUs7WUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRO2dCQUNoQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQU1ELEtBQUssQ0FBQyxjQUFjO1lBQ2hCLHFDQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDakUsT0FBTyxJQUFJLEVBQUU7Z0JBQ1QsSUFBSTtvQkFDQSxNQUFNLHFCQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWdCLENBQUMsQ0FBQztvQkFDOUQsTUFBTTtpQkFDVDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwQjthQUNKO1lBRUQsK0JBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2RCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7WUFDaEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtnQkFDekIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsR0FBRyxHQUFHLE1BQU0sZUFBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2QixzQkFBc0I7YUFDekI7WUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNOLHFCQUFTLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBQ2pELE9BQU87YUFDVjtZQUNELCtCQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0UsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQTRERCxlQUFlO1lBQ1gsSUFBSSxJQUFJLEdBQ1I7Z0JBQ0ksT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixPQUFPLEVBQUUsS0FBSztnQkFDZCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxRQUFRLEVBQUUsRUFBRTtnQkFDWixTQUFTLEVBQUUsS0FBSztnQkFDaEIsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUNwQixJQUFJLEdBQUcsRUFBRTt3QkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3FCQUNwQjt5QkFBTTt3QkFDSCxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO3FCQUNyQjtnQkFDTCxDQUFDO2FBQ0osQ0FBQztZQUNGLHFCQUFTLENBQUMsYUFBYSxDQUFDLGtDQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxLQUFLLENBQUMsZUFBZTtZQUNqQixrQkFBa0I7WUFDbEIsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLG9CQUFvQjtZQUNwQixJQUFJLHNCQUFzQixHQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFELElBQUkscUJBQXFCLEdBQUcsdUJBQXVCLENBQUM7WUFDcEQsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQzdHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksU0FBUyxFQUFFO2dCQUNYLE1BQU0sZ0JBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDaEMsZ0JBQVUsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQzVELGdCQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDM0I7UUFDTCxDQUFDO1FBRUQsc0JBQXNCLENBQUMsT0FBZSxFQUFFLHFCQUE2QixFQUFFLHNCQUFnQztZQUNuRyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxJQUFJLEdBQUcsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQVcsQ0FBQztZQUNwRSxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLElBQUksSUFBSSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RFLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSx3QkFBd0IsR0FBVyxnQkFBVSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBVyxDQUFDO1lBQ25HLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLEtBQUssd0JBQXdCLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3JFLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxLQUFLLEdBQUcsd0JBQXdCLElBQUksT0FBTyxDQUFDO1lBQzVDLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7S0FDSixDQUFBO0lBL1NHO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO2lEQUNSO0lBRy9DO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO21EQUNmO0lBR3JDO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dEQUNsQjtJQUdoQztRQURDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQztxREFDbkI7SUFHckM7UUFEQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUM7aURBQ2xCO0lBR2pDO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO3FEQUNmO0lBR3JDO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs4Q0FDRTtJQUc5QjtRQURDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztzREFDQTtJQUdsQztRQURDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQztpREFDakI7SUFHbkM7UUFEQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7bURBQ2Q7SUFHbkM7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQzsyQ0FDVztJQWpDZCxRQUFRO1FBRDVCLE9BQU87T0FDYSxRQUFRLENBa1Q1QjtJQUFELGVBQUM7S0FBQTtrQkFsVG9CLFFBQVEiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTREsgfSBmcm9tIFwic2ltYmEtc2RrXCI7XG5pbXBvcnQgeyBHYW1lUmVjb3JkLCBpbml0QVZHLCBQbG90TWFuYWdlciB9IGZyb20gXCIuLi9hdmcvQVZHXCI7XG5pbXBvcnQgeyBEdW1teUxhYmVsLCBEdW1teU5vZGUsIER1bW15UHJvZ3Jlc3NCYXIsIER1bW15U3ByaXRlIH0gZnJvbSBcIi4uL2NvbW1vbi9DQ0R1bW15T2JqZWN0c1wiO1xuaW1wb3J0IHsgQXVkaW9NYW5hZ2VyIH0gZnJvbSBcInNpbWJhLWNjLWF1ZGlvLW1hbmFnZXJcIjtcbmltcG9ydCB7IFVJTWFuYWdlciB9IGZyb20gXCIuLi9jb21tb24vZ2FtZXBsYXkvbWFuYWdlcnMvVUlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBBbmltYXRpb25VdGlscyB9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvQW5pbWF0aW9uVXRpbHNcIjtcbmltcG9ydCB7IEdhbWVDb25maWcgfSBmcm9tIFwiLi4vR2FtZUNvbmZpZ1wiO1xuaW1wb3J0IHsgTG9hZGluZ1N0YXRlIH0gZnJvbSBcIi4vRW51bXNcIjtcbmltcG9ydCBHYW1lRG90TWdyIGZyb20gXCIuL0dhbWVEb3RNZ3JcIjtcbmltcG9ydCB7IEdhbWVNb2RlbE1hbmFnZXIgfSBmcm9tIFwiLi9tb2RlbC9HYW1lTW9kZWxNYW5hZ2VyXCI7XG5pbXBvcnQgQWxlcnREaWFsb2dWaWV3UHJlc2VudGVyIGZyb20gXCIuL3VpL3ByZXNlbnRlci9BbGVydERpYWxvZ1ZpZXdQcmVzZW50ZXJcIjtcbmltcG9ydCBNYWluVmlld1ByZXNlbnRlciBmcm9tIFwiLi91aS9wcmVzZW50ZXIvTWFpblZpZXdQcmVzZW50ZXJcIjtcbmltcG9ydCB7IEFsZXJ0RGlhbG9nVmlld1Byb3BzIH0gZnJvbSBcIi4vdWkvdmlldy90eXBlL0FsZXJ0RGlhbG9nVmlld1wiO1xuaW1wb3J0IFBvcnRyYWl0Rml4Q29tcG9uZW50IGZyb20gXCIuLi9jb21tb24vY29tcG9uZW50cy9Qb3J0cmFpdEZpeENvbXBvbmVudFwiO1xuaW1wb3J0IHsgUmVzVXRpbHMgfSBmcm9tIFwic2ltYmEtY2MtcmVzdXRpbHNcIjtcbmltcG9ydCBDQ0dhbWVDZW50ZXJDb21wb25lbnQgZnJvbSBcIi4uL2Nvb3BlcmF0aW9uL3NjcmlwdC9DQ0dhbWVDZW50ZXJDb21wb25lbnRcIjtcbmltcG9ydCBDQ0dhbWVDZW50ZXJOb2RlRmFjdG9yeSBmcm9tIFwiLi4vY29vcGVyYXRpb24vc2NyaXB0L0NDR2FtZUNlbnRlck5vZGVGYWN0b3J5XCI7XG5pbXBvcnQgQ3VzdG9tZXJTZXJ2aWNlRGF0YUNlbnRlciBmcm9tIFwiLi4vY3VzdG9tZXJTZXJ2aWNlL3NjcmlwdC9DdXN0b21lclNlcnZpY2VEYXRhQ2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuLi9jb29wZXJhdGlvbi9ldmVudC9FdmVudENlbnRlclwiO1xuaW1wb3J0IHsgQ29tcG9zaXRlRGlzcG9zYWJsZSB9IGZyb20gXCIuLi9jb29wZXJhdGlvbi9ldmVudC9FdmVudEtpdFwiO1xuaW1wb3J0IFVubG9ja1NwZWNpYWxQbG90RXZlbnRNYW5hZ2VyIGZyb20gXCIuL21vZGVsL1VubG9ja1NwZWNpYWxQbG90RXZlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgeyBVbmxvY2tJdGVtTW9kZWxNYW5hZ2VyIH0gZnJvbSBcIi4vbW9kZWwvVW5sb2NrSXRlbU1vZGVsTWFuYWdlclwiO1xuaW1wb3J0IHsgVW5sb2NrU3BlY2lhbFBsb3RNb2RlbE1hbmFnZXIgfSBmcm9tIFwiLi9tb2RlbC9VbmxvY2tTcGVjaWFsUGxvdE1vZGVsTWFuYWdlclwiO1xuaW1wb3J0IHsgQmVkUm9vbUNhdE1vZGVsTWFuYWdlciB9IGZyb20gXCIuL21vZGVsL0JlZFJvb21DYXRNb2RlbE1hbmFnZXJcIjtcbmltcG9ydCB7IGluaXRFeGNoYW5nZUNvZGUgfSBmcm9tIFwic2ltYmEtc2RrLWV4Y2hhbmdlY29kZVwiO1xuXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBjYy5fZGVjb3JhdG9yO1xuXG5cbkBjY2NsYXNzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYXVuY2hlciBleHRlbmRzIGNjLkNvbXBvbmVudCB7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBjYy5Qcm9ncmVzc0JhciwgZGlzcGxheU5hbWU6IFwi6L+b5bqm5p2hXCIgfSlcbiAgICBwcm9ncmVzc0JhcjogY2MuUHJvZ3Jlc3NCYXIgPSBEdW1teVByb2dyZXNzQmFyO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogY2MuTGFiZWwsIGRpc3BsYXlOYW1lOiBcIui/m+W6puWxleekuuaWh+acrFwiIH0pXG4gICAgcHJvZ3Jlc3NMYWJlbDogY2MuTGFiZWwgPSBEdW1teUxhYmVsO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogY2MuTm9kZSwgZGlzcGxheU5hbWU6IFwiVUnmoLnnu5PngrlcIiB9KVxuICAgIHVpUm9vdE5vZGU6IGNjLk5vZGUgPSBEdW1teU5vZGU7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBjYy5Ob2RlLCBkaXNwbGF5TmFtZTogXCLlnLrmma/mnIDkuIrlsYLlvLHmj5DnpLrmoLnnu5PngrlcIiB9KVxuICAgIHRvYXN0UGFyZW50Tm9kZTogY2MuTm9kZSA9IER1bW15Tm9kZTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IGNjLk5vZGUsIGRpc3BsYXlOYW1lOiBcIuWKoOi9veeVjOmdouiKgueCuVwiIH0pXG4gICAgbG9hZGluZ05vZGU6IGNjLk5vZGUgPSBEdW1teU5vZGU7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBjYy5Ob2RlLCBkaXNwbGF5TmFtZTogXCLliqDovb3nlYzpnaLkurrnianlm75cIiB9KVxuICAgIGxvYWRpbmdSb2xlTm9kZTogY2MuTm9kZSA9IER1bW15Tm9kZTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IGNjLk5vZGUgfSlcbiAgICBWZXJiUm9vdDogY2MuTm9kZSA9IER1bW15Tm9kZTtcblxuICAgIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi5piv5ZCm5Yqg6L295a+86YePVUlcIiB9KVxuICAgIGlzTG9hZEdhbWVDZW50ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IGNjLkxhYmVsLCBkaXNwbGF5TmFtZTogXCLnjqnlrrZJROaWh+acrFwiIH0pXG4gICAgdXNlcklkTGFiZWw6IGNjLkxhYmVsID0gRHVtbXlMYWJlbDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IGNjLk5vZGUsIGRpc3BsYXlOYW1lOiBcIueDreabtOiKgueCuVwiIH0pXG4gICAgaG90VXBkYXRlTm9kZTogY2MuTm9kZSA9IER1bW15Tm9kZTtcblxuICAgIEBwcm9wZXJ0eShjYy5TcHJpdGUpXG4gICAgYmdTcHI6IGNjLlNwcml0ZSA9IER1bW15U3ByaXRlO1xuXG4gICAgbG9naW5Db3VudDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9nYW1lQ2VudGVyVmlld05vZGU6IGNjLk5vZGUgPSBEdW1teU5vZGU7XG4gICAgcHJpdmF0ZSBfZGlzcG9zYWJsZTogQ29tcG9zaXRlRGlzcG9zYWJsZSA9IG5ldyBDb21wb3NpdGVEaXNwb3NhYmxlO1xuXG4gICAgYXN5bmMgb25Mb2FkKCkge1xuICAgICAgICB0aGlzLnNjcmVlbkFkYXB0ZXIoKTtcbiAgICAgICAgaWYgKGNjLnN5cy5pc05hdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzcG9zYWJsZS5hZGQoRXZlbnRDZW50ZXIuR2FtZVN0YXJ0Lm9uKHRoaXMub25HYW1lU3RhcnQpKTtcbiAgICAgICAgICAgIGxldCBob3ROb2RlID0gYXdhaXQgUmVzVXRpbHMuY3JlYXRlV2l0aFByZWZhYigncHJlZmFiL0hvdFVwZGF0ZScpO1xuICAgICAgICAgICAgaG90Tm9kZS5wYXJlbnQgPSB0aGlzLmhvdFVwZGF0ZU5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlT25jZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByZWxvYWRWaWV3KCk7XG4gICAgICAgICAgICB0aGlzLnByZWxvYWREaXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8v5YWz6ZetZnBz5bGV56S6XG4gICAgICAgIGNjLmRlYnVnLnNldERpc3BsYXlTdGF0cyhHYW1lQ29uZmlnLnNob3dGUFMpO1xuICAgICAgICAvKirlhbPpl63lpJrngrnop6bmkbgg54m55pWI5bGC5bCG5LiN6IO95L2/55SoICovXG4gICAgICAgIGNjLm1hY3JvLkVOQUJMRV9NVUxUSV9UT1VDSCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpeFNjcmVlblNpemUoKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU9uY2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGF3YWl0IFJlc1V0aWxzLmNyZWF0ZVdpdGhQcmVmYWIoJ3ByZWZhYi91aS9WZXJiVmlldycpO1xuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gdGhpcy5WZXJiUm9vdDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMb2FkR2FtZUNlbnRlcikgcmV0dXJuO1xuICAgICAgICAgICAgLy/liqDovb3nn6npmLXlr7zph49VSVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NhYmxlLmFkZChFdmVudENlbnRlci5TSE9XX0dBTUVfQ0VOVEVSX0xJU1RfVklFVy5vbih0aGlzLm9uU2hvd0dhbWVDZW50ZXJMaXN0VmlldykpO1xuICAgICAgICAgICAgICAgIGxldCBnYW1lQ2VudGVyTW9tZW50SXRlbSA9IGF3YWl0IFJlc1V0aWxzLmxvYWRSZXMoJ3ByZWZhYi9jb29wZXJhdGlvbi9HYW1lQ2VudGVyTW9tZW50SXRlbScsIGNjLlByZWZhYik7XG4gICAgICAgICAgICAgICAgQ0NHYW1lQ2VudGVyTm9kZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3Rlck1vbWVudFByZWZhYihnYW1lQ2VudGVyTW9tZW50SXRlbSk7XG4gICAgICAgICAgICAgICAgbGV0IGdhbWVDZW50ZXJCdG4gPSBhd2FpdCBSZXNVdGlscy5sb2FkUmVzKCdwcmVmYWIvY29vcGVyYXRpb24vR2FtZUNlbnRlckJ0bicsIGNjLlByZWZhYik7XG4gICAgICAgICAgICAgICAgbGV0IGdhbWVDZW50ZXJWaWV3ID0gYXdhaXQgUmVzVXRpbHMubG9hZFJlcygncHJlZmFiL2Nvb3BlcmF0aW9uL0dhbWVDZW50ZXJWaWV3JywgY2MuUHJlZmFiKTtcbiAgICAgICAgICAgICAgICBsZXQgY29vcGVyYXRpb25JdGVtID0gYXdhaXQgUmVzVXRpbHMubG9hZFJlcygncHJlZmFiL2Nvb3BlcmF0aW9uL0Nvb3BlcmF0aW9uSXRlbScsIGNjLlByZWZhYik7XG4gICAgICAgICAgICAgICAgbGV0IGNDR2FtZUNlbnRlckNvbXBvbmVudCA9IHRoaXMubm9kZS5hZGRDb21wb25lbnQoQ0NHYW1lQ2VudGVyQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBjQ0dhbWVDZW50ZXJDb21wb25lbnQuZ2FtZUNlbnRlckJ0blByZWZhYiA9IGdhbWVDZW50ZXJCdG47XG4gICAgICAgICAgICAgICAgY0NHYW1lQ2VudGVyQ29tcG9uZW50LmdhbWVDZW50ZXJWaWV3UHJlZmFiID0gZ2FtZUNlbnRlclZpZXc7XG4gICAgICAgICAgICAgICAgY0NHYW1lQ2VudGVyQ29tcG9uZW50LmdhbWVDZW50ZXJJdGVtUHJlZmFiID0gY29vcGVyYXRpb25JdGVtO1xuICAgICAgICAgICAgICAgIGNDR2FtZUNlbnRlckNvbXBvbmVudC5nYW1lQ2VudGVyTW9tZW50UHJlZmFiID0gZ2FtZUNlbnRlck1vbWVudEl0ZW07XG4gICAgICAgICAgICAgICAgY0NHYW1lQ2VudGVyQ29tcG9uZW50LmdhbWVDZW50ZXJQYXJlbnROb2RlID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgIGNDR2FtZUNlbnRlckNvbXBvbmVudC5hcHBJRCA9IFwid3g3YTA2N2I5OTVlNjcwNDg1XCI7XG4gICAgICAgICAgICAgICAgY0NHYW1lQ2VudGVyQ29tcG9uZW50LmdhbWVJRCA9IFwieXlic1wiO1xuICAgICAgICAgICAgICAgIGNDR2FtZUNlbnRlckNvbXBvbmVudC5nYW1lQ2hhbm5lbCA9IFwid2VjaGF0XCI7XG4gICAgICAgICAgICAgICAgY0NHYW1lQ2VudGVyQ29tcG9uZW50LmlzUmVsZWFzZSA9ICFHYW1lQ29uZmlnLmRlYnVnO1xuXG4gICAgICAgICAgICAgICAgY0NHYW1lQ2VudGVyQ29tcG9uZW50LmluaXQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBDdXN0b21lclNlcnZpY2VEYXRhQ2VudGVyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xuICAgICAgICBSZXNVdGlscy5sb2FkUmVzKFwiYXVkaW8vYmdtL2JheWluaGVcIiwgY2MuQXVkaW9DbGlwKTtcbiAgICAgICAgUmVzVXRpbHMubG9hZFJlcyhcImF1ZGlvL2JnbS93YW5zaGVuZ2pcIiwgY2MuQXVkaW9DbGlwKTtcbiAgICB9XG5cbiAgICAvKirliJvlu7pwcmVmYWLlr7nlupTnmoToioLngrkgKi9cbiAgICBjcmVhdGVOb2RlKGdhbWVDZW50ZXJWaWV3UHJlZmFiOiBjYy5QcmVmYWIpIHtcbiAgICAgICAgaWYgKCFnYW1lQ2VudGVyVmlld1ByZWZhYikge1xuICAgICAgICAgICAgY2MuZXJyb3IoXCJnYW1lQ2VudGVyVmlld1ByZWZhYiBpcyBub3Qgc2V0ICwgcGxlYXNlIGNoZWNrIGl0IG92ZXJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9nYW1lQ2VudGVyVmlld05vZGUgPSBjYy5pbnN0YW50aWF0ZShnYW1lQ2VudGVyVmlld1ByZWZhYik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcmVudE5vZGU6IGNjLk5vZGUgPSBjYy5kaXJlY3Rvci5nZXRTY2VuZSgpO1xuICAgICAgICB0aGlzLl9nYW1lQ2VudGVyVmlld05vZGUucGFyZW50ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy5fZ2FtZUNlbnRlclZpZXdOb2RlLnBvc2l0aW9uID0gY2MudjMoY2Mud2luU2l6ZS53aWR0aCAvIDIsIGNjLndpblNpemUuaGVpZ2h0IC8gMiwgMCk7XG4gICAgfVxuICAgIC8qKuaOp+WItua4uOaIj+WIl+ihqOaYr+WQpuWxleekuiAqL1xuICAgIG9uU2hvd0dhbWVDZW50ZXJMaXN0VmlldyA9IChpc1Nob3c6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9nYW1lQ2VudGVyVmlld05vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9nYW1lQ2VudGVyVmlld05vZGUuYWN0aXZlID0gaXNTaG93O1xuICAgIH1cbiAgICBmaXhTY3JlZW5TaXplKCkge1xuICAgICAgICAvLyBsZXQgY29tcCA9IHRoaXMubG9hZGluZ1JvbGVOb2RlLmdldENvbXBvbmVudChQb3J0cmFpdEZpeENvbXBvbmVudCk7XG4gICAgICAgIC8vIGlmIChjb21wKSB7XG4gICAgICAgIC8vICAgICBjb21wLmZpeFNjcmVlblNpemUoZmFsc2UpO1xuICAgICAgICAvLyB9XG4gICAgICAgIGxldCBzZiA9IHRoaXMuYmdTcHIuc3ByaXRlRnJhbWU7XG4gICAgICAgIHRoaXMubm9kZS5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KS51cGRhdGVBbGlnbm1lbnQoKTtcbiAgICAgICAgbGV0IHNpemVTRiA9IHNmLmdldE9yaWdpbmFsU2l6ZSgpO1xuICAgICAgICBsZXQgbm9kZVNpemUgPSBjYy5zaXplKHRoaXMubm9kZS53aWR0aCwgdGhpcy5ub2RlLmhlaWdodCk7XG4gICAgICAgIGxldCBzY2FsZVRlbXAgPSAxO1xuICAgICAgICBsZXQgc2NhbGVYID0gbm9kZVNpemUud2lkdGggLyBzaXplU0Yud2lkdGg7XG4gICAgICAgIGxldCBzY2FsZVkgPSBub2RlU2l6ZS5oZWlnaHQgLyBzaXplU0YuaGVpZ2h0O1xuICAgICAgICBzY2FsZVRlbXAgPSBNYXRoLm1heChzY2FsZVgsIHNjYWxlWSk7XG4gICAgICAgIHRoaXMuYmdTcHIubm9kZS5zY2FsZSA9IHNjYWxlVGVtcDtcbiAgICB9XG5cbiAgICBwcmVsb2FkVmlldygpIHtcbiAgICAgICAgLy8gbGV0IHZpZXdMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLy8gICAgICdwcmVmYWIvdWkvTWFpblZpZXcnLFxuICAgICAgICAvLyAgICAgJ3ByZWZhYi91aS9NZXNzYWdlVmlldycsXG4gICAgICAgIC8vICAgICAncHJlZmFiL3VpL21lc3NhZ2UvTWVzc2FnZUVudHJ5SXRlbScsXG4gICAgICAgIC8vICAgICAncHJlZmFiL3VpL0JlZHJvb21WaWV3JyxcbiAgICAgICAgLy8gICAgICdwcmVmYWIvdWkvZGlzY292ZXIvU2V0dGluZ1ZpZXcnXG4gICAgICAgIC8vIF1cbiAgICAgICAgbGV0IHZpZXdMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdwcmVmYWIvdWkvTWFpblZpZXcnLFxuICAgICAgICAgICAgJ3ByZWZhYi91aS9NZXNzYWdlVmlldycsXG4gICAgICAgICAgICAncHJlZmFiL3VpL21lc3NhZ2UvTWVzc2FnZUVudHJ5SXRlbSdcbiAgICAgICAgXVxuICAgICAgICBjYy5yZXNvdXJjZXMucHJlbG9hZCh2aWV3TGlzdCwgKGVycm9yOiBFcnJvciwgaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByZWxvYWREaXIoKSB7XG4gICAgICAgIGNjLnJlc291cmNlcy5wcmVsb2FkRGlyKCdwbG90cycpOy8v5Ymn5oOF5pWw5o2uXG4gICAgICAgIGNjLnJlc291cmNlcy5wcmVsb2FkRGlyKCd1c2VyZGF0YS9sYW5ndWFnZScpOy8v6K+t6KiA6YWN572uXG4gICAgICAgIGNjLnJlc291cmNlcy5wcmVsb2FkRGlyKCdjb25maWcnKTsvL+WJp+aDhemFjee9rlxuICAgICAgICAvLyBjYy5yZXNvdXJjZXMucHJlbG9hZERpcigndGV4dHVyZXMvaXRlbXMnKTtcbiAgICB9XG5cbiAgICBzY3JlZW5BZGFwdGVyKCkge1xuICAgICAgICBsZXQgd2luU2l6ZSA9IGNjLndpblNpemU7XG4gICAgICAgIGlmICh3aW5TaXplLndpZHRoIC8gd2luU2l6ZS5oZWlnaHQgPiA3MjAgLyAxMjgwKSB7XG4gICAgICAgICAgICBsZXQgY2FudmFzID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChjYy5DYW52YXMpO1xuICAgICAgICAgICAgY2FudmFzLmZpdFdpZHRoID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbnZhcy5maXRIZWlnaHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghY2Muc3lzLmlzTmF0aXZlKVxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplR2FtZSgpO1xuICAgIH1cblxuICAgIG9uR2FtZVN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVHYW1lKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZUdhbWUoKSB7XG4gICAgICAgIEF1ZGlvTWFuYWdlci5pbml0KFwiYXVkaW8vYmdtL1wiLCBcImF1ZGlvL2VmZmVjdC9cIiwgXCJhdWRpby92b2ljZS9cIik7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFVJTWFuYWdlci5pbml0KHRoaXMudWlSb290Tm9kZSEsIHRoaXMudG9hc3RQYXJlbnROb2RlISk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEFuaW1hdGlvblV0aWxzLmFuaW1hdGVQcm9ncmVzcyh0aGlzLnByb2dyZXNzQmFyISwgMC4yKTtcbiAgICAgICAgbGV0IHJldCA9IGZhbHNlO1xuICAgICAgICBsZXQgdHJ5Q291bnQgPSAwO1xuICAgICAgICB3aGlsZSAoIXJldCAmJiB0cnlDb3VudCA8IDMpIHtcbiAgICAgICAgICAgIHRyeUNvdW50Kys7XG4gICAgICAgICAgICByZXQgPSBhd2FpdCBTREsuaW5pdCgpO1xuICAgICAgICAgICAgLy8gaW5pdEV4Y2hhbmdlQ29kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmV0KSB7XG4gICAgICAgICAgICBVSU1hbmFnZXIuc2hvd1RvYXN0KFwiU0RLIGluaXQgZmFpbGVkLiBzZGvliJ3lp4vljJblpLHotKVcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQW5pbWF0aW9uVXRpbHMuYW5pbWF0ZVByb2dyZXNzKHRoaXMucHJvZ3Jlc3NCYXIsIDAuNCwgMSwgdGhpcy5wcm9ncmVzc0xhYmVsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbkdhbWUoKTtcbiAgICB9XG5cbiAgICBsYXRlSW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1haW5WaWV3UHJvbWlzZSA9IFVJTWFuYWdlci5wdXNoUHJlc2VudGVyKE1haW5WaWV3UHJlc2VudGVyLCB1bmRlZmluZWQpO1xuICAgICAgICBBbmltYXRpb25VdGlscy5hbmltYXRlUHJvZ3Jlc3ModGhpcy5wcm9ncmVzc0JhciwgMC42LCAxLCB0aGlzLnByb2dyZXNzTGFiZWwpO1xuICAgICAgICBpZiAoQ0NfREVWKSB7XG4gICAgICAgICAgICBnbG9iYWxUaGlzWydQbG90TWFuYWdlciddID0gUGxvdE1hbmFnZXI7XG4gICAgICAgICAgICBnbG9iYWxUaGlzWydHYW1lUmVjb3JkJ10gPSBHYW1lUmVjb3JkO1xuICAgICAgICAgICAgbGV0IENvbmZpZ01hbmFnZXIgPSByZXF1aXJlKCdzaW1iYS1jb25maWctbWFuYWdlcicpXG4gICAgICAgICAgICBnbG9iYWxUaGlzWydDb25maWdNYW5hZ2VyJ10gPSBDb25maWdNYW5hZ2VyO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGluaXRBVkcoKTtcbiAgICAgICAgLy/op6PlhrPmuIXmoaNcbiAgICAgICAgYXdhaXQgdGhpcy5kZWFsRW1wdHlSZWNvcmQoKTtcbiAgICAgICAgaWYgKEdhbWVDb25maWcuRU1QVFlfUkVDT1JEX1dIRU5fTE9HSU4pIHtcbiAgICAgICAgICAgIFBsb3RNYW5hZ2VyLnN0b3AoKTtcbiAgICAgICAgICAgIGF3YWl0IEdhbWVSZWNvcmQuZW1wdHlSZWNvcmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgQW5pbWF0aW9uVXRpbHMuYW5pbWF0ZVByb2dyZXNzKHRoaXMucHJvZ3Jlc3NCYXIsIDAuOCwgMSwgdGhpcy5wcm9ncmVzc0xhYmVsKTtcbiAgICAgICAgYXdhaXQgUGxvdE1hbmFnZXIuc3RhcnQoMCwgZmFsc2UpO1xuICAgICAgICBBbmltYXRpb25VdGlscy5hbmltYXRlUHJvZ3Jlc3ModGhpcy5wcm9ncmVzc0JhciwgMC45LCAxLCB0aGlzLnByb2dyZXNzTGFiZWwpO1xuICAgICAgICBhd2FpdCBpbml0RXhjaGFuZ2VDb2RlKCk7XG4gICAgICAgIC8vIGluaXQgZ2FtZSBkYXRhXG4gICAgICAgIGF3YWl0IEdhbWVNb2RlbE1hbmFnZXIuaW5pdCgodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgQW5pbWF0aW9uVXRpbHMuYW5pbWF0ZVByb2dyZXNzKHRoaXMucHJvZ3Jlc3NCYXIsIHZhbHVlLCAxLCB0aGlzLnByb2dyZXNzTGFiZWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgR2FtZURvdE1nci5nZXRJbnN0YW5jZSgpLmRvdExvYWRpbmcoTG9hZGluZ1N0YXRlLkxvYWRpbmdTdGFydCk7XG4gICAgICAgIEFuaW1hdGlvblV0aWxzLmFuaW1hdGVQcm9ncmVzcyh0aGlzLnByb2dyZXNzQmFyLCAwLjk1LCAxLCB0aGlzLnByb2dyZXNzTGFiZWwpO1xuICAgICAgICBHYW1lRG90TWdyLmdldEluc3RhbmNlKCkuZG90TG9hZGluZyhMb2FkaW5nU3RhdGUuTG9hZGluZ0VuZCk7XG4gICAgICAgIChhd2FpdCBtYWluVmlld1Byb21pc2UpLnN0YXJ0KCk7XG4gICAgICAgIEFuaW1hdGlvblV0aWxzLmFuaW1hdGVQcm9ncmVzcyh0aGlzLnByb2dyZXNzQmFyLCAxLjAsIDEsIHRoaXMucHJvZ3Jlc3NMYWJlbCk7XG4gICAgICAgIC8vIEdhbWVEb3RNZ3IuZ2V0SW5zdGFuY2UoKS5kb3RMb2FkaW5nKExvYWRpbmdTdGF0ZS5FbnRlckxvYmJ5KTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgLy/mo4Dmn6XmmK/lkKbop6PplIHmiYvooajmrKHnlZnnlarlpJZcbiAgICAgICAgVW5sb2NrU3BlY2lhbFBsb3RFdmVudE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5uZXh0RGF5VW5sb2NrZWRTcGVjaWFsUGxvdCg0KTtcbiAgICAgICAgLy/ov5vlhaXmuLjmiI/pppblhYjliKTmlq3mmK/lkKbkuLrnrKzkuozlpKnlubbmlLnlj5jnm7jlhbPlip/og73nirbmgIFcbiAgICAgICAgQmVkUm9vbUNhdE1vZGVsTWFuYWdlci5jaGVja0lzTmV4dERheSgpO1xuICAgIH1cblxuICAgIGxvZ2luR2FtZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9naW5Db3VudCsrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgU0RLLmxvZ2luKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZExhYmVsLnN0cmluZyA9IHJldC5wbGF5ZXJJZDtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sYXRlSW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dpbkNvdW50ID4gMykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dMb2dpbkZhaWxlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwi55m75b2V5aSx6LSlXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yID09IFwidGltZW91dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5HYW1lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93TG9naW5GYWlsZWQoKSB7XG4gICAgICAgIGxldCB0ZW1wOiBBbGVydERpYWxvZ1ZpZXdQcm9wcyA9XG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFwdHI6IHt9LFxuICAgICAgICAgICAgdGl0bGVjb250ZW50OiBcIue9kee7nOmUmeivr1wiLFxuICAgICAgICAgICAgY29udGVudDogXCLmmK/lkKbph43mlrDov57mjqU/XCIsXG4gICAgICAgICAgICBpc2hhc2FkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzdHdvYnRuOiB0cnVlLFxuICAgICAgICAgICAgYWRjb25maWc6IFwiXCIsXG4gICAgICAgICAgICBoYXNCYW5uZXI6IGZhbHNlLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICh0eXBlLCByZXQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5Db3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5HYW1lKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2MuZGlyZWN0b3IuZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBVSU1hbmFnZXIucHVzaFByZXNlbnRlcihBbGVydERpYWxvZ1ZpZXdQcmVzZW50ZXIsIHRlbXApO1xuICAgIH1cblxuICAgIGFzeW5jIGRlYWxFbXB0eVJlY29yZCgpIHtcbiAgICAgICAgLyoq5q2k5qyh5omn6KGM5riF5qGj5pON5L2c55qE54mI5pys5Y+3ICovXG4gICAgICAgIGxldCBvcHRpb25WID0gXCIxLjAuMlwiO1xuICAgICAgICAvKirpnIDopoHmuIXmoaPnmoTnjqnlrrbms6jlhozniYjmnKzlj7fliJfooaggKi9cbiAgICAgICAgbGV0IG5lZWRFbXB0eVJlZ1ZlcnNpb25BcnI6IHN0cmluZ1tdID0gW1wiMS4wLjBcIiwgXCIxLjAuMVwiXTtcbiAgICAgICAgbGV0IGVtcHR5VmVyc2lvblJlY29yZEtleSA9IFwiZW1wdHlfcmVjb3JkX3ZlcnNpb25zXCI7XG4gICAgICAgIGxldCBuZWVkRW1wdHk6IGJvb2xlYW4gPSB0aGlzLmNoZWNrSXNOZWVkRW1wdHlSZWNvcmQob3B0aW9uViwgZW1wdHlWZXJzaW9uUmVjb3JkS2V5LCBuZWVkRW1wdHlSZWdWZXJzaW9uQXJyKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLmmK/lkKbpnIDopoHmuIXmoaPmk43kvZzvvJpcIiwgbmVlZEVtcHR5KTtcbiAgICAgICAgaWYgKG5lZWRFbXB0eSkge1xuICAgICAgICAgICAgYXdhaXQgR2FtZVJlY29yZC5lbXB0eVJlY29yZHMoKTtcbiAgICAgICAgICAgIEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzW2VtcHR5VmVyc2lvblJlY29yZEtleV0gPSBvcHRpb25WO1xuICAgICAgICAgICAgR2FtZVJlY29yZC5zYXZlUmVjb3JkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0lzTmVlZEVtcHR5UmVjb3JkKG9wdGlvblY6IHN0cmluZywgZW1wdHlWZXJzaW9uUmVjb3JkS2V5OiBzdHJpbmcsIG5lZWRFbXB0eVJlZ1ZlcnNpb25BcnI6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBlbXB0eSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVnViA9IEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzW1wicmVnaXN0ZXJfdmVyc2lvblwiXSBhcyBzdHJpbmc7XG4gICAgICAgIC8v5LiN5a2Y5Zyo5oiW6ICF5b2T5YmN5rOo5YaM54mI5pys5LiN5Zyo6ZyA6KaB5riF5qGj55qE54mI5pys5YaF5a655Lit77yM5YiZ55u05o6l6L+U5Zue5LiN6ZyA6KaB5riF5qGjXG4gICAgICAgIGlmICghcmVnViB8fCBuZWVkRW1wdHlSZWdWZXJzaW9uQXJyLmZpbmRJbmRleCgodikgPT4gdiA9PSByZWdWKSA9PT0gKC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVtcHR5UmVjb3JkVmVyc2lvblN0cmluZzogc3RyaW5nID0gR2FtZVJlY29yZC5nbG9iYWxWYXJpYWJsZXNbZW1wdHlWZXJzaW9uUmVjb3JkS2V5XSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghZW1wdHlSZWNvcmRWZXJzaW9uU3RyaW5nIHx8IFwiXCIgPT09IGVtcHR5UmVjb3JkVmVyc2lvblN0cmluZy50cmltKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVtcHR5ID0gZW1wdHlSZWNvcmRWZXJzaW9uU3RyaW5nICE9IG9wdGlvblY7XG4gICAgICAgIHJldHVybiBlbXB0eTtcbiAgICB9XG59Il19