Greasy Fork

Greasy Fork is available in English.

好大学在线 助手

.

当前为 2017-11-24 提交的版本,查看 最新版本

  // ==UserScript==
  // @name         好大学在线 助手
  // @namespace    https://github.com/ShenHongFei/cnmooc-assistant
  // @homepage     https://github.com/ShenHongFei/cnmooc-assistant
  // @author       沈鸿飞
  // @description  .
  // @version      2017.11.24.03.19
  // @match        http://www.cnmooc.org/study/initplay/*.mooc
  // @match        http://www.cnmooc.org/study/unit/*.mooc
  // @run-at       document-idle
  // ==/UserScript==


  // 满分批阅当前 mark()
var add_button, answers, assistant_api, assistant_div, auto_fill, complete_item, fun, get_quiz_answers, mark, mark_all, name, options, pause_quiz_timer, print_answers, questions, test_answer, unblock_video_progress,
  indexOf = [].indexOf;

mark = async function() {
  $('input[id^=quiz_]').each(function(i, e) {
    var max_point;
    max_point = e.className.match(/max\[(\d+)\]/)[1];
    return e.setAttribute('value', max_point);
  });
  await sleep(200);
  $('#submitReviewBtn').click();
  await sleep(200);
  $("input[value='提交互评']").click();
  await sleep(200);
  return $("input[value='确定']").click();
};

// 满分批阅所有 mark_all()
mark_all = async function() {
  var i, j, results;
  $('#gotoReviewSubmitBtn').click();
  results = [];
  for (i = j = 1; j <= 3; i = ++j) {
    await sleep(700);
    results.push(mark());
  }
  return results;
};

// 完成该项
complete_item = function() {
  return updateStudyOver();
};

// 解锁视频进度
unblock_video_progress = function() {
  $('#isOver').val(2);
  return eval($(".video-show script").html());
};

// 暂停计时
pause_quiz_timer = function() {
  var useTimeFlag;
  if (typeof unsafeWindow !== 'undefined') {
    return unsafeWindow.useTimeFlag = false;
  } else {
    return useTimeFlag = false;
  }
};

// answers={question.quizId:[options(string)]}
answers = null;

questions = null;

options = null;

// async 修改自 doSubmitExam_ajax
test_answer = async function(questions) {
  var allRightFlag, gradeId, i, question, reSubmit, ret_data, score, totalScore, userQuiz2, user_Quiz, user_quizs;
  //处理每道题计时
  _quizUseTimeRecord[_quizIdRecord] = _quizUseTimeRecord[_quizIdRecord] || 0;
  _quizUseTimeRecord[_quizIdRecord] = parseInt(_quizUseTimeRecord[_quizIdRecord]) + _quizUseTime;
  user_quizs = (function() {
    var j, len, results;
    results = [];
    for (j = 0, len = questions.length; j < len; j++) {
      question = questions[j];
      results.push(JSON.stringify(question));
    }
    return results;
  })();
  reSubmit = $('#reSubmit').val();
  gradeId = $('#gradeId').val();
  userQuiz2 = [];
  totalScore = 0;
  allRightFlag = true;
  i = 0;
  while (i < user_quizs.length) {
    user_Quiz = JSON.parse(user_quizs[i]);
    user_Quiz['useTime'] = _quizUseTimeRecord[user_Quiz['quizId']];
    _quizUseTimeRecord[user_Quiz['quizId']] = 0;
    userQuiz2.push(JSON.stringify(user_Quiz));
    score = parseInt(user_Quiz['markQuizScore']);
    totalScore += score;
    if (score === 0) {
      allRightFlag = false;
    }
    i++;
  }
  if (allRightFlag) {
    totalScore = 10000;
  }
  user_quizs = userQuiz2;
  console.log(user_quizs);
  ret_data = (await $.when($.ajax({
    url: CONTEXTPATH + '/examSubmit/7681/saveExam/1/' + examPaperId + '/' + examSubmitId + '.mooc?testPaperId=' + examTestPaperId,
    type: 'post',
    data: {
      gradeId: gradeId,
      reSubmit: reSubmit,
      submitquizs: user_quizs,
      submitFlag: 0,
      useTime: 1,
      totalScore: totalScore,
      testPaperId: examTestPaperId
    },
    dataType: 'json',
    success: function(data) {
      if (!data.successFlag) {
        throw Error(data.successFlag = false);
      }
    },
    error: function() {
      return console.log('test_answer error');
    }
  })));
  return JSON.parse(ret_data.examSubmit.submitContent);
};

