Sanakey
2021-04-30 8724a444c8a1d09dc8f9efd005e8443aad8df1ab
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
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
var app = getApp();
Page({
    data: {
        currentStep: 0,
        type: "0",
        steps: [
            {
                text: "① 基本信息",
                inactiveIcon: "location-o",
                activeIcon: "success",
            },
            {
                text: "② 直播间配置",
                inactiveIcon: "like-o",
                activeIcon: "plus",
            },
        ],
        timeErrorMsg: {
            start: "请选择计划直播开始时间",
            end: "请选择计划直播结束时间",
            tips: "开播时间和结束时间间隔不得短于30分钟",
        },
        screenTypeOptions: [
            { text: "竖屏", value: 0 },
            { text: "横屏", value: 1 },
        ],
        screenType: 0,
        isFeedsPublic: false,
        isShowInHomepage: false,
        isLike: true,
        isComment: true,
        isGoods: true,
        isShare: true,
        isReplay: true,
        isKf: false,
        showQrCode: false,
        qrCodeTempUrl: '',
        anchorName: '',
        roomTitle: '',
        anchorWechat: '',
        subAnchorWechat: '',
        shareImg: '',
        feedsImg: '',
        coverImg: '',
        bannerPhoto: '',
        doccode: '',
        qrCodeUrl: "",
        minStartDate: new Date().getTime() + 1000 * 60 * 20,
        maxStartDate: new Date().getTime() + 1000 * 60 * 60 * 24 * 180,
        startDate: 0,
        startTime: '',
        minEndDate: new Date().getTime() + 1000 * 60 * 40,
        maxEndDate: new Date().getTime() + 1000 * 60 * 60 * 24 * 180,
        endDate: 0,
        endTime: '',
        formatter: function (type, value) {
            if (type === "year") {
                return value + "\u5E74";
            }
            else if (type === "month") {
                return value + "\u6708";
            }
            else if (type === "day") {
                return value + "\u65E5";
            }
            return value;
        },
    },
    onChangeType: function (event) {
        this.setData({
            type: event.detail,
        });
    },
    onClickType: function (event) {
        var name = event.currentTarget.dataset.name;
        this.setData({
            type: name,
        });
    },
    onInputStartDate: function () { },
    onEnterStartDate: function (e) {
        var startTime = wx.$utils.formatTime(e.detail);
        if (this.data.endDate &&
            Math.abs(e.detail - this.data.endDate) > 1000 * 60 * 60 * 24) {
            var date = e.detail + 1000 * 60 * 60 * 24;
            var time = wx.$utils.formatTime(date);
            this.setData({
                endDate: date,
                endTime: time,
            });
        }
        if (this.data.endDate &&
            Math.abs(e.detail - this.data.endDate) < 1000 * 60 * 30) {
            var date = e.detail + 1000 * 60 * 30;
            var time = wx.$utils.formatTime(date);
            this.setData({
                endDate: date,
                endTime: time,
            });
        }
        console.log("选择开播时间", startTime);
        this.setData({
            startDate: e.detail,
            startTime: startTime,
            maxEndDate: e.detail + 1000 * 60 * 60 * 24,
            minEndDate: e.detail + 1000 * 60 * 30,
        });
        this.handleLiveTime();
        this.onCancelStartDate();
    },
    onCancelStartDate: function () {
        this.selectComponent("#start-time").toggle();
        this.checkTime("startTime", "请选择计划直播开始时间");
    },
    onInputEndDate: function () { },
    onEnterEndDate: function (e) {
        var endTime = wx.$utils.formatTime(e.detail);
        console.log("选择下播时间", endTime);
        this.setData({
            endDate: e.detail,
            endTime: endTime,
        });
        this.onCancelEndDate();
    },
    onCancelEndDate: function () {
        this.selectComponent("#end-time").toggle();
        this.checkTime("endTime", "请选择计划直播结束时间");
    },
    handleLiveTime: function () {
        console.log("iii");
        var startDate = this.data.startDate;
        var startTime = this.data.startTime;
        var endDate = this.data.endDate;
        var endTime = this.data.endTime;
        if (!startTime || !endTime)
            return;
        if (startDate - endDate > 0) {
            this.setData({
                startDate: endDate,
                startTime: endTime,
                endDate: startDate,
                endTime: startTime,
            });
        }
    },
    checkTime: function (time, msg) {
        var _a, _b;
        if (this.data[time] == '') {
            this.setData((_a = {},
                _a[time + "Error"] = msg,
                _a));
            return false;
        }
        this.setData((_b = {},
            _b[time + "Error"] = "",
            _b));
        return true;
    },
    onChangeFeeds: function (_a) {
        var detail = _a.detail;
        this.setData({ isFeedsPublic: detail });
    },
    onChangeShowHomepage: function (_a) {
        var detail = _a.detail;
        this.setData({ isShowInHomepage: detail });
    },
    checkAnchorName: function (event) {
        var value = event.detail.value;
        console.log(value);
        this.setData({
            anchorName: value,
        });
        this.checkInput("anchorName");
    },
    checkRoomTitle: function (event) {
        var value = event.detail.value;
        this.setData({
            roomTitle: value,
        });
        this.checkInput("roomTitle");
    },
    checkAnchorWechat: function (event) {
        var value = event.detail.value;
        this.setData({
            anchorWechat: value,
        });
        this.checkInput("anchorWechat");
    },
    checkSubAnchorWechat: function (event) {
        var value = event.detail.value;
        this.setData({
            subAnchorWechat: value,
        });
        if (value.length > 0) {
            this.checkInput("subAnchorWechat");
        }
        else {
            this.setData({
                subAnchorWechatError: ""
            });
        }
    },
    checkInput: function (type) {
        var _a, _b;
        var options = {
            anchorName: {
                error: "主播昵称必须为2-15个字",
                regExp: /^.{2,15}$/,
            },
            roomTitle: {
                error: "直播标题必须为3-17个字",
                regExp: /^.{3,17}$/,
            },
            anchorWechat: {
                error: "微信号不合规",
                regExp: /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/,
            },
            subAnchorWechat: {
                error: "微信号不合规",
                regExp: /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/,
            },
        };
        var value = this.data[type] || "";
        console.log(value, options[type].regExp.test(value));
        if (!options[type].regExp.test(value)) {
            this.setData((_a = {},
                _a[type + "Error"] = options[type].error,
                _a));
            return false;
        }
        else {
            this.setData((_b = {},
                _b[type + "Error"] = "",
                _b));
            return true;
        }
    },
    onClickNextStep: function () {
        return __awaiter(this, void 0, void 0, function () {
            var arr, doccode, type, startTime, endTime, anchorName, roomTitle, anchorWechat, subAnchorWechat, screenType, isFeedsPublic, isShowBannerPhotoOnHomePage, data, _a, err, res;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        arr = [];
                        doccode = this.data.doccode || '';
                        type = this.data.type;
                        startTime = this.data.startTime;
                        endTime = this.data.endTime;
                        anchorName = this.data.anchorName;
                        roomTitle = this.data.roomTitle;
                        anchorWechat = this.data.anchorWechat;
                        subAnchorWechat = this.data.subAnchorWechat || '';
                        screenType = this.data.screenType;
                        isFeedsPublic = this.data.isFeedsPublic;
                        isShowBannerPhotoOnHomePage = this.data.isShowInHomepage;
                        arr.push(this.checkTime("startTime", "请选择计划直播开始时间"));
                        arr.push(this.checkTime("endTime", "请选择计划直播结束时间"));
                        arr.push(this.checkInput("anchorName"));
                        arr.push(this.checkInput("roomTitle"));
                        arr.push(this.checkInput("anchorWechat"));
                        if (subAnchorWechat.length > 0) {
                            arr.push(this.checkInput("subAnchorWechat"));
                        }
                        if (arr.includes(false)) {
                            console.log("不能下一步");
                            return [2];
                        }
                        data = {
                            type: type,
                            startTime: startTime,
                            endTime: endTime,
                            anchorName: anchorName,
                            name: roomTitle,
                            anchorWechat: anchorWechat,
                            subAnchorWechat: subAnchorWechat,
                            screenType: screenType,
                            isFeedsPublic: isFeedsPublic,
                            doccode: doccode,
                            isShowBannerPhotoOnHomePage: isShowBannerPhotoOnHomePage
                        };
                        console.log("第一步表单数据", data);
                        return [4, wx.$utils.to(wx.$http.request({
                                url: "/shopping/live/saveRoomStep1.do",
                                data: data,
                            }))];
                    case 1:
                        _a = _b.sent(), err = _a[0], res = _a[1];
                        if (err) {
                            return [2];
                        }
                        console.log("新建房间--第一步", res);
                        this.setData({
                            currentStep: 1,
                            doccode: res.doccode,
                            logoUrl: app.globalData.logoUrl,
                            shopName: app.globalData.shopName
                        });
                        return [2];
                }
            });
        });
    },
    uploadImg: function (imgType) {
        var _this = this;
        wx.chooseImage({
            count: 1,
            sizeType: ["original", "compressed"],
            sourceType: ["album", "camera"],
            success: function (res) { return __awaiter(_this, void 0, void 0, function () {
                var _a, imgList, files, fieldid, doccode, _b, err, result;
                return __generator(this, function (_c) {
                    switch (_c.label) {
                        case 0:
                            imgList = res.tempFilePaths;
                            files = res.tempFiles;
                            fieldid = imgType;
                            doccode = this.data.doccode;
                            console.log(imgList, files, fieldid, doccode);
                            return [4, wx.$utils.to(wx.$http.uploadFile({
                                    url: "/shopping/live/saveRoomAttachment.do?doccode=" + doccode + "&fieldid=" + fieldid,
                                    formData: {
                                        file: files[0],
                                    },
                                    filePath: imgList[0]
                                }))];
                        case 1:
                            _b = _c.sent(), err = _b[0], result = _b[1];
                            if (err) {
                                console.log(err);
                                return [2];
                            }
                            console.log(result);
                            this.setData((_a = {},
                                _a[imgType] = result.url,
                                _a[imgType + "Error"] = "",
                                _a));
                            return [2];
                    }
                });
            }); },
        });
    },
    uploadShareImg: function () {
        this.uploadImg("shareImg");
    },
    uploadFeedsImg: function () {
        this.uploadImg("feedsImg");
    },
    uploadCoverImg: function () {
        this.uploadImg("coverImg");
    },
    uploadBannerPhoto: function () {
        this.uploadImg("bannerPhoto");
    },
    onClickLastStep: function () {
        this.setData({
            currentStep: 0,
        });
    },
    onChangeLike: function (_a) {
        var detail = _a.detail;
        this.setData({ isLike: detail });
    },
    onChangeComment: function (_a) {
        var detail = _a.detail;
        this.setData({ isComment: detail });
    },
    onChangeGoods: function (_a) {
        var detail = _a.detail;
        this.setData({ isGoods: detail });
    },
    onChangeShare: function (_a) {
        var detail = _a.detail;
        this.setData({ isShare: detail });
    },
    onChangeReplay: function (_a) {
        var detail = _a.detail;
        this.setData({ isReplay: detail });
    },
    showErrorMsg: function (imgType, errMsg) {
        var _a;
        wx.showToast({
            title: errMsg,
            icon: "none",
            duration: 2000,
        });
        this.setData((_a = {},
            _a[imgType + "Error"] = errMsg,
            _a));
    },
    isImgUpload: function () {
        if (!this.data.shareImg) {
            var errMsg = "请上传分享卡片封面图片";
            this.showErrorMsg('shareImg', errMsg);
            return false;
        }
        if (!this.data.feedsImg) {
            var errMsg = "请上传直播卡片封面";
            this.showErrorMsg('feedsImg', errMsg);
            return false;
        }
        if (!this.data.coverImg) {
            var errMsg = "请上传直播间背景墙";
            this.showErrorMsg('coverImg', errMsg);
            return false;
        }
        return true;
    },
    onClickSubmit: function () {
        return __awaiter(this, void 0, void 0, function () {
            var data, _a, err, res;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        data = {
                            doccode: this.data.doccode,
                            closeLike: !this.data.isLike,
                            closeGoods: !this.data.isGoods,
                            closeComment: !this.data.isComment,
                            closeReplay: !this.data.isReplay,
                            closeShare: !this.data.isShare,
                            closeKf: true,
                        };
                        console.log("第二步设置数据", data);
                        if (!this.isImgUpload()) {
                            return [2];
                        }
                        return [4, wx.$utils.to(wx.$http.request({
                                url: "/shopping/live/saveRoomStep2.do",
                                data: data,
                            }))];
                    case 1:
                        _a = _b.sent(), err = _a[0], res = _a[1];
                        if (err) {
                            return [2];
                        }
                        console.log("新建房间--第二步", res);
                        if (!res.QrCodeUrlUnid) return [3, 3];
                        wx.showLoading({
                            title: ''
                        });
                        return [4, this.downloadQr(res.QrCodeUrlUnid)];
                    case 2:
                        _b.sent();
                        wx.hideLoading();
                        this.setData({
                            showQrCode: true,
                            qrCodeUrl: res.QrCodeUrlUnid
                        });
                        return [3, 4];
                    case 3:
                        wx.showToast({
                            title: '直播间创建成功',
                            icon: "none",
                            duration: 2000,
                        });
                        setTimeout(function () {
                            wx.navigateBack();
                        }, 2000);
                        _b.label = 4;
                    case 4: return [2];
                }
            });
        });
    },
    isAuthorizeSave: function () {
        return __awaiter(this, void 0, void 0, function () {
            var _a, err, res;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4, wx.$utils.to(wx.pro.getSetting())];
                    case 1:
                        _a = _b.sent(), err = _a[0], res = _a[1];
                        if (err) {
                            return [2, false];
                        }
                        console.log("getSetting", res);
                        return [2, res.authSetting["scope.writePhotosAlbum"] !== false];
                }
            });
        });
    },
    downloadQr: function (qrCodeUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var _a, err, res;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4, wx.$utils.to(wx.pro.downloadFile({
                            url: qrCodeUrl,
                        }))];
                    case 1:
                        _a = _b.sent(), err = _a[0], res = _a[1];
                        if (err) {
                            console.log("downloadQr", err);
                            return [2];
                        }
                        console.log("----downloadQr", res);
                        if (res.statusCode === 200) {
                            console.log('......头像', res.tempFilePath);
                            this.setData({
                                qrCodeTempUrl: res.tempFilePath
                            });
                        }
                        else {
                            wx.showToast({
                                title: '二维码下载失败,请重试',
                                icon: "none",
                                duration: 3000,
                            });
                        }
                        return [2];
                }
            });
        });
    },
    saveQrImg: function () {
        return __awaiter(this, void 0, void 0, function () {
            var isAuthorizeSave;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        wx.showLoading({
                            title: "保存中...",
                        });
                        return [4, this.isAuthorizeSave()];
                    case 1:
                        isAuthorizeSave = _a.sent();
                        if (!isAuthorizeSave) {
                            wx.hideLoading();
                            wx.showModal({
                                title: "提示",
                                content: "您还未授权保存到相册,请在接下来打开的设置页面开启相册授权!",
                                success: function (res) {
                                    if (res.confirm) {
                                        console.log("用户点击确定");
                                        wx.openSetting({
                                            success: function (res) {
                                                console.log(res.authSetting);
                                            },
                                        });
                                    }
                                    else if (res.cancel) {
                                        console.log("用户点击取消");
                                    }
                                },
                            });
                            return [2];
                        }
                        wx.saveImageToPhotosAlbum({
                            filePath: this.data.qrCodeTempUrl,
                            success: function () {
                                wx.showToast({
                                    title: "二维码已保存到本地,赶紧分享给主播认证吧!",
                                    icon: "none",
                                    duration: 3000,
                                });
                            },
                            complete: function () {
                                wx.hideLoading();
                            },
                        });
                        return [2];
                }
            });
        });
    },
    getTimeMS: function (time) {
        return new Date(time.replace('-', '/')).getTime();
    },
    getRoomData: function (doccode) {
        return __awaiter(this, void 0, void 0, function () {
            var _a, err, res, roomData;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4, wx.$utils.to(wx.$http.request({
                            url: '/shopping/live/getLiveRoomListForMe.do',
                            data: {
                                doccode: doccode
                            }
                        }))];
                    case 1:
                        _a = _b.sent(), err = _a[0], res = _a[1];
                        if (err) {
                            console.log(err);
                            return [2];
                        }
                        roomData = res.list[0];
                        console.log('编辑直播间。。。', roomData.Type.toString(), roomData.Type);
                        this.setData({
                            anchorName: roomData.AnchorName,
                            anchorWechat: roomData.AnchorWechat,
                            subAnchorWechat: roomData.SubAnchorWechat,
                            roomTitle: roomData.RoomName,
                            screenType: roomData.ScreenType,
                            isFeedsPublic: roomData.isFeedsPublic,
                            isShowInHomepage: roomData.isShowBannerPhotoOnHomePage,
                            type: roomData.Type.toString() || '0',
                            startDate: this.getTimeMS(roomData.StartTime),
                            endDate: this.getTimeMS(roomData.EndTime),
                            startTime: roomData.StartTime,
                            endTime: roomData.EndTime,
                            doccode: roomData.DocCode,
                            shareImg: roomData.ShareImgUnidUrl || '',
                            coverImg: roomData.CoverImgUnidUrl || '',
                            feedsImg: roomData.FeedsImgUnidUrl || '',
                            bannerPhoto: roomData.BannerPhoto || '',
                            isLike: !roomData.isCloseLike,
                            isComment: !roomData.isCloseComment,
                            isGoods: !roomData.isCloseGoods,
                            isShare: !roomData.isCloseShare,
                            isReplay: !roomData.isCloseReplay,
                        });
                        return [2];
                }
            });
        });
    },
    onLoad: function (options) {
        var _this = this;
        wx.$http.request({
            url: '/shopping/account.do?m=accountInfo',
        }).then(function (res) {
            console.log('获取用户信息', res);
            _this.setData({
                HeadImgUrl: res.UserInfo.HeadImgUrl
            });
        });
        var doccode = options.doccode || '';
        if (doccode) {
            this.getRoomData(doccode);
        }
        this.setData({
            isShowBannerOnHomePage: app.globalData.isShowBannerPhotoOnHomePageForLiveUser
        });
    },
    onReady: function () { },
    onShow: function () { },
    onHide: function () { },
    onUnload: function () { },
    onPullDownRefresh: function () { },
    onReachBottom: function () { },
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZVJvb21DcmVhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJsaXZlUm9vbUNyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFjLENBQUM7QUFNakMsSUFBSSxDQUFDO0lBSUgsSUFBSSxFQUFFO1FBQ0osV0FBVyxFQUFFLENBQUM7UUFDZCxJQUFJLEVBQUUsR0FBRztRQUNULEtBQUssRUFBRTtZQUNMO2dCQUNFLElBQUksRUFBRSxRQUFRO2dCQUNkLFlBQVksRUFBRSxZQUFZO2dCQUMxQixVQUFVLEVBQUUsU0FBUzthQUN0QjtZQUNEO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLFlBQVksRUFBRSxRQUFRO2dCQUN0QixVQUFVLEVBQUUsTUFBTTthQUNuQjtTQUNGO1FBQ0QsWUFBWSxFQUFFO1lBQ1osS0FBSyxFQUFFLGFBQWE7WUFDcEIsR0FBRyxFQUFFLGFBQWE7WUFDbEIsSUFBSSxFQUFFLHFCQUFxQjtTQUM1QjtRQUNELGlCQUFpQixFQUFFO1lBQ2pCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3hCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NBQ3pCO1FBQ0QsVUFBVSxFQUFFLENBQUM7UUFDYixhQUFhLEVBQUUsS0FBSztRQUNwQixnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLElBQUk7UUFDZixPQUFPLEVBQUUsSUFBSTtRQUNiLE9BQU8sRUFBRSxJQUFJO1FBQ2IsUUFBUSxFQUFFLElBQUk7UUFDZCxJQUFJLEVBQUUsS0FBSztRQUNYLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLGFBQWEsRUFBQyxFQUFFO1FBQ2hCLFVBQVUsRUFBQyxFQUFFO1FBQ2IsU0FBUyxFQUFDLEVBQUU7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QUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYTt5QkFDbEMsQ0FBQyxDQUFBOzs7OztLQUNIO0lBSUQsTUFBTSxFQUFFLFVBQVUsT0FBTztRQUFqQixpQkFnQlA7UUFmQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNmLEdBQUcsRUFBQyxvQ0FBb0M7U0FDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQU87WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixLQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNYLFVBQVUsRUFBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVU7YUFDbkMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ1gsc0JBQXNCLEVBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxzQ0FBc0M7U0FDN0UsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUtELE9BQU8sRUFBRSxjQUFhLENBQUM7SUFLdkIsTUFBTSxFQUFFLGNBQWEsQ0FBQztJQUt0QixNQUFNLEVBQUUsY0FBYSxDQUFDO0lBS3RCLFFBQVEsRUFBRSxjQUFhLENBQUM7SUFLeEIsaUJBQWlCLEVBQUUsY0FBYSxDQUFDO0lBS2pDLGFBQWEsRUFBRSxjQUFhLENBQUM7Q0FROUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcGFnZXMvbGl2ZVJvb21DcmVhdGUvbGl2ZVJvb21DcmVhdGUuanNcbi8vIGNvbnN0IHd4LiR1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi93eC4kdXRpbHMvdXRpbC5qc1wiKTtcbmNvbnN0IGFwcCA9IGdldEFwcDxJQXBwT3B0aW9uPigpO1xuXG50eXBlIHRpbWVUeXBlID0gJ3N0YXJ0VGltZSd8J2VuZFRpbWUnO1xudHlwZSBpbWdUeXBlID0gJ3NoYXJlSW1nJ3wnZmVlZHNJbWcnfCdjb3ZlckltZyd8J2Jhbm5lclBob3RvJztcbnR5cGUgaW5wdXRUeXBlID0gJ2FuY2hvck5hbWUnfCdyb29tVGl0bGUnfCdhbmNob3JXZWNoYXQnfCdzdWJBbmNob3JXZWNoYXQnO1xuXG5QYWdlKHtcbiAgLyoqXG4gICAqIOmhtemdoueahOWIneWni+aVsOaNrlxuICAgKi9cbiAgZGF0YToge1xuICAgIGN1cnJlbnRTdGVwOiAwLFxuICAgIHR5cGU6IFwiMFwiLFxuICAgIHN0ZXBzOiBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IFwi4pGgIOWfuuacrOS/oeaBr1wiLFxuICAgICAgICBpbmFjdGl2ZUljb246IFwibG9jYXRpb24tb1wiLFxuICAgICAgICBhY3RpdmVJY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6IFwi4pGhIOebtOaSremXtOmFjee9rlwiLFxuICAgICAgICBpbmFjdGl2ZUljb246IFwibGlrZS1vXCIsXG4gICAgICAgIGFjdGl2ZUljb246IFwicGx1c1wiLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHRpbWVFcnJvck1zZzoge1xuICAgICAgc3RhcnQ6IFwi6K+36YCJ5oup6K6h5YiS55u05pKt5byA5aeL5pe26Ze0XCIsXG4gICAgICBlbmQ6IFwi6K+36YCJ5oup6K6h5YiS55u05pKt57uT5p2f5pe26Ze0XCIsXG4gICAgICB0aXBzOiBcIuW8gOaSreaXtumXtOWSjOe7k+adn+aXtumXtOmXtOmalOS4jeW+l+efreS6jjMw5YiG6ZKfXCIsXG4gICAgfSxcbiAgICBzY3JlZW5UeXBlT3B0aW9uczogW1xuICAgICAgeyB0ZXh0OiBcIuerluWxj1wiLCB2YWx1ZTogMCB9LFxuICAgICAgeyB0ZXh0OiBcIuaoquWxj1wiLCB2YWx1ZTogMSB9LFxuICAgIF0sXG4gICAgc2NyZWVuVHlwZTogMCxcbiAgICBpc0ZlZWRzUHVibGljOiBmYWxzZSxcbiAgICBpc1Nob3dJbkhvbWVwYWdlOiBmYWxzZSxcbiAgICBpc0xpa2U6IHRydWUsXG4gICAgaXNDb21tZW50OiB0cnVlLFxuICAgIGlzR29vZHM6IHRydWUsXG4gICAgaXNTaGFyZTogdHJ1ZSxcbiAgICBpc1JlcGxheTogdHJ1ZSxcbiAgICBpc0tmOiBmYWxzZSxcbiAgICBzaG93UXJDb2RlOiBmYWxzZSxcbiAgICBxckNvZGVUZW1wVXJsOicnLFxuICAgIGFuY2hvck5hbWU6JycsXG4gICAgcm9vbVRpdGxlOicnLFxuICAgIGFuY2hvcldlY2hhdDonJyxcbiAgICBzdWJBbmNob3JXZWNoYXQ6JycsXG4gICAgc2hhcmVJbWc6JycsXG4gICAgZmVlZHNJbWc6JycsXG4gICAgY292ZXJJbWc6JycsXG4gICAgYmFubmVyUGhvdG86JycsXG4gICAgZG9jY29kZTonJyxcbiAgICBxckNvZGVVcmw6XCJcIiwgLy9odHRwczovL3Jlcy53eC5xcS5jb20vb3BfcmVzL0JiVk5lY3pBMVh1ZGZqVnFDVm9LZ2Z1V2U3ZTNhVWhva2t0UlZPcWZfRjBJcVM2a1lSLS1hdENwVk5VVUMzenJcbiAgICBtaW5TdGFydERhdGU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMTAwMCAqIDYwICogMjAsXG4gICAgbWF4U3RhcnREYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDEwMDAgKiA2MCAqIDYwICogMjQgKiAxODAsXG4gICAgc3RhcnREYXRlOiAwLCAvL25ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgIHN0YXJ0VGltZTogJycsXG4gICAgbWluRW5kRGF0ZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAxMDAwICogNjAgKiA0MCxcbiAgICBtYXhFbmREYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDEwMDAgKiA2MCAqIDYwICogMjQgKiAxODAsXG4gICAgZW5kRGF0ZTogMCwgLy9uZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICBlbmRUaW1lOiAnJyxcbiAgICBmb3JtYXR0ZXIodHlwZTpzdHJpbmcsIHZhbHVlOnN0cmluZykge1xuICAgICAgLy8gY29uc29sZS5sb2codHlwZSx2YWx1ZSlcbiAgICAgIGlmICh0eXBlID09PSBcInllYXJcIikge1xuICAgICAgICByZXR1cm4gYCR7dmFsdWV95bm0YDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX3mnIhgO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImRheVwiKSB7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX3ml6VgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8g5YiH5o2i55u05pKt57G75Z6LXG4gIG9uQ2hhbmdlVHlwZShldmVudDphbnkpIHtcblxuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICB0eXBlOiBldmVudC5kZXRhaWwsXG4gICAgfSk7XG4gIH0sXG4gIG9uQ2xpY2tUeXBlKGV2ZW50OmFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdkZGQnLGV2ZW50KTtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldDtcbiAgICB0aGlzLnNldERhdGEoe1xuICAgICAgdHlwZTogbmFtZSxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICog6YCJ5oup5pe26Ze0XG4gICAqL1xuICBvbklucHV0U3RhcnREYXRlKCkge30sXG4gIG9uRW50ZXJTdGFydERhdGUoZTphbnkpIHtcbiAgICBsZXQgc3RhcnRUaW1lID0gd3guJHV0aWxzLmZvcm1hdFRpbWUoZS5kZXRhaWwpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5lbmREYXRlICYmXG4gICAgICBNYXRoLmFicyhlLmRldGFpbCAtIHRoaXMuZGF0YS5lbmREYXRlKSA+IDEwMDAgKiA2MCAqIDYwICogMjRcbiAgICApIHtcbiAgICAgIGxldCBkYXRlID0gZS5kZXRhaWwgKyAxMDAwICogNjAgKiA2MCAqIDI0O1xuICAgICAgbGV0IHRpbWUgPSB3eC4kdXRpbHMuZm9ybWF0VGltZShkYXRlKTtcbiAgICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIGVuZERhdGU6IGRhdGUsXG4gICAgICAgIGVuZFRpbWU6IHRpbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLmVuZERhdGUgJiZcbiAgICAgIE1hdGguYWJzKGUuZGV0YWlsIC0gdGhpcy5kYXRhLmVuZERhdGUpIDwgMTAwMCAqIDYwICogMzBcbiAgICApIHtcbiAgICAgIGxldCBkYXRlID0gZS5kZXRhaWwgKyAxMDAwICogNjAgKiAzMDtcbiAgICAgIGxldCB0aW1lID0gd3guJHV0aWxzLmZvcm1hdFRpbWUoZGF0ZSk7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBlbmREYXRlOiBkYXRlLFxuICAgICAgICBlbmRUaW1lOiB0aW1lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGlmICh0aGlzLmRhdGEuZW5kRGF0ZSAmJiBlLmRldGFpbCA+IHRoaXMuZGF0YS5lbmREYXRlKSB7XG4gICAgLy8gfVxuICAgIGNvbnNvbGUubG9nKFwi6YCJ5oup5byA5pKt5pe26Ze0XCIsIHN0YXJ0VGltZSk7XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIHN0YXJ0RGF0ZTogZS5kZXRhaWwsXG4gICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICAgIG1heEVuZERhdGU6IGUuZGV0YWlsICsgMTAwMCAqIDYwICogNjAgKiAyNCxcbiAgICAgIG1pbkVuZERhdGU6IGUuZGV0YWlsICsgMTAwMCAqIDYwICogMzAsXG4gICAgfSk7XG4gICAgdGhpcy5oYW5kbGVMaXZlVGltZSgpO1xuICAgIHRoaXMub25DYW5jZWxTdGFydERhdGUoKTtcbiAgfSxcbiAgb25DYW5jZWxTdGFydERhdGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQoXCIjc3RhcnQtdGltZVwiKS50b2dnbGUoKTtcbiAgICB0aGlzLmNoZWNrVGltZShcInN0YXJ0VGltZVwiLCBcIuivt+mAieaLqeiuoeWIkuebtOaSreW8gOWni+aXtumXtFwiKTtcbiAgfSxcblxuICBvbklucHV0RW5kRGF0ZSgpIHt9LFxuICAvLyBvblRpdGxlVGFwKCl7XG4gIC8vICAgaWYgKCF0aGlzLmRhdGEuc3RhcnRUaW1lKXtcbiAgLy8gICAgIHd4LnNob3dUb2FzdCh7XG4gIC8vICAgICAgIHRpdGxlOiAn6K+35YWI6YCJ5oup5byA5pKt5pe26Ze0JyxcbiAgLy8gICAgICAgZHVyYXRpb246IDIwMDBcbiAgLy8gICAgIH0pXG4gIC8vXG4gIC8vICAgfVxuICAvLyB9LFxuXG4gIG9uRW50ZXJFbmREYXRlKGU6YW55KSB7XG4gICAgbGV0IGVuZFRpbWUgPSB3eC4kdXRpbHMuZm9ybWF0VGltZShlLmRldGFpbCk7XG4gICAgY29uc29sZS5sb2coXCLpgInmi6nkuIvmkq3ml7bpl7RcIiwgZW5kVGltZSk7XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIGVuZERhdGU6IGUuZGV0YWlsLFxuICAgICAgZW5kVGltZTogZW5kVGltZSxcbiAgICAgIC8vIG1heFN0YXJ0RGF0ZTogZS5kZXRhaWwgLSAxMDAwICogNjAgKiAzMCxcbiAgICAgIC8vIG1pblN0YXJ0RGF0ZTogZS5kZXRhaWwgKyAxMDAwICogNjAgKiAyMCxcbiAgICAgIC8vIGUuZGV0YWlsIC0gMTAwMCAqIDYwICogMzAgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBlLmRldGFpbClcbiAgICB9KTtcbiAgICAvLyB0aGlzLmhhbmRsZUxpdmVUaW1lKCk7XG4gICAgdGhpcy5vbkNhbmNlbEVuZERhdGUoKTtcbiAgfSxcbiAgb25DYW5jZWxFbmREYXRlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KFwiI2VuZC10aW1lXCIpLnRvZ2dsZSgpO1xuICAgIHRoaXMuY2hlY2tUaW1lKFwiZW5kVGltZVwiLCBcIuivt+mAieaLqeiuoeWIkuebtOaSree7k+adn+aXtumXtFwiKTtcbiAgfSxcblxuICBoYW5kbGVMaXZlVGltZSgpIHtcbiAgICBjb25zb2xlLmxvZyhcImlpaVwiKTtcblxuICAgIGxldCBzdGFydERhdGUgPSB0aGlzLmRhdGEuc3RhcnREYXRlO1xuICAgIGxldCBzdGFydFRpbWUgPSB0aGlzLmRhdGEuc3RhcnRUaW1lO1xuICAgIGxldCBlbmREYXRlID0gdGhpcy5kYXRhLmVuZERhdGU7XG4gICAgbGV0IGVuZFRpbWUgPSB0aGlzLmRhdGEuZW5kVGltZTtcbiAgICBpZiAoIXN0YXJ0VGltZSB8fCAhZW5kVGltZSkgcmV0dXJuO1xuICAgIGlmIChzdGFydERhdGUgLSBlbmREYXRlID4gMCkge1xuICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgc3RhcnREYXRlOiBlbmREYXRlLFxuICAgICAgICBzdGFydFRpbWU6IGVuZFRpbWUsXG4gICAgICAgIGVuZERhdGU6IHN0YXJ0RGF0ZSxcbiAgICAgICAgZW5kVGltZTogc3RhcnRUaW1lLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIGNoZWNrVGltZSh0aW1lOnRpbWVUeXBlLCBtc2c6c3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGF0YVt0aW1lXSA9PSAnJykge1xuICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgW3RpbWUgKyBcIkVycm9yXCJdOiBtc2csXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIFt0aW1lICsgXCJFcnJvclwiXTogXCJcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB0aGlzLmhhbmRsZUxpdmVUaW1lKClcbiAgfSxcblxuICBvbkNoYW5nZUZlZWRzKHsgZGV0YWlsIH06YW55KSB7XG4gICAgLy8g6ZyA6KaB5omL5Yqo5a+5IGNoZWNrZWQg54q25oCB6L+b6KGM5pu05pawXG4gICAgdGhpcy5zZXREYXRhKHsgaXNGZWVkc1B1YmxpYzogZGV0YWlsIH0pO1xuICB9LFxuICBvbkNoYW5nZVNob3dIb21lcGFnZSh7IGRldGFpbCB9OmFueSkge1xuICAgIC8vIOmcgOimgeaJi+WKqOWvuSBjaGVja2VkIOeKtuaAgei/m+ihjOabtOaWsFxuICAgIHRoaXMuc2V0RGF0YSh7IGlzU2hvd0luSG9tZXBhZ2U6IGRldGFpbCB9KTtcbiAgfSxcbiAgLyoqXG4gICAqXG4gICAqL1xuICBjaGVja0FuY2hvck5hbWUoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICB0aGlzLnNldERhdGEoe1xuICAgICAgYW5jaG9yTmFtZTogdmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5jaGVja0lucHV0KFwiYW5jaG9yTmFtZVwiKTtcbiAgfSxcbiAgY2hlY2tSb29tVGl0bGUoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICByb29tVGl0bGU6IHZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2hlY2tJbnB1dChcInJvb21UaXRsZVwiKTtcbiAgfSxcbiAgY2hlY2tBbmNob3JXZWNoYXQoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBhbmNob3JXZWNoYXQ6IHZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2hlY2tJbnB1dChcImFuY2hvcldlY2hhdFwiKTtcbiAgfSxcbiAgY2hlY2tTdWJBbmNob3JXZWNoYXQoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBzdWJBbmNob3JXZWNoYXQ6IHZhbHVlLFxuICAgIH0pO1xuICAgIGlmICh2YWx1ZS5sZW5ndGg+MCkge1xuICAgICAgdGhpcy5jaGVja0lucHV0KFwic3ViQW5jaG9yV2VjaGF0XCIpO1xuICAgIH0gZWxzZXtcbiAgICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIHN1YkFuY2hvcldlY2hhdEVycm9yOiBcIlwiXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgY2hlY2tJbnB1dCh0eXBlOmlucHV0VHlwZSk6Ym9vbGVhbiB7XG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBhbmNob3JOYW1lOiB7XG4gICAgICAgIGVycm9yOiBcIuS4u+aSreaYteensOW/hemhu+S4ujItMTXkuKrlrZdcIixcbiAgICAgICAgcmVnRXhwOiAvXi57MiwxNX0kLyxcbiAgICAgIH0sXG4gICAgICByb29tVGl0bGU6IHtcbiAgICAgICAgZXJyb3I6IFwi55u05pKt5qCH6aKY5b+F6aG75Li6My0xN+S4quWtl1wiLFxuICAgICAgICByZWdFeHA6IC9eLnszLDE3fSQvLFxuICAgICAgfSxcbiAgICAgIGFuY2hvcldlY2hhdDoge1xuICAgICAgICBlcnJvcjogXCLlvq7kv6Hlj7fkuI3lkIjop4RcIixcbiAgICAgICAgcmVnRXhwOiAvXlthLXpBLVpdW2EtekEtWlxcZF8tXXs1LDE5fSQvLFxuICAgICAgfSxcbiAgICAgIHN1YkFuY2hvcldlY2hhdDoge1xuICAgICAgICBlcnJvcjogXCLlvq7kv6Hlj7fkuI3lkIjop4RcIixcbiAgICAgICAgcmVnRXhwOiAvXlthLXpBLVpdW2EtekEtWlxcZF8tXXs1LDE5fSQvLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIGxldCBtc2cgPSB7XG4gICAgLy8gICBhbmNob3JOYW1lOiAn6K+36L6T5YWl5Li75pKt5pi156ewJyxcbiAgICAvLyAgIGFuY2hvck5hbWUyOiAn5Li75pKt5pi156ew5b+F6aG75Li6Mi0xNeS4quWtlycsXG4gICAgLy8gICByb29tVGl0bGU6ICfor7fovpPlhaXnm7Tmkq3moIfpopgnLFxuICAgIC8vICAgcm9vbVRpdGxlMjogJ+ebtOaSreagh+mimOW/hemhu+S4ujMtMTfkuKrlrZcnLFxuICAgIC8vIH1cbiAgICAvLyAvLyAvXlthLXpBLVpdW2EtekEtWlxcZF8tXXs1LDE5fSQvXG4gICAgLy8gbGV0IGxlbmd0aCA9IHtcbiAgICAvLyAgIGFuY2hvck5hbWU6MixcbiAgICAvLyAgIHJvb21UaXRsZTogMyxcbiAgICAvLyAgIGFuY2hvcldlY2hhdFxuICAgIC8vIH1cbiAgICBsZXQgdmFsdWUgPSB0aGlzLmRhdGFbdHlwZV0gfHwgXCJcIjtcbiAgICBjb25zb2xlLmxvZyh2YWx1ZSwgb3B0aW9uc1t0eXBlXS5yZWdFeHAudGVzdCh2YWx1ZSkpO1xuICAgIGlmICghb3B0aW9uc1t0eXBlXS5yZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIFt0eXBlICsgXCJFcnJvclwiXTogb3B0aW9uc1t0eXBlXS5lcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBbdHlwZSArIFwiRXJyb3JcIl06IFwiXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog5qOA5p+lXG4gICAqL1xuXG4gIGFzeW5jIG9uQ2xpY2tOZXh0U3RlcCgpIHtcbiAgICBsZXQgYXJyID0gW107XG4gICAgbGV0IGRvY2NvZGUgPSB0aGlzLmRhdGEuZG9jY29kZXx8Jyc7XG4gICAgbGV0IHR5cGUgPSB0aGlzLmRhdGEudHlwZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gdGhpcy5kYXRhLnN0YXJ0VGltZTtcbiAgICBsZXQgZW5kVGltZSA9IHRoaXMuZGF0YS5lbmRUaW1lO1xuICAgIGxldCBhbmNob3JOYW1lID0gdGhpcy5kYXRhLmFuY2hvck5hbWU7XG4gICAgbGV0IHJvb21UaXRsZSA9IHRoaXMuZGF0YS5yb29tVGl0bGU7XG4gICAgbGV0IGFuY2hvcldlY2hhdCA9IHRoaXMuZGF0YS5hbmNob3JXZWNoYXQ7XG4gICAgbGV0IHN1YkFuY2hvcldlY2hhdCA9IHRoaXMuZGF0YS5zdWJBbmNob3JXZWNoYXR8fCcnO1xuICAgIGxldCBzY3JlZW5UeXBlID0gdGhpcy5kYXRhLnNjcmVlblR5cGU7XG4gICAgbGV0IGlzRmVlZHNQdWJsaWMgPSB0aGlzLmRhdGEuaXNGZWVkc1B1YmxpYztcbiAgICBsZXQgaXNTaG93QmFubmVyUGhvdG9PbkhvbWVQYWdlID0gdGhpcy5kYXRhLmlzU2hvd0luSG9tZXBhZ2U7XG4gICAgYXJyLnB1c2godGhpcy5jaGVja1RpbWUoXCJzdGFydFRpbWVcIiwgXCLor7fpgInmi6norqHliJLnm7Tmkq3lvIDlp4vml7bpl7RcIikpO1xuICAgIGFyci5wdXNoKHRoaXMuY2hlY2tUaW1lKFwiZW5kVGltZVwiLCBcIuivt+mAieaLqeiuoeWIkuebtOaSree7k+adn+aXtumXtFwiKSk7XG4gICAgYXJyLnB1c2godGhpcy5jaGVja0lucHV0KFwiYW5jaG9yTmFtZVwiKSk7XG4gICAgYXJyLnB1c2godGhpcy5jaGVja0lucHV0KFwicm9vbVRpdGxlXCIpKTtcbiAgICBhcnIucHVzaCh0aGlzLmNoZWNrSW5wdXQoXCJhbmNob3JXZWNoYXRcIikpO1xuICAgIGlmIChzdWJBbmNob3JXZWNoYXQubGVuZ3RoPjApIHtcbiAgICAgIGFyci5wdXNoKHRoaXMuY2hlY2tJbnB1dChcInN1YkFuY2hvcldlY2hhdFwiKSk7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCLnm7Tmkq3nsbvlnotcIiwgdHlwZSk7XG4gICAgLy8gY29uc29sZS5sb2coXCLlvIDmkq3ml7bpl7RcIiwgc3RhcnRUaW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIuS4i+aSreaXtumXtFwiLCBlbmRUaW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIuS4u+aSreaYteensFwiLCBhbmNob3JOYW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIuaIv+mXtOagh+mimFwiLCByb29tVGl0bGUpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwi5Li75pKt5b6u5L+hXCIsIGFuY2hvcldlY2hhdCk7XG4gICAgLy8gY29uc29sZS5sb2coXCLlsY/luZXnsbvlnotcIiwgc2NyZWVuVHlwZSk7XG4gICAgLy8gY29uc29sZS5sb2coXCLlrpjmlrnmlLblvZVcIiwgaXNGZWVkc1B1YmxpYyk7XG4gICAgaWYgKGFyci5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwi5LiN6IO95LiL5LiA5q2lXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBzdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgYW5jaG9yTmFtZSxcbiAgICAgIG5hbWU6IHJvb21UaXRsZSxcbiAgICAgIGFuY2hvcldlY2hhdCxcbiAgICAgIHN1YkFuY2hvcldlY2hhdCxcbiAgICAgIHNjcmVlblR5cGUsXG4gICAgICBpc0ZlZWRzUHVibGljLFxuICAgICAgZG9jY29kZSxcbiAgICAgIGlzU2hvd0Jhbm5lclBob3RvT25Ib21lUGFnZVxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCLnrKzkuIDmraXooajljZXmlbDmja5cIiwgZGF0YSk7XG5cbiAgICBsZXQgW2VyciwgcmVzXSA9IGF3YWl0IHd4LiR1dGlscy50byhcbiAgICAgIHd4LiRodHRwLnJlcXVlc3Qoe1xuICAgICAgICB1cmw6IFwiL3Nob3BwaW5nL2xpdmUvc2F2ZVJvb21TdGVwMS5kb1wiLFxuICAgICAgICBkYXRhLFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCLmlrDlu7rmiL/pl7QtLeesrOS4gOatpVwiLCByZXMpO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBjdXJyZW50U3RlcDogMSxcbiAgICAgIGRvY2NvZGU6IHJlcy5kb2Njb2RlLFxuICAgICAgbG9nb1VybDphcHAuZ2xvYmFsRGF0YS5sb2dvVXJsLFxuICAgICAgc2hvcE5hbWU6YXBwLmdsb2JhbERhdGEuc2hvcE5hbWVcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICog56ys5LqM5q2lLS3kuIrkvKDlm77niYdcbiAgICovXG4gIHVwbG9hZEltZyhpbWdUeXBlOmltZ1R5cGUpIHtcbiAgICB3eC5jaG9vc2VJbWFnZSh7XG4gICAgICBjb3VudDogMSwgLy8g6buY6K6kOVxuICAgICAgc2l6ZVR5cGU6IFtcIm9yaWdpbmFsXCIsIFwiY29tcHJlc3NlZFwiXSwgLy8g5Y+v5Lul5oyH5a6a5piv5Y6f5Zu+6L+Y5piv5Y6L57yp5Zu+77yM6buY6K6k5LqM6ICF6YO95pyJXG4gICAgICBzb3VyY2VUeXBlOiBbXCJhbGJ1bVwiLCBcImNhbWVyYVwiXSwgLy8g5Y+v5Lul5oyH5a6a5p2l5rqQ5piv55u45YaM6L+Y5piv55u45py677yM6buY6K6k5LqM6ICF6YO95pyJXG4gICAgICBzdWNjZXNzOiBhc3luYyhyZXMpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzLmRhdGEpXG4gICAgICAgIC8vIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIC8vICAgaW1hZ2VMaXN0OiByZXMudGVtcEZpbGVQYXRocyxcbiAgICAgICAgLy8gICB0ZW1wRmlsZXM6IHJlcy50ZW1wRmlsZXNcbiAgICAgICAgLy8gfSlcbiAgICAgICAgbGV0IGltZ0xpc3QgPSByZXMudGVtcEZpbGVQYXRocztcbiAgICAgICAgbGV0IGZpbGVzID0gcmVzLnRlbXBGaWxlcztcbiAgICAgICAgbGV0IGZpZWxkaWQgPSBpbWdUeXBlO1xuICAgICAgICBsZXQgZG9jY29kZSA9IHRoaXMuZGF0YS5kb2Njb2RlO1xuICAgICAgICBjb25zb2xlLmxvZyhpbWdMaXN0LCBmaWxlcywgZmllbGRpZCwgZG9jY29kZSk7XG4gICAgICAgIGxldCBbZXJyLHJlc3VsdF0gPSBhd2FpdCB3eC4kdXRpbHMudG8oXG4gICAgICAgICAgd3guJGh0dHAudXBsb2FkRmlsZSh7XG4gICAgICAgICAgICB1cmw6YC9zaG9wcGluZy9saXZlL3NhdmVSb29tQXR0YWNobWVudC5kbz9kb2Njb2RlPSR7ZG9jY29kZX0mZmllbGRpZD0ke2ZpZWxkaWR9YCxcbiAgICAgICAgICAgIGZvcm1EYXRhOntcbiAgICAgICAgICAgICAgZmlsZTogZmlsZXNbMF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmlsZVBhdGg6aW1nTGlzdFswXVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgaWYgKGVycil7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgICBbaW1nVHlwZV06IHJlc3VsdC51cmwsXG4gICAgICAgICAgW2ltZ1R5cGUgKyBcIkVycm9yXCJdOiBcIlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gdGhpcy5zZXREYXRhKHtcbiAgICAgICAgLy8gICBbaW1nVHlwZV06IGltZ0xpc3RbMF0sXG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gd3gudXBsb2FkRmlsZSh7XG4gICAgICAgIC8vICAgdXJsOiB3eC4kdXRpbHMuZ2V0VXJsKFxuICAgICAgICAvLyAgICAgXCIvc2hvcHBpbmcvbGl2ZS9zYXZlUm9vbUF0dGFjaG1lbnQuZG8/ZG9jY29kZT1cIiArXG4gICAgICAgIC8vICAgICAgIGRvY2NvZGUgK1xuICAgICAgICAvLyAgICAgICBcIiZmaWVsZGlkPVwiICtcbiAgICAgICAgLy8gICAgICAgZmllbGRpZFxuICAgICAgICAvLyAgICksXG4gICAgICAgIC8vICAgLy8gdXJsOiBhcHAuZ2xvYmFsRGF0YS5yZXFCYXNlICsgJy9zaG9wcGluZy9jb25maXJtLmRvP209dXBsb2FkQXR0YWNobWVudCZkb2Njb2RlPScrIGRvY2NvZGUgKycmcm93aWQ9Jytyb3dpZCxcbiAgICAgICAgLy8gICBmb3JtRGF0YToge1xuICAgICAgICAvLyAgICAgZmlsZTogZmlsZXNbMF0sXG4gICAgICAgIC8vICAgfSxcbiAgICAgICAgLy8gICBmaWxlUGF0aDogaW1nTGlzdFswXSxcbiAgICAgICAgLy8gICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgLy8gICAvL0B0cy1pZ25vcmVcbiAgICAgICAgLy8gICBzdWNjZXNzOiAocmVzOmFueSkgPT4ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgLy8gICAgIC8vIHJldHVybjtcbiAgICAgICAgLy8gICAgIC8vIGlmICghd3guJHV0aWxzLnJlcXVlc3RFcnJvcihyZXMpKSB7XG4gICAgICAgIC8vICAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gICAgIC8vIH1cbiAgICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgLy8gICAgICAgW2ltZ1R5cGVdOiByZXMuZGF0YS51cmwsXG4gICAgICAgIC8vICAgICAgIFtpbWdUeXBlICsgXCJFcnJvclwiXTogXCJcIixcbiAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vICAgZmFpbDogZnVuY3Rpb24gKGVycm1zZykge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJ1cGxvYWRJbWFnZSBmYWlsLCBlcnJNc2cgaXNcIiwgZXJybXNnKTtcbiAgICAgICAgLy8gICAgIHd4LiR1dGlscy5yZXF1ZXN0RmFpbChcbiAgICAgICAgLy8gICAgICAgZXJybXNnLFxuICAgICAgICAvLyAgICAgICBcIi9zaG9wcGluZy9saXZlL3NhdmVSb29tQXR0YWNobWVudC5kbz9kb2Njb2RlPVwiXG4gICAgICAgIC8vICAgICApO1xuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbiAgdXBsb2FkU2hhcmVJbWcoKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJzaGFyZUltZ1wiKTtcbiAgfSxcbiAgdXBsb2FkRmVlZHNJbWcoKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJmZWVkc0ltZ1wiKTtcbiAgfSxcbiAgdXBsb2FkQ292ZXJJbWcoKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJjb3ZlckltZ1wiKTtcbiAgfSxcbiAgdXBsb2FkQmFubmVyUGhvdG8oKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJiYW5uZXJQaG90b1wiKTtcbiAgfSxcblxuICBvbkNsaWNrTGFzdFN0ZXAoKSB7XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIGN1cnJlbnRTdGVwOiAwLFxuICAgIH0pO1xuICB9LFxuXG4gIG9uQ2hhbmdlTGlrZSh7IGRldGFpbCB9OmFueSkge1xuICAgIHRoaXMuc2V0RGF0YSh7IGlzTGlrZTogZGV0YWlsIH0pO1xuICB9LFxuICBvbkNoYW5nZUNvbW1lbnQoeyBkZXRhaWwgfTphbnkpIHtcbiAgICB0aGlzLnNldERhdGEoeyBpc0NvbW1lbnQ6IGRldGFpbCB9KTtcbiAgfSxcbiAgb25DaGFuZ2VHb29kcyh7IGRldGFpbCB9OmFueSkge1xuICAgIHRoaXMuc2V0RGF0YSh7IGlzR29vZHM6IGRldGFpbCB9KTtcbiAgfSxcbiAgb25DaGFuZ2VTaGFyZSh7IGRldGFpbCB9OmFueSkge1xuICAgIHRoaXMuc2V0RGF0YSh7IGlzU2hhcmU6IGRldGFpbCB9KTtcbiAgfSxcbiAgb25DaGFuZ2VSZXBsYXkoeyBkZXRhaWwgfTphbnkpIHtcbiAgICB0aGlzLnNldERhdGEoeyBpc1JlcGxheTogZGV0YWlsIH0pO1xuICB9LFxuXG4gIHNob3dFcnJvck1zZyhpbWdUeXBlOmltZ1R5cGUsZXJyTXNnOnN0cmluZyl7XG4gICAgd3guc2hvd1RvYXN0KHtcbiAgICAgIHRpdGxlOiBlcnJNc2csXG4gICAgICBpY29uOiBcIm5vbmVcIixcbiAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBbaW1nVHlwZSArIFwiRXJyb3JcIl06IGVyck1zZyxcbiAgICB9KTtcbiAgfSxcbiAgaXNJbWdVcGxvYWQoKXtcbiAgICBpZiAoIXRoaXMuZGF0YS5zaGFyZUltZykge1xuICAgICAgbGV0IGVyck1zZyA9IFwi6K+35LiK5Lyg5YiG5Lqr5Y2h54mH5bCB6Z2i5Zu+54mHXCI7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZygnc2hhcmVJbWcnLGVyck1zZylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRhdGEuZmVlZHNJbWcpIHtcbiAgICAgIGxldCBlcnJNc2cgPSBcIuivt+S4iuS8oOebtOaSreWNoeeJh+WwgemdolwiO1xuICAgICAgdGhpcy5zaG93RXJyb3JNc2coJ2ZlZWRzSW1nJyxlcnJNc2cpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGlmICghdGhpcy5kYXRhLmJhbm5lclBob3RvJiZ0aGlzLmRhdGEuaXNTaG93SW5Ib21lcGFnZSkge1xuICAgIC8vICAgbGV0IGVyck1zZyA9IFwi6K+35LiK5Lyg55u05pKt6Ze06aaW6aG15YWl5Y+j5bCB6Z2iXCI7XG4gICAgLy8gICB0aGlzLnNob3dFcnJvck1zZygnYmFubmVyUGhvdG8nLGVyck1zZylcbiAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG4gICAgaWYgKCF0aGlzLmRhdGEuY292ZXJJbWcpIHtcbiAgICAgIGxldCBlcnJNc2cgPSBcIuivt+S4iuS8oOebtOaSremXtOiDjOaZr+WimVwiO1xuICAgICAgdGhpcy5zaG93RXJyb3JNc2coJ2NvdmVySW1nJyxlcnJNc2cpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGFzeW5jIG9uQ2xpY2tTdWJtaXQoKSB7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBkb2Njb2RlOiB0aGlzLmRhdGEuZG9jY29kZSxcbiAgICAgIGNsb3NlTGlrZTogIXRoaXMuZGF0YS5pc0xpa2UsXG4gICAgICBjbG9zZUdvb2RzOiAhdGhpcy5kYXRhLmlzR29vZHMsXG4gICAgICBjbG9zZUNvbW1lbnQ6ICF0aGlzLmRhdGEuaXNDb21tZW50LFxuICAgICAgY2xvc2VSZXBsYXk6ICF0aGlzLmRhdGEuaXNSZXBsYXksXG4gICAgICBjbG9zZVNoYXJlOiAhdGhpcy5kYXRhLmlzU2hhcmUsXG4gICAgICBjbG9zZUtmOiB0cnVlLFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCLnrKzkuozmraXorr7nva7mlbDmja5cIiwgZGF0YSk7XG4gICAgaWYgKCF0aGlzLmlzSW1nVXBsb2FkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAvc2hvcHBpbmcvbGl2ZS9zYXZlUm9vbVN0ZXAyLmRvP2RvY2NvZGU9WFhYJmNsb3NlTGlrZT1mYWxzZSZjbG9zZUdvb2RzPWZhbHNlJmNsb3NlQ29tbWVudD1mYWxzZSZjbG9zZVJlcGxheT1mYWxzZSZjbG9zZVNoYXJlPWZhbHNlJmNsb3NlS2Y9ZmFsc2VcbiAgICBsZXQgW2VyciwgcmVzXSA9IGF3YWl0IHd4LiR1dGlscy50byhcbiAgICAgIHd4LiRodHRwLnJlcXVlc3Qoe1xuICAgICAgICB1cmw6IFwiL3Nob3BwaW5nL2xpdmUvc2F2ZVJvb21TdGVwMi5kb1wiLFxuICAgICAgICBkYXRhLFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCLmlrDlu7rmiL/pl7QtLeesrOS6jOatpVwiLCByZXMpO1xuICAgIGlmIChyZXMuUXJDb2RlVXJsVW5pZCkge1xuICAgICAgd3guc2hvd0xvYWRpbmcoe1xuICAgICAgICB0aXRsZTogJydcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5kb3dubG9hZFFyKHJlcy5RckNvZGVVcmxVbmlkKTtcbiAgICAgIHd4LmhpZGVMb2FkaW5nKCk7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBzaG93UXJDb2RlOiB0cnVlLFxuICAgICAgICBxckNvZGVVcmw6cmVzLlFyQ29kZVVybFVuaWRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3eC5zaG93VG9hc3Qoe1xuICAgICAgICB0aXRsZTogJ+ebtOaSremXtOWIm+W7uuaIkOWKnycsXG4gICAgICAgIGljb246IFwibm9uZVwiLFxuICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAvLyB3eC5yZWRpcmVjdFRvKHtcbiAgICAgICAgLy8gICB1cmw6IFwiLi4vbXlMaXZlUm9vbS9teUxpdmVSb29tXCIsXG4gICAgICAgIC8vIH0pO1xuICAgICAgICB3eC5uYXZpZ2F0ZUJhY2soKTtcbiAgICAgIH0sMjAwMClcblxuICAgICAgLy8gJ2h0dHBzOi8vcmVzLnd4LnFxLmNvbS9vcF9yZXMvQmJWTmVjekExWHVkZmpWcUNWb0tnZnVXZTdlM2FVaG9ra3RSVk9xZl9GMElxUzZrWVItLWF0Q3BWTlVVQzN6cidcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgaXNBdXRob3JpemVTYXZlKCkge1xuICAgIGxldCBbZXJyLCByZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKHd4LnByby5nZXRTZXR0aW5nKCkpO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJnZXRTZXR0aW5nXCIsIHJlcyk7XG4gICAgcmV0dXJuIHJlcy5hdXRoU2V0dGluZ1tcInNjb3BlLndyaXRlUGhvdG9zQWxidW1cIl0gIT09IGZhbHNlO1xuICB9LFxuXG4gIGFzeW5jIGRvd25sb2FkUXIocXJDb2RlVXJsOnN0cmluZykge1xuICAgIGxldCBbZXJyLCByZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKFxuICAgICAgd3gucHJvLmRvd25sb2FkRmlsZSh7XG4gICAgICAgIC8vIHVybDogdGhpcy5kYXRhLnFyQ29kZVVybFxuICAgICAgICB1cmw6IHFyQ29kZVVybCxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImRvd25sb2FkUXJcIiwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCItLS0tZG93bmxvYWRRclwiLHJlcyk7XG4gICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgIC8vIGltZ0Rvd25sb2FkU3VtKys7XG4gICAgICBjb25zb2xlLmxvZygnLi4uLi4u5aS05YOPJyxyZXMudGVtcEZpbGVQYXRoKVxuICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgcXJDb2RlVGVtcFVybDogcmVzLnRlbXBGaWxlUGF0aFxuICAgICAgfSlcbiAgICB9ZWxzZXtcbiAgICAgIHd4LnNob3dUb2FzdCh7XG4gICAgICAgIHRpdGxlOiAn5LqM57u056CB5LiL6L295aSx6LSl77yM6K+36YeN6K+VJyxcbiAgICAgICAgaWNvbjogXCJub25lXCIsXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHNhdmVRckltZygpIHtcbiAgICB3eC5zaG93TG9hZGluZyh7XG4gICAgICB0aXRsZTogXCLkv53lrZjkuK0uLi5cIixcbiAgICB9KTtcbiAgICBsZXQgaXNBdXRob3JpemVTYXZlID0gYXdhaXQgdGhpcy5pc0F1dGhvcml6ZVNhdmUoKTtcbiAgICBpZiAoIWlzQXV0aG9yaXplU2F2ZSkge1xuICAgICAgd3guaGlkZUxvYWRpbmcoKTtcbiAgICAgIHd4LnNob3dNb2RhbCh7XG4gICAgICAgIHRpdGxlOiBcIuaPkOekulwiLFxuICAgICAgICBjb250ZW50OiBcIuaCqOi/mOacquaOiOadg+S/neWtmOWIsOebuOWGjO+8jOivt+WcqOaOpeS4i+adpeaJk+W8gOeahOiuvue9rumhtemdouW8gOWQr+ebuOWGjOaOiOadg++8gVwiLFxuICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgIGlmIChyZXMuY29uZmlybSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnlKjmiLfngrnlh7vnoa7lrppcIik7XG4gICAgICAgICAgICB3eC5vcGVuU2V0dGluZyh7XG4gICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzLmF1dGhTZXR0aW5nKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmNhbmNlbCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnlKjmiLfngrnlh7vlj5bmtohcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHd4LnNhdmVJbWFnZVRvUGhvdG9zQWxidW0oe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuZGF0YS5xckNvZGVUZW1wVXJsLFxuICAgICAgc3VjY2VzczogKCkgPT4ge1xuICAgICAgICB3eC5zaG93VG9hc3Qoe1xuICAgICAgICAgIHRpdGxlOiBcIuS6jOe7tOeggeW3suS/neWtmOWIsOacrOWcsO+8jOi1tue0p+WIhuS6q+e7meS4u+aSreiupOivgeWQp++8gVwiLFxuICAgICAgICAgIGljb246IFwibm9uZVwiLFxuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB3eC5oaWRlTG9hZGluZygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbiAgZ2V0VGltZU1TKHRpbWU6c3RyaW5nKXtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZS5yZXBsYWNlKCctJywnLycpKS5nZXRUaW1lKCk7XG4gIH0sXG4gIGFzeW5jIGdldFJvb21EYXRhKGRvY2NvZGU6c3RyaW5nKXtcbiAgICBsZXQgW2VycixyZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKFxuICAgICAgd3guJGh0dHAucmVxdWVzdCh7XG4gICAgICAgIHVybDonL3Nob3BwaW5nL2xpdmUvZ2V0TGl2ZVJvb21MaXN0Rm9yTWUuZG8nLFxuICAgICAgICBkYXRhOntcbiAgICAgICAgICBkb2Njb2RlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvb21EYXRhID0gcmVzLmxpc3RbMF07XG4gICAgY29uc29sZS5sb2coJ+e8lui+keebtOaSremXtOOAguOAguOAgicscm9vbURhdGEuVHlwZS50b1N0cmluZygpLHJvb21EYXRhLlR5cGUpO1xuXG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIGFuY2hvck5hbWU6IHJvb21EYXRhLkFuY2hvck5hbWUsXG4gICAgICBhbmNob3JXZWNoYXQ6IHJvb21EYXRhLkFuY2hvcldlY2hhdCxcbiAgICAgIHN1YkFuY2hvcldlY2hhdDogcm9vbURhdGEuU3ViQW5jaG9yV2VjaGF0LFxuICAgICAgcm9vbVRpdGxlOiByb29tRGF0YS5Sb29tTmFtZSxcbiAgICAgIHNjcmVlblR5cGU6IHJvb21EYXRhLlNjcmVlblR5cGUsXG4gICAgICBpc0ZlZWRzUHVibGljOiByb29tRGF0YS5pc0ZlZWRzUHVibGljLFxuICAgICAgaXNTaG93SW5Ib21lcGFnZTpyb29tRGF0YS5pc1Nob3dCYW5uZXJQaG90b09uSG9tZVBhZ2UsXG4gICAgICB0eXBlOnJvb21EYXRhLlR5cGUudG9TdHJpbmcoKXx8JzAnLFxuICAgICAgc3RhcnREYXRlOnRoaXMuZ2V0VGltZU1TKHJvb21EYXRhLlN0YXJ0VGltZSksXG4gICAgICBlbmREYXRlOnRoaXMuZ2V0VGltZU1TKHJvb21EYXRhLkVuZFRpbWUpLFxuICAgICAgc3RhcnRUaW1lOnJvb21EYXRhLlN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWU6cm9vbURhdGEuRW5kVGltZSxcbiAgICAgIGRvY2NvZGU6cm9vbURhdGEuRG9jQ29kZSxcbiAgICAgIHNoYXJlSW1nOnJvb21EYXRhLlNoYXJlSW1nVW5pZFVybHx8JycsXG4gICAgICBjb3ZlckltZzpyb29tRGF0YS5Db3ZlckltZ1VuaWRVcmx8fCcnLFxuICAgICAgZmVlZHNJbWc6cm9vbURhdGEuRmVlZHNJbWdVbmlkVXJsfHwnJyxcbiAgICAgIGJhbm5lclBob3RvOnJvb21EYXRhLkJhbm5lclBob3RvfHwnJyxcbiAgICAgIGlzTGlrZTogIXJvb21EYXRhLmlzQ2xvc2VMaWtlLFxuICAgICAgaXNDb21tZW50OiAhcm9vbURhdGEuaXNDbG9zZUNvbW1lbnQsXG4gICAgICBpc0dvb2RzOiAhcm9vbURhdGEuaXNDbG9zZUdvb2RzLFxuICAgICAgaXNTaGFyZTogIXJvb21EYXRhLmlzQ2xvc2VTaGFyZSxcbiAgICAgIGlzUmVwbGF5OiAhcm9vbURhdGEuaXNDbG9zZVJlcGxheSxcbiAgICB9KVxuICB9LFxuICAvKipcbiAgICog55Sf5ZG95ZGo5pyf5Ye95pWwLS3nm5HlkKzpobXpnaLliqDovb1cbiAgICovXG4gIG9uTG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB3eC4kaHR0cC5yZXF1ZXN0KHtcbiAgICAgIHVybDonL3Nob3BwaW5nL2FjY291bnQuZG8/bT1hY2NvdW50SW5mbycsXG4gICAgfSkudGhlbigocmVzOmFueSk9PntcbiAgICAgIGNvbnNvbGUubG9nKCfojrflj5bnlKjmiLfkv6Hmga8nLHJlcyk7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBIZWFkSW1nVXJsOnJlcy5Vc2VySW5mby5IZWFkSW1nVXJsXG4gICAgICB9KVxuICAgIH0pXG4gICAgbGV0IGRvY2NvZGUgPSBvcHRpb25zLmRvY2NvZGUgfHwgJyc7XG4gICAgaWYgKGRvY2NvZGUpIHtcbiAgICAgIHRoaXMuZ2V0Um9vbURhdGEoZG9jY29kZSk7XG4gICAgfVxuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBpc1Nob3dCYW5uZXJPbkhvbWVQYWdlOmFwcC5nbG9iYWxEYXRhLmlzU2hvd0Jhbm5lclBob3RvT25Ib21lUGFnZUZvckxpdmVVc2VyXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICog55Sf5ZG95ZGo5pyf5Ye95pWwLS3nm5HlkKzpobXpnaLliJ3mrKHmuLLmn5PlrozmiJBcbiAgICovXG4gIG9uUmVhZHk6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIC8qKlxuICAgKiDnlJ/lkb3lkajmnJ/lh73mlbAtLeebkeWQrOmhtemdouaYvuekulxuICAgKi9cbiAgb25TaG93OiBmdW5jdGlvbiAoKSB7fSxcblxuICAvKipcbiAgICog55Sf5ZG95ZGo5pyf5Ye95pWwLS3nm5HlkKzpobXpnaLpmpDol49cbiAgICovXG4gIG9uSGlkZTogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOeUn+WRveWRqOacn+WHveaVsC0t55uR5ZCs6aG16Z2i5Y246L29XG4gICAqL1xuICBvblVubG9hZDogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOmhtemdouebuOWFs+S6i+S7tuWkhOeQhuWHveaVsC0t55uR5ZCs55So5oi35LiL5ouJ5Yqo5L2cXG4gICAqL1xuICBvblB1bGxEb3duUmVmcmVzaDogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOmhtemdouS4iuaLieinpuW6leS6i+S7tueahOWkhOeQhuWHveaVsFxuICAgKi9cbiAgb25SZWFjaEJvdHRvbTogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eCueWHu+WPs+S4iuinkuWIhuS6q1xuICAgKi9cbiAgLy8gb25TaGFyZUFwcE1lc3NhZ2U6IGZ1bmN0aW9uICgpIHtcblxuICAvLyB9XG59KTtcblxuZXhwb3J0IHt9XG4iXX0=