123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Api = (function () {
- function Api() {
- this.configOption = { ver: 1, versionName: 'v1.0.0', baseUrl: 'http://192.168.10.41:8003' };
- this.key = '';
- this.token = '';
- this.tokenValidCallback = function () { };
- }
- Api.prototype.version = function () {
- return this.configOption.versionName;
- };
- Api.prototype.init = function (config) {
- this.configOption = config;
- };
- Api.prototype.initBaseUrl = function (baseUrl) {
- this.configOption.baseUrl = baseUrl.replace(':443', '');
- console.log("initBaseUri:" + this.configOption.baseUrl);
- };
- Api.prototype.configAuthorize = function (key, token) {
- this.key = key;
- this.token = token;
- };
- Api.prototype.setTokenValidCallback = function (callback) {
- this.tokenValidCallback = callback;
- };
- Api.prototype.checkQrcode = function (secret) {
- var _this = this;
- var that = this;
- return new Promise(function (resolve, reject) {
- return _this.postRequest({
- url: '/api/ecs_oe_student/examControl/checkQrCode',
- parameter: {
- qrCode: secret
- }
- }, false).then(function (res) {
- console.log('then');
- if (res.key && res.token) {
- that.configAuthorize(res.key, res.token);
- var result = {
- courseId: res.courseId,
- courseName: res.courseName,
- examRecordDataId: res.examRecordDataId,
- examStudentId: res.examStudentId,
- questionMainNumber: res.questionMainNumber,
- questionOrder: res.questionOrder,
- subNumber: res.subNumber
- };
- resolve(result);
- }
- else {
- reject('二维码已失效');
- }
- }, function (error) {
- reject(error);
- }).catch(function (exceptions) {
- reject(exceptions);
- });
- });
- };
- Api.prototype.getPaperStruct = function (examRecordDataId) {
- var _this = this;
- return new Promise(function (resovle, reject) {
- return _this.getRequest({
- url: '/api/ecs_oe_student/examRecordPaperStruct/getExamRecordPaperStruct',
- parameter: {
- examRecordDataId: examRecordDataId
- }
- }).then(function (res) {
- resovle(res);
- }, function (error) {
- reject(error);
- }).catch(function (exceptions) {
- reject(exceptions);
- });
- });
- };
- Api.prototype.getSign = function (examRecordDataId, examStudentId, order, fileMd5, suffix) {
- var _this = this;
- return new Promise(function (resolve, reject) {
- return _this.postRequest({
- url: '/api/ecs_oe_student/examControl/yunSignature',
- parameter: {
- examRecordDataId: examRecordDataId,
- examStudentId: examStudentId,
- order: order,
- fileMd5: fileMd5,
- fileSuffix: suffix
- }
- }).then(function (res) {
- var result = {
- accessUrl: res.accessUrl,
- formUrl: res.formUrl,
- fsType: res.fsType,
- uploadUrl: res.uploadUrl,
- formParams: res.formParams,
- signIdentifier: res.signIdentifier,
- };
- resolve(result);
- }, function (error) {
- reject(error);
- });
- });
- };
- Api.prototype.uploadFile = function (filePath, formParams, uploadUrl) {
- return new Promise(function (resolve, reject) {
- wx.uploadFile({
- url: uploadUrl,
- filePath: filePath,
- name: 'file',
- formData: formParams,
- success: function (res) {
- resolve(res);
- },
- fail: function (error) {
- if (error.errMsg == 'uploadFile:fail url not in domain list') {
- reject('请点击右上角"•••"按钮开启调试模式');
- }
- else {
- reject(error.errMsg);
- }
- }
- });
- });
- };
- Api.prototype.notifyServer = function (examRecordDataId, examStudentId, order, filePath, transferFileType) {
- var _this = this;
- return new Promise(function (resovle, reject) {
- return _this.postRequest({
- url: '/api/ecs_oe_student/examControl/saveUploadedFile',
- parameter: {
- examRecordDataId: examRecordDataId,
- examStudentId: examStudentId,
- order: order,
- filePath: filePath,
- transferFileType: transferFileType
- }
- }).then(function (res) {
- resovle(res);
- }, function (error) {
- console.log('===================');
- reject(error);
- }).catch(function (exceptions) {
- console.log('===================');
- reject(exceptions);
- });
- });
- };
- Api.prototype.getNotifyResult = function (acknowledgeId) {
- var _this = this;
- return new Promise(function (resovle, reject) {
- return _this.postRequest({
- url: '/api/ecs_oe_student/examControl/getUploadedFileAcknowledgeStatus',
- parameter: {
- acknowledgeId: acknowledgeId
- }
- }).then(function (res) {
- resovle(res);
- }, function (error) {
- reject(error);
- }).catch(function (exceptions) {
- reject(exceptions);
- });
- });
- };
- Api.prototype.getUploadedAudioAnswerList = function (examRecordDataId) {
- var _this = this;
- return new Promise(function (resolve, reject) {
- return _this.postRequest({
- url: '/api/ecs_oe_student/examControl/getUploadedAudioAnswerList',
- parameter: {
- examRecordDataId: examRecordDataId
- }
- }).then(function (res) {
- resolve(res);
- }, function (error) {
- reject(error);
- }).catch(function (e) {
- reject(e);
- });
- });
- };
- Api.prototype.getRequest = function (option, auth) {
- if (auth === void 0) { auth = true; }
- var that = this;
- var header = auth ? {
- 'Content-Type': 'application/x-www-form-urlencoded',
- key: that.key,
- token: that.token
- } : {
- 'Content-Type': 'application/x-www-form-urlencoded',
- };
- return new Promise(function (resolve, reject) {
- wx.request({
- url: that.configOption.baseUrl + option.url,
- method: 'GET',
- header: header,
- data: option.parameter,
- success: function (res) {
- console.log("request success", res);
- if (that.isTokenInValidCode(res.statusCode)) {
- reject('token失效');
- if (that.tokenValidCallback) {
- that.tokenValidCallback();
- }
- }
- else if (res.statusCode !== 200) {
- reject(res.data.desc);
- }
- else {
- resolve(res.data);
- }
- },
- fail: function (res) {
- console.log("request fail", res);
- if (res.errMsg == 'request:fail url not in domain list') {
- reject('请点击右上角"•••"按钮开启调试模式');
- }
- else if (res.errMsg == 'request:fail ') {
- reject("网络请求失败");
- }
- else {
- reject(res.errMsg);
- }
- }
- });
- });
- };
- Api.prototype.postRequest = function (option, auth) {
- if (auth === void 0) { auth = true; }
- var that = this;
- var header = auth ? {
- 'Content-Type': 'application/x-www-form-urlencoded',
- key: that.key,
- token: that.token
- } : {
- 'Content-Type': 'application/x-www-form-urlencoded',
- };
- console.log(that.configOption.baseUrl + option.url);
- console.log(option);
- return new Promise(function (resolve, reject) {
- wx.request({
- url: that.configOption.baseUrl + option.url,
- method: 'POST',
- header: header,
- data: option.parameter,
- success: function (res) {
- console.log("request success", res);
- if (that.isTokenInValidCode(res.statusCode)) {
- reject('token失效');
- if (that.tokenValidCallback) {
- that.tokenValidCallback();
- }
- }
- else if (res.statusCode == 503) {
- that._postRequest(option, auth, 0, resolve, reject);
- }
- else if (res.statusCode !== 200) {
- reject(res.data.desc);
- }
- else {
- resolve(res.data);
- }
- },
- fail: function (res) {
- console.log("request fail", res);
- if (res.errMsg == 'request:fail url not in domain list') {
- reject('请点击右上角"•••"按钮开启调试模式');
- }
- else if (res.errMsg == 'request:fail ') {
- reject("网络请求失败");
- }
- else {
- reject(res.errMsg);
- }
- }
- });
- });
- };
- Api.prototype._postRequest = function (option, auth, retry, resolve, reject) {
- if (auth === void 0) { auth = true; }
- if (retry === void 0) { retry = 0; }
- var that = this;
- var header = auth ? {
- 'Content-Type': 'application/x-www-form-urlencoded',
- key: that.key,
- token: that.token
- } : {
- 'Content-Type': 'application/x-www-form-urlencoded',
- };
- console.log(option);
- if (retry > 0) {
- console.log('正在重试' + retry);
- }
- wx.request({
- url: that.configOption.baseUrl + option.url,
- method: 'POST',
- header: header,
- data: option.parameter,
- success: function (res) {
- console.log("request success", res);
- if (that.isTokenInValidCode(res.statusCode)) {
- reject('token失效');
- if (that.tokenValidCallback) {
- that.tokenValidCallback();
- }
- }
- else if (res.statusCode == 503) {
- if (retry < 10) {
- console.log('200ms重试');
- setTimeout(function () {
- that._postRequest(option, auth, retry + 1, resolve, reject);
- }, 200);
- }
- else {
- reject('服务器繁忙,请稍后重试!');
- }
- }
- else if (res.statusCode !== 200) {
- reject(res.data.desc);
- }
- else {
- resolve(res.data);
- }
- },
- fail: function (res) {
- console.log("request fail", res);
- if (res.errMsg == 'request:fail url not in domain list') {
- reject('请点击右上角"•••"按钮开启调试模式');
- }
- else if (res.errMsg == 'request:fail ') {
- reject("网络请求失败");
- }
- else {
- reject(res.errMsg);
- }
- }
- });
- };
- Api.prototype.isTokenInValidCode = function (code) {
- return code === 401 || code === 403;
- };
- return Api;
- }());
- exports.Api = Api;
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUhBO0lBQUE7UUFRRSxpQkFBWSxHQUFvQixFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQTtRQUM3RixRQUFHLEdBQVcsRUFBRSxDQUFBO1FBQ2hCLFVBQUssR0FBVyxFQUFFLENBQUE7UUFDbEIsdUJBQWtCLEdBQXVCLGNBQU8sQ0FBQyxDQUFBO0lBZ1Y3RCxDQUFDO0lBOVVHLHFCQUFPLEdBQVA7UUFDSSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFBO0lBQ3hDLENBQUM7SUFFRCxrQkFBSSxHQUFKLFVBQUssTUFBdUI7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUE7SUFDOUIsQ0FBQztJQUVELHlCQUFXLEdBQVgsVUFBWSxPQUFlO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQVFELDZCQUFlLEdBQWYsVUFBZ0IsR0FBVyxFQUFFLEtBQWE7UUFDdEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN0QixDQUFDO0lBRUQsbUNBQXFCLEdBQXJCLFVBQXNCLFFBQTRCO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUE7SUFDdEMsQ0FBQztJQUVELHlCQUFXLEdBQVgsVUFBWSxNQUFjO1FBQTFCLGlCQWlDQztRQWhDRyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7UUFDakIsT0FBTyxJ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QUFDLElBQUksQ0FBQyxDQUFBO2lCQUNwQjtZQUNMLENBQUM7WUFDRCxJQUFJLEVBQUUsVUFBVSxHQUFHO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUkscUNBQXFDLEVBQUU7b0JBQ3JELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO2lCQUNoQztxQkFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksZUFBZSxFQUFFO29CQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3RCO1lBQ0wsQ0FBQztTQUNKLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFTyxnQ0FBa0IsR0FBMUIsVUFBMkIsSUFBWTtRQUNuQyxPQUFPLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQTtJQUN2QyxDQUFDO0lBQ0wsVUFBQztBQUFELENBQUMsQUEzVkQsSUEyVkM7QUEzVlksa0JBQUciLCJzb3VyY2VzQ29udGVudCI6WyIvLy88cmVmZXJlbmNlIHBhdGg9XCIuLi90eXBpbmdzL3d4L2xpYi53eC5hcGkuZC50c1wiLz5cclxuXHJcbmRlY2xhcmUgbmFtZXNwYWNlIHRvb2xzIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRW50aXR5IHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBSZXN1bHQ8VCBleHRlbmRzIEVudGl0eT4ge1xyXG4gICAgICAgIGNvZGU/OiBudW1iZXIgfCBzdHJpbmcsXHJcbiAgICAgICAgZGVzYz86IHN0cmluZyxcclxuICAgICAgICBkYXRhPzogVCB8IFRbXVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVXB5dW5SZXN1bHQge1xyXG4gICAgICAgIGNvZGU6IG51bWJlcixcclxuICAgICAgICBtZXNzYWdlPzogc3RyaW5nLFxyXG4gICAgICAgIHRpbWU6IG51bWJlcixcclxuICAgICAgICB1cmw6IHN0cmluZ1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tRclJlc3VsdCBleHRlbmRzIEVudGl0eSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6K++56iLSURcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb3Vyc2VJZDogbnVtYmVyLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOivvueoi+WQjeensFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvdXJzZU5hbWU6IHN0cmluZyxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDogIPor5XorrDlvZVEYXRhSURcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ICD55SfSURcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGFtU3R1ZGVudElkOiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ICD6K+V6K+V6aKY5aSn6aKY5Y+3XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcXVlc3Rpb25NYWluTnVtYmVyOiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ICD6K+V6K+V6aKY6aKY5bqPXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcXVlc3Rpb25PcmRlcjogbnVtYmVyLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOeZu+W9leS/oeaBr2tleVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGtleTogc3RyaW5nLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOeZu+W9leS/oeaBr3Rva2VuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9rZW46IHN0cmluZyxcclxuXHJcbiAgICAgICAgc3ViTnVtYmVyOiBudW1iZXIsXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBTaWduUmVzdWx0IGV4dGVuZHMgRW50aXR5IHtcclxuICAgICAgICBhY2Nlc3NVcmw6IHN0cmluZyxcclxuICAgICAgICBmb3JtVXJsOiBzdHJpbmcsXHJcbiAgICAgICAgZnNUeXBlOiBzdHJpbmcsXHJcbiAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmcsXHJcbiAgICAgICAgZm9ybVBhcmFtczogb2JqZWN0LFxyXG4gICAgICAgIHNpZ25JZGVudGlmaWVyOiBzdHJpbmdcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIE5vdGlmeVJlc3VsdCBleHRlbmRzIEVudGl0eSB7XHJcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZyxcclxuICAgICAgICByZXN1bHQ6IGJvb2xlYW5cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF1ZGlvQW5zd2VyIGV4dGVuZHMgRW50aXR5IHtcclxuICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIsXHJcbiAgICAgICAgbWFpbk51bWJlcjogbnVtYmVyLFxyXG4gICAgICAgIG9yZGVyOiBudW1iZXIsXHJcbiAgICAgICAgc3R1ZGVudEFuc3dlcjogc3RyaW5nLFxyXG4gICAgICAgIHN1Yk51bWJlcjogc3RyaW5nXHJcbiAgICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBBcGlDb25maWdPcHRpb24ge1xyXG4gICAgdmVyOiBudW1iZXIsXHJcbiAgICB2ZXJzaW9uTmFtZTogc3RyaW5nLFxyXG4gICAgYmFzZVVybDogc3RyaW5nXHJcbn1cclxuXHJcbmludGVyZmFjZSBSZXF1ZXN0T3B0aW9uIHtcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgcGFyYW1ldGVyOiBhbnlcclxufVxyXG5cclxudHlwZSBUb2tlblZhbGlkQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xyXG5cclxuaW50ZXJmYWNlIEFQSSB7XHJcbiAgICBjb25maWdPcHRpb246IEFwaUNvbmZpZ09wdGlvblxyXG4gICAgdmVyc2lvbigpOiBzdHJpbmdcclxuICAgIHNldFRva2VuVmFsaWRDYWxsYmFjayhjYWxsYmFjazogVG9rZW5WYWxpZENhbGxiYWNrKTogdm9pZFxyXG5cclxuICAgIGNoZWNrUXJjb2RlKHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTx0b29scy5DaGVja1FyUmVzdWx0PlxyXG5cclxuICAgIGdldFBhcGVyU3RydWN0KGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlcikgOiBQcm9taXNlPGFueT5cclxuXHJcbiAgICBnZXRTaWduKGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlciwgZXhhbVN0dWRlbnRJZDogbnVtYmVyLCBvcmRlcjogbnVtYmVyLCBmaWxlTWQ1OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSA6IFByb21pc2U8dG9vbHMuU2lnblJlc3VsdD5cclxuXHJcbiAgICB1cGxvYWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZvcm1QYXJhbXM6IG9iamVjdCwgdXBsb2FkVXJsOiBzdHJpbmcpIDogUHJvbWlzZTx0b29scy5VcHl1blJlc3VsdD5cclxuXHJcbiAgICBub3RpZnlTZXJ2ZXIoZXhhbVJlY29yZERhdGFJZDogbnVtYmVyLCBleGFtU3R1ZGVudElkOiBudW1iZXIsIG9yZGVyOiBudW1iZXIsIGZpbGVQYXRoOiBzdHJpbmcsIHRyYW5zZmVyRmlsZVR5cGU6IHN0cmluZykgOiBQcm9taXNlPHN0cmluZz5cclxuXHJcbiAgICBnZXROb3RpZnlSZXN1bHQoYWNrbm93bGVkZ2VJZDogc3RyaW5nKSA6IFByb21pc2U8Ym9vbGVhbj5cclxuXHJcbiAgICBnZXRVcGxvYWRlZEF1ZGlvQW5zd2VyTGlzdChleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIpIDogUHJvbWlzZTx0b29scy5BdWRpb0Fuc3dlcltdPlxyXG5cclxuICAgIGdldFJlcXVlc3Qob3B0aW9uOiBSZXF1ZXN0T3B0aW9uLCBhdXRoOiBib29sZWFuKTogUHJvbWlzZTxhbnk+XHJcblxyXG4gICAgcG9zdFJlcXVlc3Qob3B0aW9uOiBSZXF1ZXN0T3B0aW9uLCBhdXRoOiBib29sZWFuKTogUHJvbWlzZTxhbnk+XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBcGkgaW1wbGVtZW50cyBBUEkge1xyXG4gICAgLy9lY3MucW10aC5jb20uY246ODg3OFxyXG4gICAgLy9odHRwOi8vMTkyLjE2OC4xMC4zOTo4MDAzXHJcbiAgICAvL2h0dHBzOi8vZWNzLnFtdGguY29tLmNuOjg4NzhcclxuICAgIC8vZWNzLXRlc3QucW10aC5jb20uY25cclxuICAgIC8vaHR0cDovL2Vjcy1kZXYucW10aC5jb20uY25cclxuICAgIC8vJ2h0dHBzOi8vb3JnMC5lYTEwMC5jb20uY24nXHJcbiAgICAvL2h0dHBzOi8vZWNzLXRlc3QuZWExMDAuY29tLmNuICBodHRwczovL2Vjcy10ZXN0LmVhMTAwLmNvbS5jblxyXG4gIGNvbmZpZ09wdGlvbjogQXBpQ29uZmlnT3B0aW9uID0geyB2ZXI6IDEsIHZlcnNpb25OYW1lOiAndjEuMC4wJywgYmFzZVVybDogJ2h0dHA6Ly8xOTIuMTY4LjEwLjQxOjgwMDMnIH1cclxuICAgIHByaXZhdGUga2V5OiBzdHJpbmcgPSAnJ1xyXG4gICAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nID0gJydcclxuICAgIHByaXZhdGUgdG9rZW5WYWxpZENhbGxiYWNrOiBUb2tlblZhbGlkQ2FsbGJhY2sgPSAoKSA9PiB7fVxyXG5cclxuICAgIHZlcnNpb24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdPcHRpb24udmVyc2lvbk5hbWVcclxuICAgIH1cclxuXHJcbiAgICBpbml0KGNvbmZpZzogQXBpQ29uZmlnT3B0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWdPcHRpb24gPSBjb25maWdcclxuICAgIH1cclxuXHJcbiAgICBpbml0QmFzZVVybChiYXNlVXJsOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ09wdGlvbi5iYXNlVXJsID0gYmFzZVVybC5yZXBsYWNlKCc6NDQzJywgJycpXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJpbml0QmFzZVVyaTpcIiArIHRoaXMuY29uZmlnT3B0aW9uLmJhc2VVcmwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjojmnYPmiJDlip/lkI7phY3nva5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1aWRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhcnRpdGlvbklkXHJcbiAgICAgKi9cclxuICAgIGNvbmZpZ0F1dGhvcml6ZShrZXk6IHN0cmluZywgdG9rZW46IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMua2V5ID0ga2V5XHJcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VG9rZW5WYWxpZENhbGxiYWNrKGNhbGxiYWNrOiBUb2tlblZhbGlkQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRva2VuVmFsaWRDYWxsYmFjayA9IGNhbGxiYWNrXHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tRcmNvZGUoc2VjcmV0OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHRvb2xzLkNoZWNrUXJSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FwaS9lY3Nfb2Vfc3R1ZGVudC9leGFtQ29udHJvbC9jaGVja1FyQ29kZScsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBxckNvZGU6IHNlY3JldFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBmYWxzZSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoZW4nKVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5rZXkgJiYgcmVzLnRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5jb25maWdBdXRob3JpemUocmVzLmtleSwgcmVzLnRva2VuKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBtb2RlbCB0cmFuc2Zvcm1lclxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZUlkOiByZXMuY291cnNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZU5hbWU6IHJlcy5jb3Vyc2VOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiByZXMuZXhhbVJlY29yZERhdGFJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbVN0dWRlbnRJZDogcmVzLmV4YW1TdHVkZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uTWFpbk51bWJlcjogcmVzLnF1ZXN0aW9uTWFpbk51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25PcmRlcjogcmVzLnF1ZXN0aW9uT3JkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk51bWJlcjogcmVzLnN1Yk51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKChyZXN1bHQgYXMgdG9vbHMuQ2hlY2tRclJlc3VsdCkpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgn5LqM57u056CB5bey5aSx5pWIJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICAgICAgICB9KS5jYXRjaCggZXhjZXB0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXhjZXB0aW9ucylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFBhcGVyU3RydWN0KGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlcikgOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb3ZsZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FwaS9lY3Nfb2Vfc3R1ZGVudC9leGFtUmVjb3JkUGFwZXJTdHJ1Y3QvZ2V0RXhhbVJlY29yZFBhcGVyU3RydWN0JyxcclxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4YW1SZWNvcmREYXRhSWQ6IGV4YW1SZWNvcmREYXRhSWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkudGhlbiggcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc292bGUocmVzKVxyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKCBleGNlcHRpb25zID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChleGNlcHRpb25zKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbihleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIsIGV4YW1TdHVkZW50SWQ6IG51bWJlciwgb3JkZXI6IG51bWJlciwgZmlsZU1kNTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgOiBQcm9taXNlPHRvb2xzLlNpZ25SZXN1bHQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dG9vbHMuU2lnblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL2Vjc19vZV9zdHVkZW50L2V4YW1Db250cm9sL3l1blNpZ25hdHVyZScsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiBleGFtUmVjb3JkRGF0YUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4YW1TdHVkZW50SWQ6IGV4YW1TdHVkZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IG9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVNZDU6IGZpbGVNZDUsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVN1ZmZpeDogc3VmZml4XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzVXJsOiByZXMuYWNjZXNzVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Vcmw6IHJlcy5mb3JtVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZzVHlwZTogcmVzLmZzVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRVcmw6IHJlcy51cGxvYWRVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybVBhcmFtczogcmVzLmZvcm1QYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgICAgc2lnbklkZW50aWZpZXI6IHJlcy5zaWduSWRlbnRpZmllcixcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGxvYWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZvcm1QYXJhbXM6IG9iamVjdCwgdXBsb2FkVXJsOiBzdHJpbmcpIDogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB3eC51cGxvYWRGaWxlKHtcclxuICAgICAgICAgICAgICAgIHVybDogdXBsb2FkVXJsLFxyXG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybURhdGE6IGZvcm1QYXJhbXMsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWw6IGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuZXJyTXNnID09ICd1cGxvYWRGaWxlOmZhaWwgdXJsIG5vdCBpbiBkb21haW4gbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCfor7fngrnlh7vlj7PkuIrop5JcIuKAouKAouKAolwi5oyJ6ZKu5byA5ZCv6LCD6K+V5qih5byPJylcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IuZXJyTXNnKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbm90aWZ5U2VydmVyKGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlciwgZXhhbVN0dWRlbnRJZDogbnVtYmVyLCBcclxuICAgICAgICBvcmRlcjogbnVtYmVyLCBmaWxlUGF0aDogc3RyaW5nLCB0cmFuc2ZlckZpbGVUeXBlOiBzdHJpbmcpIDogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc292bGUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL2Vjc19vZV9zdHVkZW50L2V4YW1Db250cm9sL3NhdmVVcGxvYWRlZEZpbGUnLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhhbVJlY29yZERhdGFJZDogZXhhbVJlY29yZERhdGFJZCxcclxuICAgICAgICAgICAgICAgICAgICBleGFtU3R1ZGVudElkOiBleGFtU3R1ZGVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiBvcmRlcixcclxuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogZmlsZVBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlVHlwZTogdHJhbnNmZXJGaWxlVHlwZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS50aGVuKCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb3ZsZShyZXMpXHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09JylcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcclxuICAgICAgICAgICAgfSkuY2F0Y2goIGV4Y2VwdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT0nKVxyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGV4Y2VwdGlvbnMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXROb3RpZnlSZXN1bHQoYWNrbm93bGVkZ2VJZDogc3RyaW5nKSA6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvdmxlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FwaS9lY3Nfb2Vfc3R1ZGVudC9leGFtQ29udHJvbC9nZXRVcGxvYWRlZEZpbGVBY2tub3dsZWRnZVN0YXR1cycsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBhY2tub3dsZWRnZUlkOiBhY2tub3dsZWRnZUlkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnRoZW4oIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvdmxlKHJlcylcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICAgICAgICB9KS5jYXRjaCggZXhjZXB0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXhjZXB0aW9ucylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFVwbG9hZGVkQXVkaW9BbnN3ZXJMaXN0KGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlcikgOiBQcm9taXNlPHRvb2xzLkF1ZGlvQW5zd2VyW10+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL2Vjc19vZV9zdHVkZW50L2V4YW1Db250cm9sL2dldFVwbG9hZGVkQXVkaW9BbnN3ZXJMaXN0JyxcclxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4YW1SZWNvcmREYXRhSWQ6IGV4YW1SZWNvcmREYXRhSWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkudGhlbiggcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzIGFzIHRvb2xzLkF1ZGlvQW5zd2VyW10pXHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcclxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFJlcXVlc3Qob3B0aW9uOiBSZXF1ZXN0T3B0aW9uLCBhdXRoOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXNcclxuICAgICAgICBjb25zdCBoZWFkZXIgPSBhdXRoID8ge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgICAgICAgIGtleTogdGhhdC5rZXksXHJcbiAgICAgICAgICAgIHRva2VuOiB0aGF0LnRva2VuXHJcbiAgICAgICAgfSA6IHtcclxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgIHVybDogdGhhdC5jb25maWdPcHRpb24uYmFzZVVybCArIG9wdGlvbi51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBoZWFkZXIsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24ucGFyYW1ldGVyLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlcXVlc3Qgc3VjY2Vzc1wiLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LmlzVG9rZW5JblZhbGlkQ29kZShyZXMuc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCd0b2tlbuWkseaViCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2Vu5aSx5pWIXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LnRva2VuVmFsaWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC50b2tlblZhbGlkQ2FsbGJhY2soKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgocmVzLmRhdGEgYXMgdG9vbHMuUmVzdWx0PGFueT4pLmRlc2MpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVxdWVzdCBmYWlsXCIsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5lcnJNc2cgPT0gJ3JlcXVlc3Q6ZmFpbCB1cmwgbm90IGluIGRvbWFpbiBsaXN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+ivt+eCueWHu+WPs+S4iuinklwi4oCi4oCi4oCiXCLmjInpkq7lvIDlkK/osIPor5XmqKHlvI8nKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmVyck1zZyA9PSAncmVxdWVzdDpmYWlsICcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwi572R57uc6K+35rGC5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXMuZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwb3N0UmVxdWVzdChvcHRpb246IFJlcXVlc3RPcHRpb24sIGF1dGg6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpc1xyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGF1dGggPyB7XHJcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcclxuICAgICAgICAgICAga2V5OiB0aGF0LmtleSxcclxuICAgICAgICAgICAgdG9rZW46IHRoYXQudG9rZW5cclxuICAgICAgICB9IDoge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoYXQuY29uZmlnT3B0aW9uLmJhc2VVcmwgKyBvcHRpb24udXJsKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhvcHRpb24pXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHRoYXQuY29uZmlnT3B0aW9uLmJhc2VVcmwgKyBvcHRpb24udXJsLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IGhlYWRlcixcclxuICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbi5wYXJhbWV0ZXIsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVxdWVzdCBzdWNjZXNzXCIsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaXNUb2tlbkluVmFsaWRDb2RlKHJlcy5zdGF0dXNDb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3Rva2Vu5aSx5pWIJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW7lpLHmlYhcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQudG9rZW5WYWxpZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnRva2VuVmFsaWRDYWxsYmFjaygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXNDb2RlID09IDUwMykgeyAvL+aOpeWPo+mZkOa1ge+8jOiHquWKqOmHjeivlVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wb3N0UmVxdWVzdChvcHRpb24sIGF1dGgsIDAsIHJlc29sdmUsIHJlamVjdClcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KChyZXMuZGF0YSBhcyB0b29scy5SZXN1bHQ8YW55PikuZGVzYylcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXF1ZXN0IGZhaWxcIiwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PSAncmVxdWVzdDpmYWlsIHVybCBub3QgaW4gZG9tYWluIGxpc3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgn6K+354K55Ye75Y+z5LiK6KeSXCLigKLigKLigKJcIuaMiemSruW8gOWQr+iwg+ivleaooeW8jycpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJyTXNnID09ICdyZXF1ZXN0OmZhaWwgJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCLnvZHnu5zor7fmsYLlpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIF9wb3N0UmVxdWVzdChvcHRpb246IFJlcXVlc3RPcHRpb24sIGF1dGg6IGJvb2xlYW4gPSB0cnVlLCByZXRyeTogbnVtYmVyID0gMCwgcmVzb2x2ZTogKHZhbHVlPzogYW55IHwgUHJvbWlzZUxpa2U8YW55PikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXNcclxuICAgICAgICBjb25zdCBoZWFkZXIgPSBhdXRoID8ge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgICAgICAgIGtleTogdGhhdC5rZXksXHJcbiAgICAgICAgICAgIHRva2VuOiB0aGF0LnRva2VuXHJcbiAgICAgICAgfSA6IHtcclxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhvcHRpb24pXHJcbiAgICAgICAgaWYgKHJldHJ5ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygn5q2j5Zyo6YeN6K+VJytyZXRyeSlcclxuICAgICAgICB9XHJcbiAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgIHVybDogdGhhdC5jb25maWdPcHRpb24uYmFzZVVybCArIG9wdGlvbi51cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGhlYWRlcixcclxuICAgICAgICAgICAgZGF0YTogb3B0aW9uLnBhcmFtZXRlcixcclxuICAgICAgICAgICAgc3VjY2VzczogcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVxdWVzdCBzdWNjZXNzXCIsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5pc1Rva2VuSW5WYWxpZENvZGUocmVzLnN0YXR1c0NvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCd0b2tlbuWkseaViCcpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW7lpLHmlYhcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC50b2tlblZhbGlkQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC50b2tlblZhbGlkQ2FsbGJhY2soKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1c0NvZGUgPT0gNTAzKSB7IC8v5o6l5Y+j6ZmQ5rWB77yM6Ieq5Yqo6YeN6K+VXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5IDwgMTApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJzIwMG1z6YeN6K+VJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wb3N0UmVxdWVzdChvcHRpb24sIGF1dGgsIHJldHJ5KzEsIHJlc29sdmUsIHJlamVjdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+acjeWKoeWZqOe5geW/me+8jOivt+eojeWQjumHjeivle+8gScpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KChyZXMuZGF0YSBhcyB0b29scy5SZXN1bHQ8YW55PikuZGVzYylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZGF0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXF1ZXN0IGZhaWxcIiwgcmVzKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuZXJyTXNnID09ICdyZXF1ZXN0OmZhaWwgdXJsIG5vdCBpbiBkb21haW4gbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+ivt+eCueWHu+WPs+S4iuinklwi4oCi4oCi4oCiXCLmjInpkq7lvIDlkK/osIPor5XmqKHlvI8nKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJyTXNnID09ICdyZXF1ZXN0OmZhaWwgJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIue9kee7nOivt+axguWksei0pVwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVG9rZW5JblZhbGlkQ29kZShjb2RlOiBudW1iZXIpIDogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGNvZGUgPT09IDQwMSB8fCBjb2RlID09PSA0MDNcclxuICAgIH1cclxufSAiXX0=
|