// async
get_quiz_answers = async function() {
  var current_round_option_ids, i, j, l, len, len1, len2, m, n, o, oi, option_id_flags, perfect_answer, qi, question, ref, result, test_result;
  // 初始化页面问题
  questions = (function() {
    var j, len, ref, results;
    ref = $('#exam_paper').quiz().getPractice();
    results = [];
    for (j = 0, len = ref.length; j < len; j++) {
      question = ref[j];
      results.push(JSON.parse(question));
    }
    return results;
  })();
  
  // 枚举、测试、更新答案
  options = $('[option_id]').map(function(i, e) {
    return e.getAttribute('option_id');
  });
  answers = {};
  ref = [1, 2, 4, 8, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15];
  for (j = 0, len = ref.length; j < len; j++) {
    oi = ref[j];
    option_id_flags = [];
    for (i = l = 0; l <= 3; i = ++l) {
      option_id_flags.push((oi << i & 0b1000) === 0b1000);
    }
    // 检测已有正确答案,对每一题生成答案,设置userAnswer
    for (qi = m = 0, len1 = questions.length; m < len1; qi = ++m) {
      question = questions[qi];
      perfect_answer = answers[question.quizId];
      if (perfect_answer) {
        question.userAnswer = perfect_answer.join(',');
      } else {
        current_round_option_ids = [];
        // option_id 并非连续
        for (i = n = 0; n <= 3; i = ++n) {
          if (option_id_flags[i]) {
            current_round_option_ids.push(options[qi * 4 + i]);
          }
        }
        question.userAnswer = current_round_option_ids.join(',');
      }
    }
    console.log(questions);
    // 枚举的答案准备完成,开始测试
    test_result = (await test_answer(questions));
    for (o = 0, len2 = test_result.length; o < len2; o++) {
      result = test_result[o];
      result = JSON.parse(result);
      if (result.markResult) {
        // perfect_options=(parseInt option for option in result.userAnswer.split(','))
        answers[result.quizId] = result.userAnswer.split(',');
      }
    }
  }
  console.log(answers);
  return answers;
};

// async 查看习题答案
print_answers = async function() {
  var j, len, option, option_id_from, pretty_options, qi, question, x;
  if (!answers) {
    await get_quiz_answers();
  }
  pretty_options = '';
  for (qi = j = 0, len = questions.length; j < len; qi = ++j) {
    question = questions[qi];
    option_id_from = options[qi * 4];
    x = (function() {
      var l, len1, ref, results;
      ref = answers[question.quizId];
      results = [];
      for (l = 0, len1 = ref.length; l < len1; l++) {
        option = ref[l];
        results.push(String.fromCharCode('A'.charCodeAt(0) + parseInt(option) - option_id_from));
      }
      return results;
    })();
    pretty_options += `第${qi + 1}题:${x.join(',')}\n`;
  }
  console.log(pretty_options);
  alert(pretty_options);
};

// 自动完成习题
auto_fill = async function() {
  var answer_ids, k, v;
  if (!answers) {
    await get_quiz_answers();
  }
  answer_ids = [];
  for (k in answers) {
    v = answers[k];
    answer_ids = answer_ids.concat(v);
  }
  // todo:多选题再次点击会取消选择
  $("[option_id]").filter(function(i, e) {
    var ref;
    return ref = e.getAttribute('option_id'), indexOf.call(answer_ids, ref) >= 0;
  }).find('[class|="input"]').click();
};

assistant_api = {
  '解锁视频进度': unblock_video_progress,
  '完成该项': complete_item,
  '暂停答题计时': pause_quiz_timer,
  '自动完成习题': auto_fill,
  '查看习题答案': print_answers
};

