UNPKG

13.7 kBJavaScriptView Raw
1'use strict';
2/**
3 * URL识别模块
4 *
5 * @author 老雷<leizongmin@gmail.com>
6 */
7var debug = console.log;
8/** 模块类型 */
9exports.type = 'tokenizer';
10/**
11 * 模块初始化
12 *
13 * @param {Segment} segment 分词接口
14 */
15exports.init = function (segment) {
16 exports.segment = segment;
17};
18/**
19 * 对未识别的单词进行分词
20 *
21 * @param {array} words 单词数组
22 * @return {array}
23 */
24exports.split = function (words) {
25 var POSTAG = exports.segment.POSTAG;
26 var ret = [];
27 for (var i = 0, word; word = words[i]; i++) {
28 if (word.p > 0) {
29 ret.push(word);
30 continue;
31 }
32 // 仅对未识别的词进行匹配
33 var urlinfo = matchURL(word.w);
34 if (urlinfo.length < 1) {
35 ret.push(word);
36 continue;
37 }
38 // 分离出URL
39 var lastc = 0;
40 for (var ui = 0, url; url = urlinfo[ui]; ui++) {
41 if (url.c > lastc) {
42 ret.push({ w: word.w.substr(lastc, url.c - lastc) });
43 }
44 ret.push({ w: url.w, p: POSTAG.URL });
45 lastc = url.c + url.w.length;
46 }
47 var lasturl = urlinfo[urlinfo.length - 1];
48 if (lasturl.c + lasturl.w.length < word.w.length) {
49 ret.push({ w: word.w.substr(lasturl.c + lasturl.w.length) });
50 }
51 }
52 // debug(ret);
53 return ret;
54};
55// =================================================================
56// 协议URL头
57var PROTOTAL = ['http://', 'https://', 'ftp://', 'news://', 'telnet://'];
58// 协议头最小长度
59var MIN_PROTOTAL_LEN = 100;
60for (var i in PROTOTAL) {
61 if (PROTOTAL[i].length < MIN_PROTOTAL_LEN) {
62 MIN_PROTOTAL_LEN = PROTOTAL[i].length;
63 }
64}
65// 允许出现在URL中的字符
66var _URLCHAR = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
67 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
68 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
69 '!', '#', '$', '%', '&', '‘', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '=', '?', '@', '[', '\\', ']', '^', '_', '`', '|', '~'];
70var URLCHAR = {};
71for (var i in _URLCHAR) {
72 URLCHAR[_URLCHAR[i]] = 1;
73}
74// =================================================================
75/**
76 * 匹配包含的网址,返回相关信息
77 *
78 * @param {string} text 文本
79 * @param {int} cur 开始位置
80 * @return {array} 返回格式 {w: '网址', c: 开始位置}
81 */
82var matchURL = function (text, cur) {
83 if (isNaN(cur))
84 cur = 0;
85 var ret = [];
86 var s = false;
87 while (cur < text.length) {
88 // 判断是否为 http:// 之类的文本开头
89 if (s === false && cur < text.length - MIN_PROTOTAL_LEN) {
90 for (var i = 0, prot; prot = PROTOTAL[i]; i++) {
91 if (text.substr(cur, prot.length) == prot) {
92 s = cur;
93 cur += prot.length - 1;
94 break;
95 }
96 }
97 }
98 else if (s !== false && !(text.charAt(cur) in URLCHAR)) {
99 // 如果以http://之类开头,遇到了非URL字符,则结束
100 ret.push({
101 w: text.substr(s, cur - s),
102 c: s
103 });
104 s = false;
105 }
106 cur++;
107 }
108 // 检查剩余部分
109 if (s !== false) {
110 ret.push({
111 w: text.substr(s, cur - s),
112 c: s
113 });
114 }
115 return ret;
116};
117//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVJMVG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiVVJMVG9rZW5pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViOzs7O0dBSUc7QUFFSCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBRXhCLFdBQVc7QUFDWCxPQUFPLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztBQUUzQjs7OztHQUlHO0FBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxVQUFVLE9BQU87SUFDOUIsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxPQUFPLENBQUMsS0FBSyxHQUFHLFVBQVUsS0FBSztJQUM3QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNmLFNBQVM7U0FDVjtRQUNELGNBQWM7UUFDZCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNmLFNBQVM7U0FDVjtRQUNELFNBQVM7UUFDVCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFO2dCQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUNwRDtZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7WUFDcEMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDOUI7UUFDRCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDaEQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQzVEO0tBQ0Y7SUFDRCxjQUFjO0lBQ2QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixvRUFBb0U7QUFDcEUsU0FBUztBQUNULElBQUksUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3pFLFVBQVU7QUFDVixJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtJQUN0QixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLEVBQUU7UUFDekMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztLQUN2QztDQUNGO0FBQ0QsZUFBZTtBQUNmLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDeEksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDaEksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUNoRCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hKLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNqQixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtJQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzFCO0FBQ0Qsb0VBQW9FO0FBRXBFOzs7Ozs7R0FNRztBQUNILElBQUksUUFBUSxHQUFHLFVBQVUsSUFBSSxFQUFFLEdBQUc7SUFDaEMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN4QixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDZCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ3hCLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLEVBQUU7WUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDekMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztvQkFDUixHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ3ZCLE1BQU07aUJBQ1A7YUFDRjtTQUNGO2FBQU0sSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxFQUFFO1lBQ3hELCtCQUErQjtZQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUNQLENBQUMsRUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLEVBQUcsQ0FBQzthQUNOLENBQUMsQ0FBQztZQUNILENBQUMsR0FBRyxLQUFLLENBQUM7U0FDWDtRQUNELEdBQUcsRUFBRSxDQUFDO0tBQ1A7SUFDRCxTQUFTO0lBQ1QsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLENBQUMsRUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLENBQUMsRUFBRyxDQUFDO1NBQ04sQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVUkzor4bliKvmqKHlnZdcbiAqXG4gKiBAYXV0aG9yIOiAgembtzxsZWl6b25nbWluQGdtYWlsLmNvbT5cbiAqL1xuXG52YXIgZGVidWcgPSBjb25zb2xlLmxvZztcblxuLyoqIOaooeWdl+exu+WeiyAqL1xuZXhwb3J0cy50eXBlID0gJ3Rva2VuaXplcic7XG5cbi8qKlxuICog5qih5Z2X5Yid5aeL5YyWXG4gKlxuICogQHBhcmFtIHtTZWdtZW50fSBzZWdtZW50IOWIhuivjeaOpeWPo1xuICovXG5leHBvcnRzLmluaXQgPSBmdW5jdGlvbiAoc2VnbWVudCkge1xuICBleHBvcnRzLnNlZ21lbnQgPSBzZWdtZW50O1xufTtcblxuLyoqXG4gKiDlr7nmnKror4bliKvnmoTljZXor43ov5vooYzliIbor41cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSB3b3JkcyDljZXor43mlbDnu4RcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5leHBvcnRzLnNwbGl0ID0gZnVuY3Rpb24gKHdvcmRzKSB7XG4gIHZhciBQT1NUQUcgPSBleHBvcnRzLnNlZ21lbnQuUE9TVEFHO1xuICB2YXIgcmV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCB3b3JkOyB3b3JkID0gd29yZHNbaV07IGkrKykge1xuICAgIGlmICh3b3JkLnAgPiAwKSB7XG4gICAgICByZXQucHVzaCh3b3JkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyDku4Xlr7nmnKror4bliKvnmoTor43ov5vooYzljLnphY1cbiAgICB2YXIgdXJsaW5mbyA9IG1hdGNoVVJMKHdvcmQudyk7XG4gICAgaWYgKHVybGluZm8ubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0LnB1c2god29yZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8g5YiG56a75Ye6VVJMXG4gICAgdmFyIGxhc3RjID0gMDtcbiAgICBmb3IgKHZhciB1aSA9IDAsIHVybDsgdXJsID0gdXJsaW5mb1t1aV07IHVpKyspIHtcbiAgICAgIGlmICh1cmwuYyA+IGxhc3RjKSB7XG4gICAgICAgIHJldC5wdXNoKHt3OiB3b3JkLncuc3Vic3RyKGxhc3RjLCB1cmwuYyAtIGxhc3RjKX0pO1xuICAgICAgfVxuICAgICAgcmV0LnB1c2goe3c6IHVybC53LCBwOiBQT1NUQUcuVVJMfSk7XG4gICAgICBsYXN0YyA9IHVybC5jICsgdXJsLncubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgbGFzdHVybCA9IHVybGluZm9bdXJsaW5mby5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdHVybC5jICsgbGFzdHVybC53Lmxlbmd0aCA8IHdvcmQudy5sZW5ndGgpIHtcbiAgICAgIHJldC5wdXNoKHt3OiB3b3JkLncuc3Vic3RyKGxhc3R1cmwuYyArIGxhc3R1cmwudy5sZW5ndGgpfSk7XG4gICAgfVxuICB9XG4gIC8vIGRlYnVnKHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g5Y2P6K6uVVJM5aS0XG52YXIgUFJPVE9UQUwgPSBbJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nLCAnZnRwOi8vJywgJ25ld3M6Ly8nLCAndGVsbmV0Oi8vJ107XG4vLyDljY/orq7lpLTmnIDlsI/plb/luqZcbnZhciBNSU5fUFJPVE9UQUxfTEVOID0gMTAwO1xuZm9yICh2YXIgaSBpbiBQUk9UT1RBTCkge1xuICBpZiAoUFJPVE9UQUxbaV0ubGVuZ3RoIDwgTUlOX1BST1RPVEFMX0xFTikge1xuICAgIE1JTl9QUk9UT1RBTF9MRU4gPSBQUk9UT1RBTFtpXS5sZW5ndGg7XG4gIH1cbn1cbi8vIOWFgeiuuOWHuueOsOWcqFVSTOS4reeahOWtl+esplxudmFyIF9VUkxDSEFSID0gWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLFxuICAgICAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJyxcbiAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLFxuICAgICAgICAnIScsICcjJywgJyQnLCAnJScsICcmJywgJ+KAmCcsICcoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLCAnOicsICc7JywgJz0nLCAnPycsICdAJywgJ1snLCAnXFxcXCcsICddJywgJ14nLCAnXycsICdgJywgJ3wnLCAnfiddO1xudmFyIFVSTENIQVIgPSB7fTtcbmZvciAodmFyIGkgaW4gX1VSTENIQVIpIHtcbiAgVVJMQ0hBUltfVVJMQ0hBUltpXV0gPSAxO1xufVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiDljLnphY3ljIXlkKvnmoTnvZHlnYDvvIzov5Tlm57nm7jlhbPkv6Hmga9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCDmlofmnKxcbiAqIEBwYXJhbSB7aW50fSBjdXIg5byA5aeL5L2N572uXG4gKiBAcmV0dXJuIHthcnJheX0gIOi/lOWbnuagvOW8jyAgIHt3OiAn572R5Z2AJywgYzog5byA5aeL5L2N572ufVxuICovXG52YXIgbWF0Y2hVUkwgPSBmdW5jdGlvbiAodGV4dCwgY3VyKSB7XG4gIGlmIChpc05hTihjdXIpKSBjdXIgPSAwO1xuICB2YXIgcmV0ID0gW107XG4gIHZhciBzID0gZmFsc2U7XG4gIHdoaWxlIChjdXIgPCB0ZXh0Lmxlbmd0aCkge1xuICAgIC8vIOWIpOaWreaYr+WQpuS4uiBodHRwOi8vIOS5i+exu+eahOaWh+acrOW8gOWktFxuICAgIGlmIChzID09PSBmYWxzZSAmJiBjdXIgPCB0ZXh0Lmxlbmd0aCAtIE1JTl9QUk9UT1RBTF9MRU4pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwcm90OyBwcm90ID0gUFJPVE9UQUxbaV07IGkrKykge1xuICAgICAgICBpZiAodGV4dC5zdWJzdHIoY3VyLCBwcm90Lmxlbmd0aCkgPT0gcHJvdCkge1xuICAgICAgICAgIHMgPSBjdXI7XG4gICAgICAgICAgY3VyICs9IHByb3QubGVuZ3RoIC0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocyAhPT0gZmFsc2UgJiYgISh0ZXh0LmNoYXJBdChjdXIpIGluIFVSTENIQVIpKSB7XG4gICAgICAvLyDlpoLmnpzku6VodHRwOi8v5LmL57G75byA5aS077yM6YGH5Yiw5LqG6Z2eVVJM5a2X56ym77yM5YiZ57uT5p2fXG4gICAgICByZXQucHVzaCh7XG4gICAgICAgIHc6ICB0ZXh0LnN1YnN0cihzLCBjdXIgLSBzKSxcbiAgICAgICAgYzogIHNcbiAgICAgIH0pO1xuICAgICAgcyA9IGZhbHNlO1xuICAgIH1cbiAgICBjdXIrKztcbiAgfVxuICAvLyDmo4Dmn6XliankvZnpg6jliIZcbiAgaWYgKHMgIT09IGZhbHNlKSB7XG4gICAgcmV0LnB1c2goe1xuICAgICAgdzogIHRleHQuc3Vic3RyKHMsIGN1ciAtIHMpLFxuICAgICAgYzogIHNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuLy8gZGVidWcobWF0Y2hVUkwoJ2h0dHA6Ly93d3cuYmFpZHUuY29t5ZOI5ZWKaHR0cDovL+WTh2ZkZ2dnZ2h0dHA6Ly9iYWlkdS5jb20vc3MvJykpO1xuIl19
\No newline at end of file