diff --git a/lib/plugins/company.js b/lib/plugins/company.js
new file mode 100644
index 00000000..ac48974e
--- /dev/null
+++ b/lib/plugins/company.js
@@ -0,0 +1,1187 @@
+var Plugin = require('../plugin');
+
+//
+// [Usage]
+//
+// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/company.md
+//
+var plugin = new Plugin(100, 'company', '2017.12.18',
+    'Plugin to query by company for free user.');
+
+// NOTE: those data is collected from different websites that has similar questions:
+// * careercup.com
+// * lintcode.com
+// * 1point3acres.com
+// * other results from google search
+var COMPONIES = {
+  '1': ['adobe', 'airbnb', 'amazon', 'apple', 'bloomberg', 'dropbox', 'facebook', 'linkedin', 'microsoft', 'uber', 'yahoo', 'yelp'],
+  '2': ['adobe', 'airbnb', 'amazon', 'bloomberg', 'microsoft'],
+  '3': ['adobe', 'amazon', 'bloomberg', 'yelp'],
+  '4': ['adobe', 'apple', 'dropbox', 'google', 'microsoft', 'yahoo', 'zenefits'],
+  '5': ['amazon', 'bloomberg', 'microsoft'],
+  '7': ['apple', 'bloomberg'],
+  '8': ['amazon', 'bloomberg', 'microsoft', 'uber'],
+
+  '10': ['airbnb', 'facebook', 'google', 'twitter', 'uber'],
+  '11': ['bloomberg'],
+  '12': ['twitter'],
+  '13': ['bloomberg', 'facebook', 'microsoft', 'uber', 'yahoo'],
+  '14': ['yelp'],
+  '15': ['adobe', 'amazon', 'bloomberg', 'facebook', 'microsoft'],
+  '16': ['bloomberg'],
+  '17': ['amazon', 'dropbox', 'facebook', 'google', 'uber'],
+  '18': ['linkedin'],
+  '20': ['airbnb', 'amazon', 'bloomberg', 'facebook', 'google', 'microsoft', 'twitter', 'zenefits'],
+  '21': ['amazon', 'apple', 'linkedin', 'microsoft'],
+  '22': ['google', 'uber', 'zenefits'],
+  '23': ['airbnb', 'amazon', 'facebook', 'google', 'linkedin', 'microsoft', 'twitter', 'uber'],
+  '24': ['bloomberg', 'microsoft', 'uber'],
+  '25': ['facebook', 'microsoft'],
+  '26': ['bloomberg', 'facebook', 'microsoft'],
+  '28': ['apple', 'facebook', 'microsoft', 'pocketgems'],
+  '31': ['google'],
+  '33': ['bloomberg', 'facebook', 'linkedin', 'microsoft', 'uber'],
+  '34': ['linkedin'],
+  '36': ['apple', 'snapchat', 'uber'],
+  '37': ['snapchat', 'uber'],
+  '38': ['facebook'],
+  '39': ['snapchat', 'uber'],
+  '40': ['snapchat'],
+  '42': ['amazon', 'apple', 'bloomberg', 'google', 'twitter', 'zenefits'],
+  '43': ['facebook', 'twitter'],
+  '44': ['facebook', 'google', 'snapchat', 'twitter', 'twosigma'],
+  '46': ['linkedin', 'microsoft'],
+  '47': ['linkedin', 'microsoft'],
+  '48': ['amazon', 'apple', 'microsoft'],
+  '49': ['amazon', 'bloomberg', 'facebook', 'uber', 'yelp'],
+  '50': ['bloomberg', 'facebook', 'google', 'linkedin'],
+  '52': ['zenefits'],
+  '53': ['bloomberg', 'linkedin', 'microsoft'],
+  '54': ['google', 'microsoft', 'uber'],
+  '55': ['microsoft'],
+  '56': ['bloomberg', 'facebook', 'google', 'linkedin', 'microsoft', 'twitter', 'yelp'],
+  '57': ['facebook', 'google', 'linkedin'],
+  '60': ['twitter'],
+  '62': ['bloomberg'],
+  '63': ['bloomberg'],
+  '65': ['linkedin'],
+  '66': ['google'],
+  '67': ['facebook'],
+  '68': ['airbnb', 'facebook', 'linkedin'],
+  '69': ['apple', 'bloomberg', 'facebook'],
+  '70': ['adobe', 'apple'],
+  '71': ['facebook', 'microsoft'],
+  '73': ['amazon', 'microsoft'],
+  '75': ['facebook', 'microsoft', 'pocketgems'],
+  '76': ['facebook', 'linkedin', 'snapchat', 'uber'],
+  '78': ['amazon', 'bloomberg', 'facebook', 'uber'],
+  '79': ['bloomberg', 'facebook', 'microsoft'],
+  '80': ['facebook'],
+  '85': ['facebook'],
+  '88': ['bloomberg', 'facebook', 'microsoft'],
+  '89': ['amazon'],
+  '90': ['facebook'],
+  '91': ['facebook', 'microsoft', 'uber'],
+  '94': ['microsoft'],
+  '96': ['snapchat'],
+  '98': ['amazon', 'bloomberg', 'facebook', 'microsoft'],
+
+  '100': ['bloomberg'],
+  '101': ['bloomberg', 'linkedin', 'microsoft'],
+  '102': ['amazon', 'apple', 'bloomberg', 'facebook', 'linkedin', 'microsoft'],
+  '103': ['bloomberg', 'linkedin', 'microsoft'],
+  '104': ['apple', 'linkedin', 'uber', 'yahoo'],
+  '105': ['bloomberg'],
+  '106': ['microsoft'],
+  '108': ['airbnb'],
+  '109': ['zenefits'],
+  '110': ['bloomberg'],
+  '112': ['microsoft'],
+  '113': ['bloomberg'],
+  '114': ['microsoft'],
+  '116': ['microsoft'],
+  '117': ['bloomberg', 'facebook', 'microsoft'],
+  '118': ['apple', 'twitter'],
+  '119': ['amazon'],
+  '121': ['amazon', 'bloomberg', 'facebook', 'microsoft', 'uber'],
+  '122': ['bloomberg'],
+  '124': ['baidu', 'microsoft'],
+  '125': ['facebook', 'microsoft', 'uber', 'zenefits'],
+  '126': ['amazon', 'yelp'],
+  '127': ['amazon', 'facebook', 'linkedin', 'snapchat', 'yelp'],
+  '128': ['facebook', 'google'],
+  '131': ['bloomberg'],
+  '133': ['facebook', 'google', 'pocketgems', 'uber'],
+  '136': ['airbnb', 'palantir'],
+  '138': ['amazon', 'bloomberg', 'microsoft', 'uber'],
+  '139': ['amazon', 'bloomberg', 'facebook', 'google', 'pocketgems', 'uber', 'yahoo'],
+  '140': ['dropbox', 'google', 'snapchat', 'twitter', 'uber'],
+  '141': ['amazon', 'bloomberg', 'microsoft', 'yahoo'],
+  '146': ['amazon', 'bloomberg', 'facebook', 'google', 'microsoft', 'palantir', 'snapchat', 'twitter', 'uber', 'yahoo', 'zenefits'],
+  '149': ['apple', 'linkedin', 'twitter'],
+  '150': ['linkedin'],
+  '151': ['apple', 'bloomberg', 'microsoft', 'snapchat', 'yelp'],
+  '152': ['linkedin'],
+  '153': ['microsoft'],
+  '155': ['amazon', 'bloomberg', 'google', 'snapchat', 'uber', 'zenefits'],
+  '156': ['linkedin'],
+  '157': ['facebook'],
+  '158': ['bloomberg', 'facebook', 'google'],
+  '159': ['google'],
+  '160': ['airbnb', 'amazon', 'bloomberg', 'microsoft'],
+  '161': ['facebook', 'snapchat', 'twitter', 'uber'],
+  '162': ['google', 'microsoft'],
+  '163': ['google'],
+  '165': ['apple', 'microsoft'],
+  '166': ['google'],
+  '167': ['amazon'],
+  '168': ['facebook', 'microsoft', 'zenefits'],
+  '169': ['adobe', 'zenefits'],
+  '170': ['linkedin'],
+  '171': ['microsoft', 'uber'],
+  '172': ['bloomberg'],
+  '173': ['facebook', 'google', 'linkedin', 'microsoft'],
+  '174': ['microsoft'],
+  '186': ['amazon', 'microsoft', 'uber'],
+  '187': ['linkedin'],
+  '189': ['amazon', 'bloomberg', 'microsoft'],
+  '190': ['airbnb', 'apple'],
+  '191': ['apple', 'microsoft'],
+  '195': ['adobe'],
+  '198': ['airbnb', 'linkedin'],
+  '199': ['amazon'],
+  '200': ['amazon', 'facebook', 'google', 'microsoft', 'zenefits'],
+  '202': ['airbnb', 'twitter', 'uber'],
+  '204': ['amazon', 'microsoft'],
+  '205': ['linkedin'],
+  '206': ['adobe', 'amazon', 'apple', 'bloomberg', 'facebook', 'microsoft', 'snapchat', 'twitter', 'uber', 'yahoo', 'yelp', 'zenefits'],
+  '207': ['apple', 'uber', 'yelp', 'zenefits'],
+  '208': ['bloomberg', 'facebook', 'google', 'microsoft', 'twitter', 'uber'],
+  '209': ['facebook'],
+  '210': ['facebook', 'zenefits'],
+  '211': ['facebook'],
+  '212': ['airbnb', 'google', 'microsoft'],
+  '213': ['microsoft'],
+  '214': ['google', 'pocketgems'],
+  '215': ['amazon', 'apple', 'bloomberg', 'facebook', 'microsoft', 'pocketgems'],
+  '217': ['airbnb', 'palantir', 'yahoo'],
+  '218': ['facebook', 'google', 'microsoft', 'twitter', 'yelp'],
+  '219': ['airbnb', 'palantir'],
+  '220': ['airbnb', 'palantir'],
+  '221': ['airbnb', 'apple', 'facebook'],
+  '224': ['google'],
+  '225': ['bloomberg'],
+  '227': ['airbnb'],
+  '228': ['google'],
+  '229': ['zenefits'],
+  '230': ['bloomberg', 'google', 'uber'],
+  '231': ['google'],
+  '232': ['bloomberg', 'microsoft'],
+  '234': ['amazon', 'facebook'],
+  '235': ['amazon', 'facebook', 'microsoft', 'twitter'],
+  '236': ['amazon', 'apple', 'facebook', 'linkedin', 'microsoft'],
+  '237': ['adobe', 'apple', 'microsoft'],
+  '238': ['amazon', 'apple', 'facebook', 'linkedin', 'microsoft'],
+  '239': ['amazon', 'google', 'zenefits'],
+  '240': ['amazon', 'apple', 'google'],
+  '242': ['amazon', 'uber', 'yelp'],
+  '243': ['linkedin'],
+  '244': ['linkedin'],
+  '245': ['linkedin'],
+  '246': ['google'],
+  '247': ['google'],
+  '249': ['google', 'uber'],
+  '251': ['airbnb', 'google', 'twitter', 'zenefits'],
+  '252': ['facebook'],
+  '253': ['facebook', 'google', 'snapchat'],
+  '254': ['linkedin', 'uber'],
+  '255': ['zenefits'],
+  '256': ['linkedin'],
+  '257': ['apple', 'facebook', 'google'],
+  '258': ['adobe', 'microsoft'],
+  '259': ['google'],
+  '261': ['facebook', 'google', 'zenefits'],
+  '262': ['uber'],
+  '265': ['facebook'],
+  '266': ['bloomberg', 'google', 'uber'],
+  '268': ['bloomberg', 'microsoft'],
+  '269': ['airbnb', 'facebook', 'google', 'pocketgems', 'snapchat', 'twitter'],
+  '270': ['google', 'microsoft', 'snapchat'],
+  '271': ['google'],
+  '272': ['google'],
+  '273': ['facebook', 'microsoft'],
+  '274': ['bloomberg', 'facebook', 'google'],
+  '275': ['facebook'],
+  '276': ['google'],
+  '277': ['facebook', 'linkedin'],
+  '278': ['facebook'],
+  '279': ['google'],
+  '280': ['google'],
+  '281': ['google'],
+  '282': ['facebook', 'google'],
+  '283': ['bloomberg', 'facebook'],
+  '284': ['apple', 'google', 'yahoo'],
+  '285': ['facebook', 'microsoft', 'pocketgems'],
+  '286': ['facebook', 'google'],
+  '287': ['bloomberg'],
+  '288': ['google'],
+  '289': ['dropbox', 'google', 'snapchat', 'twosigma'],
+  '290': ['dropbox', 'uber'],
+  '291': ['dropbox', 'uber'],
+  '292': ['adobe'],
+  '293': ['google'],
+  '294': ['google'],
+  '295': ['google'],
+  '296': ['twitter'],
+  '297': ['amazon', 'bloomberg', 'facebook', 'google', 'linkedin', 'microsoft', 'uber', 'yahoo'],
+  '298': ['google'],
+  '300': ['microsoft'],
+  '301': ['facebook'],
+  '302': ['google'],
+  '303': ['palantir'],
+  '305': ['google'],
+  '308': ['google'],
+  '309': ['google'],
+  '310': ['google'],
+  '311': ['facebook', 'linkedin'],
+  '312': ['google', 'snapchat'],
+  '313': ['google'],
+  '314': ['facebook', 'google', 'snapchat'],
+  '315': ['google'],
+  '316': ['google'],
+  '317': ['google', 'zenefits'],
+  '318': ['google'],
+  '320': ['google'],
+  '321': ['google'],
+  '323': ['google', 'twitter'],
+  '324': ['google'],
+  '325': ['facebook', 'palantir'],
+  '326': ['google'],
+  '327': ['google'],
+  '329': ['google'],
+  '330': ['google'],
+  '331': ['google'],
+  '332': ['google'],
+  '333': ['microsoft'],
+  '334': ['facebook'],
+  '336': ['airbnb', 'google'],
+  '337': ['uber'],
+  '339': ['linkedin'],
+  '340': ['google'],
+  '341': ['facebook', 'google', 'twitter'],
+  '342': ['twosigma'],
+  '345': ['google'],
+  '346': ['google'],
+  '347': ['pocketgems', 'yelp'],
+  '348': ['google', 'microsoft'],
+  '349': ['twosigma'],
+  '351': ['google'],
+  '353': ['google'],
+  '354': ['google'],
+  '355': ['amazon', 'twitter'],
+  '356': ['google'],
+  '357': ['google'],
+  '358': ['google'],
+  '359': ['google'],
+  '360': ['google'],
+  '361': ['google'],
+  '362': ['dropbox', 'google'],
+  '363': ['google'],
+  '364': ['linkedin'],
+  '365': ['microsoft'],
+  '366': ['linkedin'],
+  '367': ['linkedin'],
+  '368': ['google'],
+  '369': ['google'],
+  '370': ['google'],
+  '373': ['google', 'uber'],
+  '374': ['google'],
+  '375': ['google'],
+  '377': ['facebook', 'google', 'snapchat'],
+  '378': ['google', 'twitter'],
+  '379': ['google'],
+  '380': ['amazon', 'facebook', 'google', 'pocketgems', 'twitter', 'uber', 'yelp'],
+  '381': ['yelp'],
+  '382': ['google'],
+  '383': ['apple'],
+  '385': ['airbnb'],
+  '386': ['bloomberg'],
+  '387': ['amazon', 'bloomberg', 'microsoft'],
+  '388': ['google'],
+  '389': ['google'],
+  '391': ['google'],
+  '393': ['google'],
+  '394': ['google', 'yelp'],
+  '395': ['baidu'],
+  '396': ['amazon'],
+  '397': ['baidu', 'google'],
+  '398': ['facebook'],
+  '399': ['google'],
+  '400': ['google'],
+  '401': ['google'],
+  '402': ['google', 'snapchat'],
+  '403': ['snapchat'],
+  '404': ['facebook'],
+  '406': ['google'],
+  '407': ['google', 'twitter'],
+  '408': ['google'],
+  '409': ['google'],
+  '410': ['baidu', 'facebook'],
+  '411': ['google'],
+  '413': ['baidu'],
+  '414': ['amazon'],
+  '415': ['airbnb', 'google'],
+  '416': ['ebay'],
+  '417': ['google'],
+  '418': ['google'],
+  '419': ['microsoft'],
+  '421': ['google'],
+  '422': ['google'],
+  '424': ['pocketgems'],
+  '425': ['google'],
+  '432': ['uber'],
+  '433': ['twitter'],
+  '438': ['amazon'],
+  '439': ['snapchat'],
+  '442': ['pocketgems'],
+  '443': ['bloomberg', 'microsoft', 'snapchat', 'yelp'],
+  '444': ['google'],
+  '445': ['bloomberg', 'microsoft'],
+  '446': ['baidu'],
+  '447': ['google'],
+  '448': ['google'],
+  '449': ['amazon'],
+  '450': ['uber'],
+  '451': ['amazon', 'google'],
+  '452': ['microsoft'],
+  '453': ['indeed'],
+  '459': ['amazon', 'google'],
+  '460': ['amazon', 'google'],
+  '461': ['facebook'],
+  '463': ['google'],
+  '464': ['linkedin'],
+  '465': ['google'],
+  '468': ['twitter'],
+  '469': ['google'],
+  '471': ['google'],
+  '474': ['google'],
+  '475': ['google'],
+  '477': ['facebook'],
+  '479': ['yahoo'],
+  '480': ['google'],
+  '481': ['google'],
+  '482': ['google'],
+  '483': ['google'],
+  '484': ['google'],
+  '485': ['google'],
+  '486': ['google'],
+  '487': ['google'],
+  '488': ['baidu'],
+  '490': ['google'],
+  '491': ['yahoo'],
+  '493': ['google'],
+  '494': ['facebook', 'google'],
+  '498': ['google'],
+  '500': ['mathworks'],
+  '501': ['google'],
+  '503': ['google'],
+  '505': ['google'],
+  '506': ['google'],
+  '508': ['amazon'],
+  '513': ['microsoft'],
+  '514': ['google'],
+  '515': ['linkedin'],
+  '516': ['amazon', 'uber'],
+  '517': ['amazon'],
+  '520': ['google'],
+  '521': ['google'],
+  '522': ['google'],
+  '523': ['facebook'],
+  '524': ['google'],
+  '525': ['facebook'],
+  '526': ['google'],
+  '527': ['google', 'snapchat'],
+  '529': ['amazon'],
+  '530': ['google'],
+  '531': ['google'],
+  '532': ['amazon'],
+  '533': ['google'],
+  '534': ['amazon', 'facebook', 'google', 'uber'],
+  '535': ['amazon', 'facebook', 'google', 'uber'],
+  '536': ['amazon'],
+  '537': ['amazon'],
+  '538': ['amazon'],
+  '541': ['google'],
+  '542': ['google'],
+  '543': ['facebook', 'google'],
+  '544': ['google'],
+  '545': ['amazon', 'google'],
+  '547': ['bloomberg', 'twosigma'],
+  '548': ['alibaba'],
+  '549': ['google'],
+  '551': ['google'],
+  '552': ['google'],
+  '553': ['amazon'],
+  '554': ['facebook'],
+  '555': ['alibaba'],
+  '556': ['bloomberg'],
+  '557': ['zappos'],
+  '560': ['google'],
+  '562': ['google'],
+  '563': ['indeed'],
+  '564': ['yelp'],
+  '566': ['mathworks'],
+  '567': ['microsoft'],
+  '568': ['google'],
+  '569': ['google'],
+  '570': ['bloomberg'],
+  '572': ['ebay', 'facebook', 'google'],
+  '576': ['baidu'],
+  '578': ['facebook'],
+  '579': ['amazon'],
+  '580': ['twitter'],
+  '581': ['google'],
+  '582': ['bloomberg'],
+  '583': ['google'],
+  '585': ['twitter'],
+  '586': ['twitter'],
+  '587': ['google'],
+  '591': ['microsoft'],
+  '597': ['facebook'],
+  '599': ['yelp'],
+  '602': ['facebook'],
+  '604': ['google'],
+  '605': ['linkedin'],
+  '606': ['amazon'],
+  '608': ['twitter'],
+  '616': ['google'],
+  '617': ['amazon'],
+  '621': ['facebook'],
+  '631': ['microsoft'],
+  '633': ['linkedin'],
+  '635': ['snapchat'],
+  '636': ['facebook', 'uber'],
+  '637': ['facebook'],
+  '638': ['google'],
+  '639': ['facebook'],
+  '640': ['amazon'],
+  '642': ['facebook', 'microsoft'],
+  '643': ['google'],
+  '644': ['google'],
+  '645': ['amazon'],
+  '646': ['amazon'],
+  '647': ['facebook', 'linkedin'],
+  '648': ['uber'],
+  '650': ['microsoft'],
+  '651': ['google', 'microsoft'],
+  '652': ['google'],
+  '653': ['facebook'],
+  '654': ['microsoft'],
+  '656': ['google'],
+  '657': ['google'],
+  '658': ['google'],
+  '659': ['google'],
+  '661': ['amazon'],
+  '662': ['amazon'],
+  '663': ['amazon'],
+  '665': ['google'],
+  '667': ['google'],
+  '668': ['google'],
+  '669': ['bloomberg'],
+  '670': ['facebook'],
+  '671': ['linkedin'],
+  '672': ['microsoft'],
+  '673': ['facebook'],
+  '674': ['facebook'],
+  '675': ['amazon'],
+  '676': ['google'],
+  '679': ['google'],
+  '680': ['facebook'],
+  '681': ['google'],
+  '682': ['amazon'],
+  '683': ['google'],
+  '684': ['google'],
+  '685': ['google'],
+  '686': ['google'],
+  '687': ['google'],
+  '689': ['facebook', 'google'],
+  '690': ['uber'],
+  '692': ['amazon', 'bloomberg', 'uber', 'yelp'],
+  '694': ['amazon'],
+  '698': ['linkedin'],
+  '699': ['uber'],
+  '711': ['amazon'],
+  '714': ['bloomberg', 'facebook'],
+  '716': ['linkedin'],
+  '719': ['google'],
+  '721': ['facebook'],
+  '722': ['microsoft'],
+  '725': ['amazon'],
+  '726': ['google'],
+  '727': ['google'],
+  '729': ['google'],
+  '730': ['linkedin'],
+  '731': ['google']
+};
+
+var TAGS = {
+  '1': ['array', 'hash-table'],
+  '2': ['linked-list', 'math'],
+  '3': ['hash-table', 'string', 'two-pointers'],
+  '4': ['array', 'binary-search', 'divide-and-conquer'],
+  '5': ['string'],
+  '6': ['string'],
+  '7': ['math'],
+  '8': ['math', 'string'],
+  '9': ['math'],
+
+  '10': ['backtracking', 'dynamic-programming', 'string'],
+  '11': ['array', 'two-pointers'],
+  '12': ['math', 'string'],
+  '13': ['math', 'string'],
+  '14': ['string'],
+  '15': ['array', 'two-pointers'],
+  '16': ['array', 'two-pointers'],
+  '17': ['backtracking', 'string'],
+  '18': ['array', 'hash-table', 'two-pointers'],
+  '19': ['linked-list', 'two-pointers'],
+  '20': ['stack', 'string'],
+  '21': ['linked-list'],
+  '22': ['backtracking', 'string'],
+  '23': ['divide-and-conquer', 'heap', 'linked-list'],
+  '24': ['linked-list'],
+  '25': ['linked-list'],
+  '26': ['array', 'two-pointers'],
+  '27': ['array', 'two-pointers'],
+  '28': ['string', 'two-pointers'],
+  '29': ['binary-search', 'math'],
+  '30': ['hash-table', 'string', 'two-pointers'],
+  '31': ['array'],
+  '32': ['dynamic-programming', 'string'],
+  '33': ['array', 'binary-search'],
+  '34': ['array', 'binary-search'],
+  '35': ['array', 'binary-search'],
+  '36': ['hash-table'],
+  '37': ['backtracking', 'hash-table'],
+  '38': ['string'],
+  '39': ['array', 'backtracking'],
+  '40': ['array', 'backtracking'],
+  '41': ['array'],
+  '42': ['array', 'stack', 'two-pointers'],
+  '43': ['math', 'string'],
+  '44': ['backtracking', 'dynamic-programming', 'greedy', 'string'],
+  '45': ['array', 'greedy'],
+  '46': ['backtracking'],
+  '47': ['backtracking'],
+  '48': ['array'],
+  '49': ['hash-table', 'string'],
+  '50': ['binary-search', 'math'],
+  '51': ['backtracking'],
+  '52': ['backtracking'],
+  '53': ['array', 'divide-and-conquer', 'dynamic-programming'],
+  '54': ['array'],
+  '55': ['array', 'greedy'],
+  '56': ['array', 'sort'],
+  '57': ['array', 'sort'],
+  '58': ['string'],
+  '59': ['array'],
+  '60': ['backtracking', 'math'],
+  '61': ['linked-list', 'two-pointers'],
+  '62': ['array', 'dynamic-programming'],
+  '63': ['array', 'dynamic-programming'],
+  '64': ['array', 'dynamic-programming'],
+  '65': ['math', 'string'],
+  '66': ['array', 'math'],
+  '67': ['math', 'string'],
+  '68': ['string'],
+  '69': ['binary-search', 'math'],
+  '70': ['dynamic-programming'],
+  '71': ['stack', 'string'],
+  '72': ['dynamic-programming', 'string'],
+  '73': ['array'],
+  '74': ['array', 'binary-search'],
+  '75': ['array', 'sort', 'two-pointers'],
+  '76': ['hash-table', 'string', 'two-pointers'],
+  '77': ['backtracking'],
+  '78': ['array', 'backtracking', 'bit-manipulation'],
+  '79': ['array', 'backtracking'],
+  '80': ['array', 'two-pointers'],
+  '81': ['array', 'binary-search'],
+  '82': ['linked-list'],
+  '83': ['linked-list'],
+  '84': ['array', 'stack'],
+  '85': ['array', 'dynamic-programming', 'hash-table', 'stack'],
+  '86': ['linked-list', 'two-pointers'],
+  '87': ['dynamic-programming', 'string'],
+  '88': ['array', 'two-pointers'],
+  '89': ['backtracking'],
+  '90': ['array', 'backtracking'],
+  '91': ['dynamic-programming', 'string'],
+  '92': ['linked-list'],
+  '93': ['backtracking', 'string'],
+  '94': ['hash-table', 'stack', 'tree'],
+  '95': ['dynamic-programming', 'tree'],
+  '96': ['dynamic-programming', 'tree'],
+  '97': ['dynamic-programming', 'string'],
+  '98': ['depth-first-search', 'tree'],
+  '99': ['depth-first-search', 'tree'],
+
+  '100': ['depth-first-search', 'tree'],
+  '101': ['breadth-first-search', 'depth-first-search', 'tree'],
+  '102': ['breadth-first-search', 'tree'],
+  '103': ['breadth-first-search', 'stack', 'tree'],
+  '104': ['depth-first-search', 'tree'],
+  '105': ['array', 'depth-first-search', 'tree'],
+  '106': ['array', 'depth-first-search', 'tree'],
+  '107': ['breadth-first-search', 'tree'],
+  '108': ['depth-first-search', 'tree'],
+  '109': ['depth-first-search', 'linked-list'],
+  '110': ['depth-first-search', 'tree'],
+  '111': ['breadth-first-search', 'depth-first-search', 'tree'],
+  '112': ['depth-first-search', 'tree'],
+  '113': ['depth-first-search', 'tree'],
+  '114': ['depth-first-search', 'tree'],
+  '115': ['dynamic-programming', 'string'],
+  '116': ['depth-first-search', 'tree'],
+  '117': ['depth-first-search', 'tree'],
+  '118': ['array'],
+  '119': ['array'],
+  '120': ['array', 'dynamic-programming'],
+  '121': ['array', 'dynamic-programming'],
+  '122': ['array', 'greedy'],
+  '123': ['array', 'dynamic-programming'],
+  '124': ['depth-first-search', 'tree'],
+  '125': ['string', 'two-pointers'],
+  '126': ['array', 'backtracking', 'breadth-first-search', 'string'],
+  '127': ['breadth-first-search'],
+  '128': ['array', 'union-find'],
+  '129': ['depth-first-search', 'tree'],
+  '130': ['breadth-first-search', 'depth-first-search', 'union-find'],
+  '131': ['backtracking'],
+  '132': ['dynamic-programming'],
+  '133': ['breadth-first-search', 'depth-first-search', 'graph'],
+  '134': ['greedy'],
+  '135': ['greedy'],
+  '136': ['bit-manipulation', 'hash-table'],
+  '137': ['bit-manipulation'],
+  '138': ['hash-table', 'linked-list'],
+  '139': ['dynamic-programming'],
+  '140': ['backtracking', 'dynamic-programming'],
+  '141': ['linked-list', 'two-pointers'],
+  '142': ['linked-list', 'two-pointers'],
+  '143': ['linked-list'],
+  '144': ['stack', 'tree'],
+  '145': ['stack', 'tree'],
+  '146': ['design'],
+  '147': ['linked-list', 'sort'],
+  '148': ['linked-list', 'sort'],
+  '149': ['hash-table', 'math'],
+  '150': ['stack'],
+  '151': ['string'],
+  '152': ['array', 'dynamic-programming'],
+  '153': ['array', 'binary-search'],
+  '154': ['array', 'binary-search'],
+  '155': ['design', 'stack'],
+  '156': ['tree'],
+  '157': ['string'],
+  '158': ['string'],
+  '159': ['hash-table', 'string', 'two-pointers'],
+  '160': ['linked-list'],
+  '161': ['string'],
+  '162': ['array', 'binary-search'],
+  '163': ['array'],
+  '164': ['sort'],
+  '165': ['string'],
+  '166': ['hash-table', 'math'],
+  '167': ['array', 'binary-search', 'two-pointers'],
+  '168': ['math'],
+  '169': ['array', 'bit-manipulation', 'divide-and-conquer'],
+  '170': ['design', 'hash-table'],
+  '171': ['math'],
+  '172': ['math'],
+  '173': ['design', 'stack', 'tree'],
+  '174': ['binary-search', 'dynamic-programming'],
+  '179': ['sort'],
+  '186': ['string'],
+  '187': ['bit-manipulation', 'hash-table'],
+  '188': ['dynamic-programming'],
+  '189': ['array'],
+  '190': ['bit-manipulation'],
+  '191': ['bit-manipulation'],
+  '198': ['dynamic-programming'],
+  '199': ['breadth-first-search', 'depth-first-search', 'tree'],
+  '200': ['breadth-first-search', 'depth-first-search', 'union-find'],
+  '201': ['bit-manipulation'],
+  '202': ['hash-table', 'math'],
+  '203': ['linked-list'],
+  '204': ['hash-table', 'math'],
+  '205': ['hash-table'],
+  '206': ['linked-list'],
+  '207': ['breadth-first-search', 'depth-first-search', 'graph', 'topological-sort'],
+  '208': ['design', 'trie'],
+  '209': ['array', 'binary-search', 'two-pointers'],
+  '210': ['breadth-first-search', 'depth-first-search', 'graph', 'topological-sort'],
+  '211': ['backtracking', 'design', 'trie'],
+  '212': ['backtracking', 'trie'],
+  '213': ['dynamic-programming'],
+  '214': ['string'],
+  '215': ['divide-and-conquer', 'heap'],
+  '216': ['array', 'backtracking'],
+  '217': ['array', 'hash-table'],
+  '218': ['binary-indexed-tree', 'divide-and-conquer', 'heap', 'segment-tree'],
+  '219': ['array', 'hash-table'],
+  '220': ['binary-search-tree'],
+  '221': ['dynamic-programming'],
+  '222': ['binary-search', 'tree'],
+  '223': ['math'],
+  '224': ['math', 'stack'],
+  '225': ['design', 'stack'],
+  '226': ['tree'],
+  '227': ['string'],
+  '228': ['array'],
+  '229': ['array'],
+  '230': ['binary-search', 'tree'],
+  '231': ['bit-manipulation', 'math'],
+  '232': ['design', 'stack'],
+  '233': ['math'],
+  '234': ['linked-list', 'two-pointers'],
+  '235': ['tree'],
+  '236': ['tree'],
+  '237': ['linked-list'],
+  '238': ['array'],
+  '239': ['heap'],
+  '240': ['binary-search', 'divide-and-conquer'],
+  '241': ['divide-and-conquer'],
+  '242': ['hash-table', 'sort'],
+  '243': ['array'],
+  '244': ['design', 'hash-table'],
+  '245': ['array'],
+  '246': ['hash-table', 'math'],
+  '247': ['math'],
+  '248': ['math'],
+  '249': ['hash-table', 'string'],
+  '250': ['tree'],
+  '251': ['design'],
+  '252': ['sort'],
+  '253': ['greedy', 'heap', 'sort'],
+  '254': ['backtracking'],
+  '255': ['stack', 'tree'],
+  '256': ['dynamic-programming'],
+  '257': ['depth-first-search', 'tree'],
+  '258': ['math'],
+  '259': ['array', 'two-pointers'],
+  '260': ['bit-manipulation'],
+  '261': ['breadth-first-search', 'depth-first-search', 'graph', 'union-find'],
+  '263': ['math'],
+  '264': ['dynamic-programming', 'heap', 'math'],
+  '265': ['dynamic-programming'],
+  '266': ['hash-table'],
+  '267': ['backtracking'],
+  '268': ['array', 'bit-manipulation', 'math'],
+  '269': ['graph', 'topological-sort'],
+  '270': ['binary-search', 'tree'],
+  '271': ['string'],
+  '272': ['stack', 'tree'],
+  '273': ['math', 'string'],
+  '274': ['hash-table', 'sort'],
+  '275': ['binary-search'],
+  '276': ['dynamic-programming'],
+  '277': ['array'],
+  '278': ['binary-search'],
+  '279': ['breadth-first-search', 'dynamic-programming', 'math'],
+  '280': ['array', 'sort'],
+  '281': ['design'],
+  '282': ['divide-and-conquer'],
+  '283': ['array', 'two-pointers'],
+  '284': ['design'],
+  '285': ['tree'],
+  '286': ['breadth-first-search'],
+  '287': ['array', 'binary-search', 'two-pointers'],
+  '288': ['design', 'hash-table'],
+  '289': ['array'],
+  '290': ['hash-table'],
+  '291': ['backtracking'],
+  '293': ['string'],
+  '294': ['backtracking'],
+  '295': ['design', 'heap'],
+  '296': ['math', 'sort'],
+  '297': ['design', 'tree'],
+  '298': ['tree'],
+  '299': ['hash-table'],
+  '300': ['binary-search', 'dynamic-programming'],
+  '301': ['breadth-first-search', 'depth-first-search'],
+  '302': ['binary-search'],
+  '303': ['dynamic-programming'],
+  '304': ['dynamic-programming'],
+  '305': ['union-find'],
+  '307': ['binary-indexed-tree', 'segment-tree'],
+  '308': ['binary-indexed-tree', 'segment-tree'],
+  '309': ['dynamic-programming'],
+  '310': ['breadth-first-search', 'graph'],
+  '311': ['hash-table'],
+  '312': ['divide-and-conquer', 'dynamic-programming'],
+  '313': ['heap', 'math'],
+  '314': ['hash-table'],
+  '315': ['binary-indexed-tree', 'divide-and-conquer', 'segment-tree', 'binary-search-tree'],
+  '316': ['greedy', 'stack'],
+  '317': ['breadth-first-search'],
+  '318': ['bit-manipulation'],
+  '319': ['math'],
+  '320': ['backtracking', 'bit-manipulation'],
+  '321': ['dynamic-programming', 'greedy'],
+  '322': ['dynamic-programming'],
+  '323': ['breadth-first-search', 'depth-first-search', 'graph', 'union-find'],
+  '324': ['sort'],
+  '325': ['hash-table'],
+  '326': ['math'],
+  '327': ['divide-and-conquer', 'binary-search-tree'],
+  '328': ['linked-list'],
+  '329': ['depth-first-search', 'topological-sort'],
+  '330': ['greedy'],
+  '331': ['stack'],
+  '332': ['depth-first-search', 'graph'],
+  '333': ['tree'],
+  '335': ['math'],
+  '336': ['hash-table', 'string', 'trie'],
+  '337': ['depth-first-search', 'tree'],
+  '338': ['bit-manipulation', 'dynamic-programming'],
+  '339': ['depth-first-search'],
+  '340': ['hash-table', 'string'],
+  '341': ['design', 'stack'],
+  '342': ['bit-manipulation'],
+  '343': ['dynamic-programming', 'math'],
+  '344': ['string', 'two-pointers'],
+  '345': ['string', 'two-pointers'],
+  '346': ['design', 'queue'],
+  '347': ['hash-table', 'heap'],
+  '348': ['design'],
+  '349': ['binary-search', 'hash-table', 'sort', 'two-pointers'],
+  '350': ['binary-search', 'hash-table', 'sort', 'two-pointers'],
+  '351': ['backtracking', 'dynamic-programming'],
+  '352': ['binary-search-tree'],
+  '353': ['design', 'queue'],
+  '354': ['binary-search', 'dynamic-programming'],
+  '355': ['design', 'hash-table', 'heap'],
+  '356': ['hash-table', 'math'],
+  '357': ['backtracking', 'dynamic-programming', 'math'],
+  '358': ['greedy', 'hash-table', 'heap'],
+  '359': ['design', 'hash-table'],
+  '360': ['math', 'two-pointers'],
+  '361': ['dynamic-programming'],
+  '362': ['design'],
+  '363': ['binary-search', 'dynamic-programming', 'queue'],
+  '364': ['depth-first-search'],
+  '365': ['math'],
+  '366': ['depth-first-search', 'tree'],
+  '367': ['binary-search', 'math'],
+  '368': ['dynamic-programming', 'math'],
+  '369': ['linked-list'],
+  '370': ['array'],
+  '371': ['bit-manipulation'],
+  '372': ['math'],
+  '373': ['heap'],
+  '374': ['binary-search'],
+  '375': ['dynamic-programming'],
+  '376': ['dynamic-programming', 'greedy'],
+  '377': ['dynamic-programming'],
+  '378': ['binary-search', 'heap'],
+  '379': ['design', 'linked-list'],
+  '380': ['array', 'design', 'hash-table'],
+  '381': ['array', 'design', 'hash-table'],
+  '382': ['reservoir-sampling'],
+  '383': ['string'],
+  '385': ['stack', 'string'],
+  '387': ['hash-table', 'string'],
+  '389': ['bit-manipulation', 'hash-table'],
+  '392': ['binary-search', 'dynamic-programming', 'greedy'],
+  '393': ['bit-manipulation'],
+  '394': ['depth-first-search', 'stack'],
+  '396': ['math'],
+  '397': ['bit-manipulation', 'math'],
+  '398': ['reservoir-sampling'],
+  '399': ['graph'],
+  '400': ['math'],
+  '401': ['backtracking', 'bit-manipulation'],
+  '402': ['greedy', 'stack'],
+  '403': ['dynamic-programming'],
+  '404': ['tree'],
+  '405': ['bit-manipulation'],
+  '406': ['greedy'],
+  '407': ['breadth-first-search', 'heap'],
+  '408': ['string'],
+  '409': ['hash-table'],
+  '410': ['binary-search', 'dynamic-programming'],
+  '411': ['backtracking', 'bit-manipulation'],
+  '413': ['dynamic-programming', 'math'],
+  '414': ['array'],
+  '415': ['math'],
+  '416': ['dynamic-programming'],
+  '417': ['breadth-first-search', 'depth-first-search'],
+  '418': ['dynamic-programming'],
+  '421': ['bit-manipulation', 'trie'],
+  '423': ['math'],
+  '425': ['backtracking', 'trie'],
+  '432': ['design'],
+  '434': ['string'],
+  '435': ['greedy'],
+  '436': ['binary-search'],
+  '437': ['tree'],
+  '438': ['hash-table'],
+  '439': ['depth-first-search', 'stack'],
+  '441': ['binary-search', 'math'],
+  '442': ['array'],
+  '443': ['string'],
+  '444': ['graph', 'topological-sort'],
+  '445': ['linked-list'],
+  '446': ['dynamic-programming'],
+  '447': ['hash-table'],
+  '448': ['array'],
+  '449': ['tree'],
+  '450': ['tree'],
+  '451': ['hash-table', 'heap'],
+  '452': ['greedy'],
+  '453': ['math'],
+  '454': ['binary-search', 'hash-table'],
+  '455': ['greedy'],
+  '456': ['stack'],
+  '459': ['string'],
+  '460': ['design'],
+  '461': ['bit-manipulation'],
+  '462': ['math'],
+  '463': ['hash-table'],
+  '464': ['dynamic-programming'],
+  '466': ['dynamic-programming'],
+  '467': ['dynamic-programming'],
+  '468': ['string'],
+  '469': ['math'],
+  '471': ['dynamic-programming'],
+  '472': ['depth-first-search', 'dynamic-programming', 'trie'],
+  '473': ['depth-first-search'],
+  '474': ['dynamic-programming'],
+  '475': ['binary-search'],
+  '476': ['bit-manipulation'],
+  '477': ['bit-manipulation'],
+  '483': ['binary-search', 'math'],
+  '484': ['greedy'],
+  '485': ['array'],
+  '486': ['dynamic-programming'],
+  '487': ['two-pointers'],
+  '488': ['depth-first-search'],
+  '490': ['breadth-first-search', 'depth-first-search'],
+  '491': ['depth-first-search'],
+  '493': ['binary-indexed-tree', 'divide-and-conquer', 'segment-tree', 'binary-search-tree'],
+  '494': ['depth-first-search', 'dynamic-programming'],
+  '495': ['array'],
+  '496': ['stack'],
+  '499': ['breadth-first-search', 'depth-first-search'],
+  '500': ['hash-table'],
+  '501': ['tree'],
+  '502': ['greedy', 'heap'],
+  '503': ['stack'],
+  '505': ['breadth-first-search', 'depth-first-search'],
+  '507': ['math'],
+  '508': ['hash-table', 'tree'],
+  '513': ['breadth-first-search', 'depth-first-search', 'tree'],
+  '514': ['depth-first-search', 'divide-and-conquer', 'dynamic-programming'],
+  '515': ['breadth-first-search', 'depth-first-search', 'tree'],
+  '516': ['dynamic-programming'],
+  '517': ['dynamic-programming', 'math'],
+  '520': ['string'],
+  '521': ['string'],
+  '522': ['string'],
+  '523': ['dynamic-programming', 'math'],
+  '524': ['sort', 'two-pointers'],
+  '525': ['hash-table'],
+  '526': ['backtracking'],
+  '527': ['sort', 'string'],
+  '529': ['breadth-first-search', 'depth-first-search'],
+  '530': ['array', 'depth-first-search', 'binary-search-tree'],
+  '531': ['array', 'depth-first-search'],
+  '532': ['array', 'two-pointers'],
+  '533': ['array', 'depth-first-search'],
+  '535': ['hash-table', 'math'],
+  '536': ['string', 'tree'],
+  '537': ['math', 'string'],
+  '538': ['tree'],
+  '539': ['string'],
+  '541': ['string'],
+  '542': ['breadth-first-search', 'depth-first-search'],
+  '543': ['tree'],
+  '544': ['string'],
+  '545': ['tree'],
+  '546': ['depth-first-search', 'dynamic-programming'],
+  '547': ['depth-first-search', 'union-find'],
+  '548': ['array'],
+  '549': ['tree'],
+  '551': ['string'],
+  '552': ['dynamic-programming'],
+  '553': ['math', 'string'],
+  '554': ['hash-table'],
+  '555': ['string'],
+  '556': ['string'],
+  '557': ['string'],
+  '560': ['array', 'map'],
+  '561': ['array'],
+  '562': ['array'],
+  '563': ['tree'],
+  '564': ['string'],
+  '565': ['array'],
+  '566': ['array'],
+  '567': ['two-pointers'],
+  '568': ['dynamic-programming'],
+  '572': ['tree'],
+  '573': ['math'],
+  '575': ['hash-table'],
+  '576': ['depth-first-search', 'dynamic-programming'],
+  '581': ['array'],
+  '582': ['queue', 'tree'],
+  '583': ['string'],
+  '588': ['design'],
+  '591': ['stack', 'string'],
+  '592': ['math'],
+  '593': ['math'],
+  '594': ['hash-table'],
+  '598': ['math'],
+  '599': ['hash-table'],
+  '600': ['dynamic-programming'],
+  '604': ['design'],
+  '605': ['array'],
+  '606': ['string', 'tree'],
+  '609': ['hash-table', 'string'],
+  '611': ['array'],
+  '616': ['string'],
+  '617': ['tree'],
+  '621': ['array', 'greedy', 'queue'],
+  '623': ['tree'],
+  '624': ['array', 'hash-table'],
+  '625': ['math'],
+  '628': ['array', 'math'],
+  '629': ['dynamic-programming'],
+  '630': ['greedy'],
+  '631': ['design'],
+  '632': ['hash-table', 'string', 'two-pointers'],
+  '633': ['math'],
+  '634': ['math'],
+  '635': ['design', 'string'],
+  '636': ['stack'],
+  '637': ['tree'],
+  '638': ['depth-first-search', 'dynamic-programming'],
+  '639': ['dynamic-programming'],
+  '640': ['math'],
+  '642': ['design', 'trie'],
+  '643': ['array'],
+  '644': ['array', 'binary-search'],
+  '645': ['hash-table', 'math'],
+  '646': ['dynamic-programming'],
+  '647': ['dynamic-programming', 'string'],
+  '648': ['hash-table', 'trie'],
+  '649': ['greedy'],
+  '650': ['dynamic-programming'],
+  '651': ['dynamic-programming', 'greedy', 'math'],
+  '652': ['tree'],
+  '653': ['tree'],
+  '654': ['tree'],
+  '655': ['tree'],
+  '656': ['dynamic-programming'],
+  '657': ['string'],
+  '658': ['binary-search'],
+  '659': ['greedy', 'heap'],
+  '660': ['math'],
+  '661': ['array'],
+  '662': ['tree'],
+  '663': ['tree'],
+  '664': ['depth-first-search', 'dynamic-programming'],
+  '665': ['array'],
+  '666': ['tree'],
+  '667': ['array'],
+  '668': ['binary-search'],
+  '669': ['tree'],
+  '670': ['array', 'math'],
+  '671': ['tree'],
+  '672': ['math'],
+  '673': ['dynamic-programming'],
+  '674': ['array'],
+  '675': ['breadth-first-search'],
+  '676': ['hash-table', 'trie'],
+  '677': ['trie'],
+  '678': ['string'],
+  '679': ['depth-first-search'],
+  '680': ['string'],
+  '681': ['string'],
+  '682': ['stack'],
+  '683': ['array', 'binary-search-tree'],
+  '684': ['graph', 'tree', 'union-find'],
+  '685': ['depth-first-search', 'graph', 'tree', 'union-find'],
+  '686': ['string'],
+  '687': ['tree'],
+  '688': ['dynamic-programming'],
+  '689': ['array', 'dynamic-programming'],
+  '690': ['breadth-first-search', 'depth-first-search', 'hash-table'],
+  '691': ['backtracking', 'dynamic-programming'],
+  '692': ['hash-table', 'heap', 'trie'],
+  '693': ['bit-manipulation'],
+  '694': ['depth-first-search', 'hash-table'],
+  '695': ['array', 'depth-first-search'],
+  '696': ['string'],
+  '697': ['array'],
+  '698': ['dynamic-programming'],
+  '699': ['segment-tree', 'binary-search-tree'],
+  '711': ['depth-first-search', 'hash-table'],
+  '712': ['dynamic-programming'],
+  '713': ['array', 'two-pointers'],
+  '714': ['array', 'dynamic-programming', 'greedy'],
+  '715': ['array', 'segment-tree', 'binary-search-tree'],
+  '716': ['design'],
+  '717': ['array'],
+  '718': ['array', 'binary-search', 'dynamic-programming', 'hash-table'],
+  '719': ['array', 'binary-search', 'heap'],
+  '720': ['hash-table', 'trie'],
+  '721': ['depth-first-search', 'union-find'],
+  '722': ['string'],
+  '723': ['array', 'two-pointers'],
+  '724': ['array'],
+  '725': ['linked-list'],
+  '726': ['hash-table', 'stack'],
+  '727': ['dynamic-programming'],
+  '728': ['math'],
+  '729': ['array'],
+  '730': ['dynamic-programming', 'string'],
+  '731': ['array', 'binary-search-tree'],
+  '732': ['segment-tree', 'binary-search-tree'],
+  '733': ['depth-first-search'],
+  '734': ['hash-table'],
+  '735': ['stack'],
+  '736': ['string'],
+  '737': ['depth-first-search', 'union-find'],
+  '738': ['greedy'],
+  '739': ['hash-table', 'stack'],
+  '740': ['dynamic-programming'],
+  '741': ['dynamic-programming'],
+  '742': ['tree'],
+  '743': ['breadth-first-search', 'depth-first-search', 'graph', 'heap'],
+  '744': ['binary-search'],
+  '745': ['trie'],
+  '746': ['array', 'dynamic-programming'],
+  '748': ['hash-table'],
+  '749': ['depth-first-search'],
+  '750': ['dynamic-programming']
+};
+
+plugin.getProblems = function(cb) {
+  plugin.next.getProblems(function(e, problems) {
+    if (e) return cb(e);
+
+    problems.forEach(function(problem) {
+      var id = String(problem.id);
+      if (id in COMPONIES) {
+        problem.companies = (problem.companies || []).concat(COMPONIES[id]);
+      }
+      if (id in TAGS) {
+        problem.tags = (problem.tags || []).concat(TAGS[id]);
+      }
+    });
+    return cb(null, problems);
+  });
+};
+
+module.exports = plugin;
diff --git a/lib/plugins/leetcode.cn.js b/lib/plugins/leetcode.cn.js
new file mode 100644
index 00000000..0095e0bd
--- /dev/null
+++ b/lib/plugins/leetcode.cn.js
@@ -0,0 +1,126 @@
+'use strict'
+var request = require('request');
+
+var config = require('../config');
+var h = require('../helper');
+var log = require('../log');
+var Plugin = require('../plugin');
+var session = require('../session');
+
+//
+// [Usage]
+//
+// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/leetcode.cn.md
+//
+var plugin = new Plugin(15, 'leetcode.cn', '2018.11.25',
+    'Plugin to talk with leetcode-cn APIs.');
+
+plugin.init = function() {
+  config.app = 'leetcode.cn';
+  config.sys.urls.base            = 'https://leetcode-cn.com';
+  config.sys.urls.login           = 'https://leetcode-cn.com/accounts/login/';
+  config.sys.urls.problems        = 'https://leetcode-cn.com/api/problems/$category/';
+  config.sys.urls.problem         = 'https://leetcode-cn.com/problems/$slug/description/';
+  config.sys.urls.graphql         = 'https://leetcode-cn.com/graphql';
+  config.sys.urls.problem_detail  = 'https://leetcode-cn.com/graphql';
+  config.sys.urls.test            = 'https://leetcode-cn.com/problems/$slug/interpret_solution/';
+  config.sys.urls.session         = 'https://leetcode-cn.com/session/';
+  config.sys.urls.submit          = 'https://leetcode-cn.com/problems/$slug/submit/';
+  config.sys.urls.submissions     = 'https://leetcode-cn.com/api/submissions/$slug';
+  config.sys.urls.submission      = 'https://leetcode-cn.com/submissions/detail/$id/';
+  config.sys.urls.verify          = 'https://leetcode-cn.com/submissions/detail/$id/check/';
+  config.sys.urls.favorites       = 'https://leetcode-cn.com/list/api/questions';
+  config.sys.urls.favorite_delete = 'https://leetcode-cn.com/list/api/questions/$hash/$id';
+};
+
+// FIXME: refactor those
+// update options with user credentials
+function signOpts(opts, user) {
+  opts.headers.Cookie = 'LEETCODE_SESSION=' + user.sessionId +
+                        ';csrftoken=' + user.sessionCSRF + ';';
+  opts.headers['X-CSRFToken'] = user.sessionCSRF;
+  opts.headers['X-Requested-With'] = 'XMLHttpRequest';
+}
+
+function makeOpts(url) {
+  const opts = {};
+  opts.url = url;
+  opts.headers = {};
+
+  if (session.isLogin())
+    signOpts(opts, session.getUser());
+  return opts;
+}
+
+function checkError(e, resp, expectedStatus) {
+  if (!e && resp && resp.statusCode !== expectedStatus) {
+    const code = resp.statusCode;
+    log.debug('http error: ' + code);
+
+    if (code === 403 || code === 401) {
+      e = session.errors.EXPIRED;
+    } else {
+      e = {msg: 'http error', statusCode: code};
+    }
+  }
+  return e;
+}
+
+plugin.getProblems = function(cb) {
+  plugin.next.getProblems(function(e, problems) {
+    if (e) return cb(e);
+
+    plugin.getProblemsTitle(function(e, titles) {
+      if (e) return cb(e);
+
+      problems.forEach(function(problem) {
+        const title = titles[problem.id];
+        if (title)
+          problem.name = title;
+      });
+
+      return cb(null, problems);
+    });
+  });
+};
+
+plugin.getProblemsTitle = function(cb) {
+  log.debug('running leetcode.cn.getProblemNames');
+
+  const opts = makeOpts(config.sys.urls.graphql);
+  opts.headers.Origin = config.sys.urls.base;
+  opts.headers.Referer = 'https://leetcode-cn.com/api/problems/algorithms/';
+
+  opts.json = true;
+  opts.body = {
+    query: [
+      'query getQuestionTranslation($lang: String) {',
+      '  translations: allAppliedQuestionTranslations(lang: $lang) {',
+      '    title',
+      '    question {',
+      '      questionId',
+      '    }',
+      '  }',
+      '}',
+      ''
+    ].join('\n'),
+    variables:     {},
+    operationName: 'getQuestionTranslation'
+  };
+
+  const spin = h.spin('Downloading questions titles');
+  request.post(opts, function(e, resp, body) {
+    spin.stop();
+    e = checkError(e, resp, 200);
+    if (e) return cb(e);
+
+    const titles = [];
+    body.data.translations.forEach(function(x) {
+      titles[x.question.questionId] = x.title;
+    });
+
+    return cb(null, titles);
+  });
+};
+
+module.exports = plugin;
diff --git a/lib/plugins/solution.discuss.js b/lib/plugins/solution.discuss.js
new file mode 100644
index 00000000..e78b90af
--- /dev/null
+++ b/lib/plugins/solution.discuss.js
@@ -0,0 +1,100 @@
+var request = require('request');
+
+var log = require('../log');
+var chalk = require('../chalk');
+var Plugin = require('../plugin');
+var session = require('../session');
+
+//
+// [Usage]
+//
+// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/solution.discuss.md
+//
+var plugin = new Plugin(200, 'solution.discuss', '2019.02.03',
+    'Plugin to fetch most voted solution in discussions.');
+
+var URL_DISCUSSES = 'https://leetcode.com/graphql';
+var URL_DISCUSS = 'https://leetcode.com/problems/$slug/discuss/$id';
+
+function getSolution(problem, lang, cb) {
+  if (!problem) return cb();
+
+  if (lang === 'python3') lang = 'python';
+
+  var opts = {
+    url:  URL_DISCUSSES,
+    json: true,
+    body: {
+      query: [
+        'query questionTopicsList($questionId: String!, $orderBy: TopicSortingOption, $skip: Int, $query: String, $first: Int!, $tags: [String!]) {',
+        '  questionTopicsList(questionId: $questionId, orderBy: $orderBy, skip: $skip, query: $query, first: $first, tags: $tags) {',
+        '    ...TopicsList',
+        '  }',
+        '}',
+        'fragment TopicsList on TopicConnection {',
+        '  totalNum',
+        '  edges {',
+        '    node {',
+        '      id',
+        '      title',
+        '      post {',
+        '        content',
+        '        voteCount',
+        '        author {',
+        '          username',
+        '        }',
+        '      }',
+        '    }',
+        '  }',
+        '}'
+      ].join('\n'),
+
+      operationName: 'questionTopicsList',
+      variables:     JSON.stringify({
+        query:      '',
+        first:      1,
+        skip:       0,
+        orderBy:    'most_votes',
+        questionId: '' + problem.id,
+        tags:       [lang]
+      })
+    }
+  };
+  request(opts, function(e, resp, body) {
+    if (e) return cb(e);
+    if (resp.statusCode !== 200)
+      return cb({msg: 'http error', statusCode: resp.statusCode});
+
+    const solutions = body.data.questionTopicsList.edges;
+    const solution = solutions.length > 0 ? solutions[0].node : null;
+    return cb(null, solution);
+  });
+}
+
+plugin.getProblem = function(problem, cb) {
+  plugin.next.getProblem(problem, function(e, problem) {
+    if (e || !session.argv.solution) return cb(e, problem);
+
+    var lang = session.argv.lang;
+    getSolution(problem, lang, function(e, solution) {
+      if (e) return cb(e);
+      if (!solution) return log.error('Solution not found for ' + lang);
+
+      var link = URL_DISCUSS.replace('$slug', problem.slug).replace('$id', solution.id);
+      var content = solution.post.content.replace(/\\n/g, '\n').replace(/\\t/g, '\t');
+
+      log.info();
+      log.info(solution.title);
+      log.info();
+      log.info(chalk.underline(link));
+      log.info();
+      log.info('* Lang:    ' + lang);
+      log.info('* Author:  ' + solution.post.author.username);
+      log.info('* Votes:   ' + solution.post.voteCount);
+      log.info();
+      log.info(content);
+    });
+  });
+};
+
+module.exports = plugin;