// userscript 环境
if (typeof unsafeWindow !== 'undefined') {
  // 暴露assistant接口
  unsafeWindow.assistant = {};
  for (name in assistant_api) {
    fun = assistant_api[name];
    unsafeWindow.assistant[fun.name] = fun;
  }
  // 返回课程主页改为返回导航
  $('#backCourse').contents().last().replaceWith('返回导航');
  $('#backCourse').off('click');
  $("#backCourse").on('click', function() {
    return location.href = CONTEXTPATH + "/portal/session/unitNavigation/" + $("#courseOpenId").val() + ".mooc";
  });
  
  // 助手界面显示
  assistant_div = document.createElement('div');
  assistant_div.id = 'assistant';
  $('.main-scroll')[0].prepend(assistant_div);
  
  // 助手界面添加按钮
  add_button = function(text, fun) {
    var btn;
    btn = document.createElement('button');
    btn.textContent = text;
    btn.onclick = fun;
    // todo:优雅的样式设置
    btn.style = 'margin:5px;padding:5px';
    return assistant_div.appendChild(btn);
  };
  for (name in assistant_api) {
    fun = assistant_api[name];
    add_button(name, fun);
  }
  
  // tab切换
  $('.tab-inner').on('click', function() {
    // todo:智能判断可用功能
    return console.log(this);
  });
}


//router=
//    10:video_helper_init
//#    20:pdf_helper # pdf页面
//#    50:quiz_helper # 选择题

//router[$('#itemType').val()]()

//async_ajax_test=->
//    ajax_ret=await $.when $.ajax
//        url:'http://www.cnmooc.org/study/unit/197091.mooc'
//        success:->console.log 'success callback'
//    console.log ajax_ret.length

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQSxVQUFBLEVBQUEsT0FBQSxFQUFBLGFBQUEsRUFBQSxhQUFBLEVBQUEsU0FBQSxFQUFBLGFBQUEsRUFBQSxHQUFBLEVBQUEsZ0JBQUEsRUFBQSxJQUFBLEVBQUEsUUFBQSxFQUFBLElBQUEsRUFBQSxPQUFBLEVBQUEsZ0JBQUEsRUFBQSxhQUFBLEVBQUEsU0FBQSxFQUFBLFdBQUEsRUFBQSxzQkFBQTtFQUFBOztBQWNBLElBQUEsR0FBSyxNQUFBLFFBQUEsQ0FBQSxDQUFBO0VBQ0QsQ0FBQSxDQUFFLGtCQUFGLENBQXFCLENBQUMsSUFBdEIsQ0FBMkIsUUFBQSxDQUFDLENBQUQsRUFBRyxDQUFILENBQUE7QUFDdkIsUUFBQTtJQUFBLFNBQUEsR0FBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQVosQ0FBa0IsY0FBbEIsQ0FBa0MsQ0FBQSxDQUFBO1dBQzVDLENBQUMsQ0FBQyxZQUFGLENBQWUsT0FBZixFQUF1QixTQUF2QjtFQUZ1QixDQUEzQjtFQUdBLE1BQU0sS0FBQSxDQUFNLEdBQU47RUFDTixDQUFBLENBQUUsa0JBQUYsQ0FBcUIsQ0FBQyxLQUF0QixDQUFBO0VBQ0EsTUFBTSxLQUFBLENBQU0sR0FBTjtFQUNOLENBQUEsQ0FBRSxxQkFBRixDQUF3QixDQUFDLEtBQXpCLENBQUE7RUFDQSxNQUFNLEtBQUEsQ0FBTSxHQUFOO1NBQ04sQ0FBQSxDQUFFLG1CQUFGLENBQXNCLENBQUMsS0FBdkIsQ0FBQTtBQVRDLEVBZEw7OztBQTBCQSxRQUFBLEdBQVMsTUFBQSxRQUFBLENBQUEsQ0FBQTtBQUNMLE1BQUEsQ0FBQSxFQUFBLENBQUEsRUFBQTtFQUFBLENBQUEsQ0FBRSxzQkFBRixDQUF5QixDQUFDLEtBQTFCLENBQUE7QUFDQTtFQUFBLEtBQVMsMEJBQVQ7SUFDSSxNQUFNLEtB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WUFBRixDQUFlLENBQUMsRUFBaEIsQ0FBbUIsT0FBbkIsRUFBMkIsUUFBQSxDQUFBLENBQUEsRUFBQTs7V0FFdkIsT0FBTyxDQUFDLEdBQVIsQ0FBWSxJQUFaO0VBRnVCLENBQTNCLEVBOUJKOzs7QUFsS0EiLCJzb3VyY2VzQ29udGVudCI6WyIjID09VXNlclNjcmlwdD09XG4jIEBuYW1lICAgICAgICAg5aW95aSn5a2m5Zyo57q/IOWKqeaJi1xuIyBAbmFtZXNwYWNlICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9TaGVuSG9uZ0ZlaS9jbm1vb2MtYXNzaXN0YW50XG4jIEBob21lcGFnZSAgICAgaHR0cHM6Ly9naXRodWIuY29tL1NoZW5Ib25nRmVpL2NubW9vYy1hc3Npc3RhbnRcbiMgQGF1dGhvciAgICAgICDmsojpuL/po55cbiMgQGRlc2NyaXB0aW9uICAuXG4jIEB2ZXJzaW9uICAgICAgMjAxNy4xMS4yNC4wMy4xOVxuIyBAbWF0Y2ggICAgICAgIGh0dHA6Ly93d3cuY25tb29jLm9yZy9zdHVkeS9pbml0cGxheS8qLm1vb2NcbiMgQG1hdGNoICAgICAgICBodHRwOi8vd3d3LmNubW9vYy5vcmcvc3R1ZHkvdW5pdC8qLm1vb2NcbiMgQHJlcXVpcmUgICAgICBmaWxlOi8vRTovU0RLL2NubW9vYy1hc3Npc3RhbnQvaW5kZXguanNcbiMgQHJ1bi1hdCAgICAgICBkb2N1bWVudC1pZGxlXG4jID09L1VzZXJTY3JpcHQ9PVxuICAgIFxuIyDmu6HliIbmibnpmIXlvZPliY0gbWFyaygpXG5tYXJrPS0+XG4gICAgJCgnaW5wdXRbaWRePXF1aXpfXScpLmVhY2ggKGksZSktPlxuICAgICAgICBtYXhfcG9pbnQ9ZS5jbGFzc05hbWUubWF0Y2goL21heFxcWyhcXGQrKVxcXS8pWzFdXG4gICAgICAgIGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsbWF4X3BvaW50KVxuICAgIGF3YWl0IHNsZWVwKDIwMClcbiAgICAkKCcjc3VibWl0UmV2aWV3QnRuJykuY2xpY2soKVxuICAgIGF3YWl0IHNsZWVwKDIwMClcbiAgICAkKFwiaW5wdXRbdmFsdWU9J+aPkOS6pOS6kuivhCddXCIpLmNsaWNrKClcbiAgICBhd2FpdCBzbGVlcCgyMDApXG4gICAgJChcImlucHV0W3ZhbHVlPSfnoa7lrponXVwiKS5jbGljaygpXG5cbiMg5ruh5YiG5om56ZiF5omA5pyJIG1hcmtfYWxsKClcbm1hcmtfYWxsPS0+XG4gICAgJCgnI2dvdG9SZXZpZXdTdWJtaXRCdG4nKS5jbGljaygpXG4gICAgZm9yIGkgaW4gWzEuLjNdXG4gICAgICAgIGF3YWl0IHNsZWVwKDcwMClcbiAgICAgICAgbWFyaygpXG5cbiMg5a6M5oiQ6K+l6aG5XG5jb21wbGV0ZV9pdGVtPS0+XG4gICAgdXBkYXRlU3R1ZHlPdmVyKClcblxuIyDop6PplIHop4bpopHov5vluqZcbnVuYmxvY2tfdmlkZW9fcHJvZ3Jlc3M9LT5cbiAgICAkKCcjaXNPdmVyJykudmFsKDIpXG4gICAgZXZhbCgkKFwiLnZpZGVvLXNob3cgc2NyaXB0XCIpLmh0bWwoKSlcblxuIyDmmoLlgZzorqHml7ZcbnBhdXNlX3F1aXpfdGltZXI9LT5cbiAgICBpZiB0eXBlb2YgdW5zYWZlV2luZG93IT0ndW5kZWZpbmVkJ1xuICAgICAgICB1bnNhZmVXaW5kb3cudXNlVGltZUZsYWc9ZmFsc2VcbiAgICBlbHNlIHVzZVRpbWVGbGFnPWZhbHNlXG5cbiMgYW5zd2Vycz17cXVlc3Rpb24ucXVpeklkOltvcHRpb25zKHN0cmluZyldfVxuYW5zd2Vycz1udWxsXG5xdWVzdGlvbnM9bnVsbFxub3B0aW9ucz1udWxsXG5cbiMgYXN5bmMg5L+u5pS56IeqIGRvU3VibWl0RXhhbV9hamF4XG50ZXN0X2Fuc3dlcj0ocXVlc3Rpb25zKS0+XG4gICAgI+WkhOeQhuavj+mBk+mimOiuoeaXtlxuICAgIF9xdWl6VXNlVGltZVJlY29yZFtfcXVpeklkUmVjb3JkXT1fcXVpelVzZVRpbWVSZWNvcmRbX3F1aXpJZFJlY29yZF0gb3IgMFxuICAgIF9xdWl6VXNlVGltZVJlY29yZFtfcXVpeklkUmVjb3JkXT1wYXJzZUludChfcXVpelVzZVRpbWVSZWNvcmRbX3F1aXpJZFJlY29yZF0pK19xdWl6VXNlVGltZVxuICAgIHVzZXJfcXVpenM9KEpTT04uc3RyaW5naWZ5IHF1ZXN0aW9uIGZvciBxdWVzdGlvbiBpbiBxdWVzdGlvbnMpXG4gICAgcmVTdWJtaXQ9JCgnI3JlU3VibWl0JykudmFsKClcbiAgICBncmFkZUlkPSQoJyNncmFkZUlkJykudmFsKClcbiAgICB1c2VyUXVpejI9W11cbiAgICB0b3RhbFNjb3JlPTBcbiAgICBhbGxSaWdodEZsYWc9dHJ1ZVxuICAgIGk9MFxuICAgIHdoaWxlIGk8dXNlcl9xdWl6cy5sZW5ndGhcbiAgICAgICAgdXNlcl9RdWl6PUpTT04ucGFyc2UodXNlcl9xdWl6c1tpXSlcbiAgICAgICAgdXNlcl9RdWl6Wyd1c2VUaW1lJ109X3F1aXpVc2VUaW1lUmVjb3JkW3VzZXJfUXVpelsncXVpeklkJ11dXG4gICAgICAgIF9xdWl6VXNlVGltZVJlY29yZFt1c2VyX1F1aXpbJ3F1aXpJZCddXT0wXG4gICAgICAgIFxuICAgICAgICB1c2VyUXVpejIucHVzaCBKU09OLnN0cmluZ2lmeSh1c2VyX1F1aXopXG4gICAgICAgIHNjb3JlPXBhcnNlSW50KHVzZXJfUXVpelsnbWFya1F1aXpTY29yZSddKVxuICAgICAgICB0b3RhbFNjb3JlKz1zY29yZVxuICAgICAgICBpZiBzY29yZT09MFxuICAgICAgICAgICAgYWxsUmlnaHRGbGFnPWZhbHNlXG4gICAgICAgIGkrK1xuICAgIGlmIGFsbFJpZ2h0RmxhZ1xuICAgICAgICB0b3RhbFNjb3JlPTEwMDAwXG4gICAgICAgIFxuICAgIHVzZXJfcXVpenM9dXNlclF1aXoyXG4gICAgY29uc29sZS5sb2codXNlcl9xdWl6cylcbiAgICByZXRfZGF0YT1hd2FpdCAkLndoZW4gJC5hamF4XG4gICAgICAgIHVybDpDT05URVhUUEFUSCsnL2V4YW1TdWJtaXQvNzY4MS9zYXZlRXhhbS8xLycrZXhhbVBhcGVySWQrJy8nK2V4YW1TdWJtaXRJZCsnLm1vb2M/dGVzdFBhcGVySWQ9JytleGFtVGVzdFBhcGVySWRcbiAgICAgICAgdHlwZToncG9zdCdcbiAgICAgICAgZGF0YTpcbiAgICAgICAgICAgIGdyYWRlSWQ6Z3JhZGVJZFxuICAgICAgICAgICAgcmVTdWJtaXQ6cmVTdWJtaXRcbiAgICAgICAgICAgIHN1Ym1pdHF1aXpzOnVzZXJfcXVpenNcbiAgICAgICAgICAgIHN1Ym1pdEZsYWc6MFxuICAgICAgICAgICAgdXNlVGltZToxXG4gICAgICAgICAgICB0b3RhbFNjb3JlOnRvdGFsU2NvcmVcbiAgICAgICAgICAgIHRlc3RQYXBlcklkOmV4YW1UZXN0UGFwZXJJZFxuICAgICAgICBkYXRhVHlwZTonanNvbidcbiAgICAgICAgc3VjY2VzczooZGF0YSkgLT4gaWYgIWRhdGEuc3VjY2Vzc0ZsYWcgdGhlbiB0aHJvdyBFcnJvcihkYXRhLnN1Y2Nlc3NGbGFnPWZhbHNlKVxuICAgICAgICBlcnJvcjotPiBjb25zb2xlLmxvZygndGVzdF9hbnN3ZXIgZXJyb3InKVxuICAgIEpTT04ucGFyc2UgcmV0X2RhdGEuZXhhbVN1Ym1pdC5zdWJtaXRDb250ZW50XG5cbiMgYXN5bmNcbmdldF9xdWl6X2Fuc3dlcnM9LT5cbiAgICAjIOWIneWni+WMlumhtemdoumXrumimFxuICAgIHF1ZXN0aW9ucz0oSlNPTi5wYXJzZSBxdWVzdGlvbiBmb3IgcXVlc3Rpb24gaW4gJCgnI2V4YW1fcGFwZXInKS5xdWl6KCkuZ2V0UHJhY3RpY2UoKSlcbiAgICBcbiAgICAjIOaemuS4vuOAgea1i+ivleOAgeabtOaWsOetlOahiFxuICAgIG9wdGlvbnM9JCgnW29wdGlvbl9pZF0nKS5tYXAgKGksZSktPiBlLmdldEF0dHJpYnV0ZSgnb3B0aW9uX2lkJylcbiAgICBhbnN3ZXJzPXt9XG4gICAgZm9yIG9pIGluIFsxLDIsNCw4LDMsNSw2LDcsOSwxMCwxMSwxMiwxMywxNCwxNV1cbiAgICAgICAgb3B0aW9uX2lkX2ZsYWdzPVtdXG4gICAgICAgIGZvciBpIGluIFswLi4zXVxuICAgICAgICAgICAgb3B0aW9uX2lkX2ZsYWdzLnB1c2ggKG9pPDxpJjBiMTAwMCk9PTBiMTAwMFxuICAgICAgICAjIOajgOa1i+W3suacieato+ehruetlOahiO+8jOWvueavj+S4gOmimOeUn+aIkOetlOahiO+8jOiuvue9rnVzZXJBbnN3ZXJcbiAgICAgICAgZm9yIHF1ZXN0aW9uLHFpIGluIHF1ZXN0aW9uc1xuICAgICAgICAgICAgcGVyZmVjdF9hbnN3ZXI9YW5zd2Vyc1txdWVzdGlvbi5xdWl6SWRdXG4gICAgICAgICAgICBpZiBwZXJmZWN0X2Fuc3dlclxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLnVzZXJBbnN3ZXI9cGVyZmVjdF9hbnN3ZXIuam9pbignLCcpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3VycmVudF9yb3VuZF9vcHRpb25faWRzPVtdXG4gICAgICAgICAgICAgICAgIyBvcHRpb25faWQg5bm26Z2e6L+e57utXG4gICAgICAgICAgICAgICAgZm9yIGkgaW4gWzAuLjNdXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcm91bmRfb3B0aW9uX2lkcy5wdXNoIG9wdGlvbnNbcWkqNCtpXSBpZiBvcHRpb25faWRfZmxhZ3NbaV1cbiAgICAgICAgICAgICAgICBxdWVzdGlvbi51c2VyQW5zd2VyPWN1cnJlbnRfcm91bmRfb3B0aW9uX2lkcy5qb2luKCcsJylcbiAgICAgICAgY29uc29sZS5sb2cgcXVlc3Rpb25zXG4gICAgICAgICMg5p6a5Li+55qE562U5qGI5YeG5aSH5a6M5oiQ77yM5byA5aeL5rWL6K+VXG4gICAgICAgIHRlc3RfcmVzdWx0PWF3YWl0IHRlc3RfYW5zd2VyKHF1ZXN0aW9ucylcbiAgICAgICAgZm9yIHJlc3VsdCBpbiB0ZXN0X3Jlc3VsdFxuICAgICAgICAgICAgcmVzdWx0PUpTT04ucGFyc2UocmVzdWx0KVxuICAgICAgICAgICAgaWYgcmVzdWx0Lm1hcmtSZXN1bHRcbiAgICAgICAgICAgICAgICAjIHBlcmZlY3Rfb3B0aW9ucz0ocGFyc2VJbnQgb3B0aW9uIGZvciBvcHRpb24gaW4gcmVzdWx0LnVzZXJBbnN3ZXIuc3BsaXQoJywnKSlcbiAgICAgICAgICAgICAgICBhbnN3ZXJzW3Jlc3VsdC5xdWl6SWRdPXJlc3VsdC51c2VyQW5zd2VyLnNwbGl0KCcsJylcbiAgICBjb25zb2xlLmxvZyBhbnN3ZXJzXG4gICAgYW5zd2Vyc1xuXG4jIGFzeW5jIOafpeeci+S5oOmimOetlOahiFxucHJpbnRfYW5zd2Vycz0tPlxuICAgIGF3YWl0IGdldF9xdWl6X2Fuc3dlcnMoKSBpZiAhYW5zd2Vyc1xuICAgIHByZXR0eV9vcHRpb25zPScnXG4gICAgZm9yIHF1ZXN0aW9uLHFpIGluIHF1ZXN0aW9uc1xuICAgICAgICBvcHRpb25faWRfZnJvbT1vcHRpb25zW3FpKjRdXG4gICAgICAgIHg9KFN0cmluZy5mcm9tQ2hhckNvZGUoJ0EnLmNoYXJDb2RlQXQoMCkrcGFyc2VJbnQob3B0aW9uKS1vcHRpb25faWRfZnJvbSkgZm9yIG9wdGlvbiBpbiBhbnN3ZXJzW3F1ZXN0aW9uLnF1aXpJZF0pXG4gICAgICAgIHByZXR0eV9vcHRpb25zKz1cIuesrCN7cWkrMX3popjvvJoje3guam9pbignLCcpfVxcblwiXG4gICAgY29uc29sZS5sb2cocHJldHR5X29wdGlvbnMpXG4gICAgYWxlcnQocHJldHR5X29wdGlvbnMpXG4gICAgcmV0dXJuXG5cbiMg6Ieq5Yqo5a6M5oiQ5Lmg6aKYXG5hdXRvX2ZpbGw9LT5cbiAgICBhd2FpdCBnZXRfcXVpel9hbnN3ZXJzKCkgaWYgIWFuc3dlcnNcbiAgICBhbnN3ZXJfaWRzPVtdXG4gICAgZm9yIGssdiBvZiBhbnN3ZXJzXG4gICAgICAgIGFuc3dlcl9pZHM9YW5zd2VyX2lkcy5jb25jYXQgdlxuICAgICMgdG9kbzrlpJrpgInpopjlho3mrKHngrnlh7vkvJrlj5bmtojpgInmi6lcbiAgICAkKFwiW29wdGlvbl9pZF1cIikuZmlsdGVyIChpLGUpLT5lLmdldEF0dHJpYnV0ZSgnb3B0aW9uX2lkJykgaW4gYW5zd2VyX2lkc1xuICAgICAgICAuZmluZCgnW2NsYXNzfD1cImlucHV0XCJdJylcbiAgICAgICAgLmNsaWNrKClcbiAgICByZXR1cm5cblxuYXNzaXN0YW50X2FwaT1cbiAgICAn6Kej6ZSB6KeG6aKR6L+b5bqmJzp1bmJsb2NrX3ZpZGVvX3Byb2dyZXNzXG4gICAgJ+WujOaIkOivpemhuScgICAgOmNvbXBsZXRlX2l0ZW1cbiAgICAn5pqC5YGc562U6aKY6K6h5pe2JzpwYXVzZV9xdWl6X3RpbWVyXG4gICAgJ+iHquWKqOWujOaIkOS5oOmimCc6YXV0b19maWxsXG4gICAgJ+afpeeci+S5oOmimOetlOahiCc6cHJpbnRfYW5zd2Vyc1xuXG4jIHVzZXJzY3JpcHQg546v5aKDXG5pZiB0eXBlb2YgdW5zYWZlV2luZG93IT0ndW5kZWZpbmVkJ1xuICAgICMg5pq06ZyyYXNzaXN0YW505o6l5Y+jXG4gICAgdW5zYWZlV2luZG93LmFzc2lzdGFudD17fVxuICAgIGZvciBuYW1lLGZ1biBvZiBhc3Npc3RhbnRfYXBpXG4gICAgICAgIHVuc2FmZVdpbmRvdy5hc3Npc3RhbnRbZnVuLm5hbWVdPWZ1blxuXG4gICAgIyDov5Tlm57or77nqIvkuLvpobXmlLnkuLrov5Tlm57lr7zoiKpcbiAgICAkKCcjYmFja0NvdXJzZScpLmNvbnRlbnRzKCkubGFzdCgpLnJlcGxhY2VXaXRoKCfov5Tlm57lr7zoiKonKVxuICAgICQoJyNiYWNrQ291cnNlJykub2ZmKCdjbGljaycpXG4gICAgJChcIiNiYWNrQ291cnNlXCIpLm9uICdjbGljaycsIC0+XG4gICAgICAgIGxvY2F0aW9uLmhyZWYgPSBDT05URVhUUEFUSCArIFwiL3BvcnRhbC9zZXNzaW9uL3VuaXROYXZpZ2F0aW9uL1wiICsgJChcIiNjb3Vyc2VPcGVuSWRcIikudmFsKCkgKyBcIi5tb29jXCJcbiAgICBcbiAgICAjIOWKqeaJi+eVjOmdouaYvuekulxuICAgIGFzc2lzdGFudF9kaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBhc3Npc3RhbnRfZGl2LmlkPSdhc3Npc3RhbnQnXG4gICAgJCgnLm1haW4tc2Nyb2xsJylbMF0ucHJlcGVuZChhc3Npc3RhbnRfZGl2KVxuICAgIFxuICAgICMg5Yqp5omL55WM6Z2i5re75Yqg5oyJ6ZKuXG4gICAgYWRkX2J1dHRvbj0odGV4dCxmdW4pLT5cbiAgICAgICAgYnRuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudD10ZXh0XG4gICAgICAgIGJ0bi5vbmNsaWNrPWZ1blxuICAgICAgICAjIHRvZG865LyY6ZuF55qE5qC35byP6K6+572uXG4gICAgICAgIGJ0bi5zdHlsZT0nbWFyZ2luOjVweDtwYWRkaW5nOjVweCdcbiAgICAgICAgYXNzaXN0YW50X2Rpdi5hcHBlbmRDaGlsZChidG4pXG4gICAgICAgIFxuICAgIGZvciBuYW1lLGZ1biBvZiBhc3Npc3RhbnRfYXBpXG4gICAgICAgIGFkZF9idXR0b24obmFtZSxmdW4pXG4gICAgICAgIFxuICAgICMgdGFi5YiH5o2iXG4gICAgJCgnLnRhYi1pbm5lcicpLm9uICdjbGljaycsLT5cbiAgICAgICAgIyB0b2RvOuaZuuiDveWIpOaWreWPr+eUqOWKn+iDvVxuICAgICAgICBjb25zb2xlLmxvZyB0aGlzXG4gICAgXG4jcm91dGVyPVxuIyAgICAxMDp2aWRlb19oZWxwZXJfaW5pdFxuIyMgICAgMjA6cGRmX2hlbHBlciAjIHBkZumhtemdolxuIyMgICAgNTA6cXVpel9oZWxwZXIgIyDpgInmi6npophcbiMgICAgXG4jcm91dGVyWyQoJyNpdGVtVHlwZScpLnZhbCgpXSgpXG4jXG4jYXN5bmNfYWpheF90ZXN0PS0+XG4jICAgIGFqYXhfcmV0PWF3YWl0ICQud2hlbiAkLmFqYXhcbiMgICAgICAgIHVybDonaHR0cDovL3d3dy5jbm1vb2Mub3JnL3N0dWR5L3VuaXQvMTk3MDkxLm1vb2MnXG4jICAgICAgICBzdWNjZXNzOi0+Y29uc29sZS5sb2cgJ3N1Y2Nlc3MgY2FsbGJhY2snXG4jICAgIGNvbnNvbGUubG9nIGFqYXhfcmV0Lmxlbmd0aCJdfQ==
//# sourceURL=E:\SDK\cnmooc-assistant\index.coffee