{"action":"created","issue":{"url":"https://api.github.com/repos/Unidata/MetPy/issues/902","repository_url":"https://api.github.com/repos/Unidata/MetPy","labels_url":"https://api.github.com/repos/Unidata/MetPy/issues/902/labels{/name}","comments_url":"https://api.github.com/repos/Unidata/MetPy/issues/902/comments","events_url":"https://api.github.com/repos/Unidata/MetPy/issues/902/events","html_url":"https://github.com/Unidata/MetPy/issues/902","id":345095762,"node_id":"MDU6SXNzdWUzNDUwOTU3NjI=","number":902,"title":"calc.lfc( ) bug report.","user":{"login":"Clarmy","id":20877876,"node_id":"MDQ6VXNlcjIwODc3ODc2","avatar_url":"https://avatars0.githubusercontent.com/u/20877876?v=4","gravatar_id":"","url":"https://api.github.com/users/Clarmy","html_url":"https://github.com/Clarmy","followers_url":"https://api.github.com/users/Clarmy/followers","following_url":"https://api.github.com/users/Clarmy/following{/other_user}","gists_url":"https://api.github.com/users/Clarmy/gists{/gist_id}","starred_url":"https://api.github.com/users/Clarmy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Clarmy/subscriptions","organizations_url":"https://api.github.com/users/Clarmy/orgs","repos_url":"https://api.github.com/users/Clarmy/repos","events_url":"https://api.github.com/users/Clarmy/events{/privacy}","received_events_url":"https://api.github.com/users/Clarmy/received_events","type":"User","site_admin":false},"labels":[{"id":317073835,"node_id":"MDU6TGFiZWwzMTcwNzM4MzU=","url":"https://api.github.com/repos/Unidata/MetPy/labels/Area:%20Calc","name":"Area: Calc","color":"c7def8","default":false},{"id":202032143,"node_id":"MDU6TGFiZWwyMDIwMzIxNDM=","url":"https://api.github.com/repos/Unidata/MetPy/labels/Type:%20Bug","name":"Type: Bug","color":"f7c6c7","default":false}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/Unidata/MetPy/milestones/17","html_url":"https://github.com/Unidata/MetPy/milestone/17","labels_url":"https://api.github.com/repos/Unidata/MetPy/milestones/17/labels","id":2980564,"node_id":"MDk6TWlsZXN0b25lMjk4MDU2NA==","number":17,"title":"0.9","description":"MetPy 0.9 - Summer 2018 Release Estimated","creator":{"login":"jrleeman","id":325269,"node_id":"MDQ6VXNlcjMyNTI2OQ==","avatar_url":"https://avatars3.githubusercontent.com/u/325269?v=4","gravatar_id":"","url":"https://api.github.com/users/jrleeman","html_url":"https://github.com/jrleeman","followers_url":"https://api.github.com/users/jrleeman/followers","following_url":"https://api.github.com/users/jrleeman/following{/other_user}","gists_url":"https://api.github.com/users/jrleeman/gists{/gist_id}","starred_url":"https://api.github.com/users/jrleeman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jrleeman/subscriptions","organizations_url":"https://api.github.com/users/jrleeman/orgs","repos_url":"https://api.github.com/users/jrleeman/repos","events_url":"https://api.github.com/users/jrleeman/events{/privacy}","received_events_url":"https://api.github.com/users/jrleeman/received_events","type":"User","site_admin":false},"open_issues":21,"closed_issues":33,"state":"open","created_at":"2017-12-14T19:34:07Z","updated_at":"2018-08-13T20:36:02Z","due_on":"2018-08-15T07:00:00Z","closed_at":null},"comments":2,"created_at":"2018-07-27T05:31:51Z","updated_at":"2018-08-14T20:30:00Z","closed_at":null,"author_association":"NONE","body":"### For bugs\r\n\r\n- Example data file :\r\n[UPAR_CHN_MUL_FTM-2018071612.txt](https://github.com/Unidata/MetPy/files/2234485/UPAR_CHN_MUL_FTM-2018071612.txt)\r\n\r\n - Code : \r\n```python\r\n# coding: utf-8\r\n\r\nu'''\r\n    cal_sounding_data.py  \r\n\r\n    * python = 3.6\r\n\r\n    此程序将对CMA的MUL_FTM探空资料进行清洗，然后提取温度、露点温度、气压等变量，并计算探空数据所需的状态曲线数据、\r\nLCL、LFC、EL、CAPE、CIN等数据，最终将数据存储成指定格式的json文件\r\n\r\n    This program can clean MUL_FTM sounding data from CMA, and abstract temperature, dew point temperature,\r\npressure etc.. And it will calculate parcel profile, lcl, lfc, el, cape, cin etc.. Then it will save all of \r\nvariables into a json file.\r\n\r\nV0.0.1 - 李文韬 - 2018/07/26 - liwentao@mail.iap.ac.cn / clarmylee92510@gmail.com\r\n    + 首次创建 first create.\r\n'''\r\n\r\nimport time\r\nimport numpy as np\r\nimport pandas as pd\r\nimport metpy.calc as mpcalc\r\nfrom metpy.units import units\r\nimport json\r\nfrom sys import argv\r\nimport pdb\r\nimport matplotlib.pyplot as plt\r\nimport warnings\r\n\r\n# ignore warnings\r\nwarnings.filterwarnings('ignore')\r\n\r\n# inpath, outpath = argv[1], argv[2]\r\ninpath = './UPAR_CHN_MUL_FTM-2018071612.txt'\r\noutpath = './result.json'\r\n\r\n# create first timestamp\r\ntime0 = time.time()\r\n\r\ndef cleanDataByPress(df):\r\n    u'''\r\n    clean data\r\n    '''\r\n    datapool = df.sort_values(by=['PRS_HWC'],ascending=False)\r\n    rm_index = []\r\n    for i in datapool.index:\r\n        dataline = datapool.loc[i]\r\n        if dataline['PRS_HWC'] > 900000 or (dataline['TEM'] > 900000 and dataline['DPT'] > 900000):\r\n                rm_index.append(i)\r\n\r\n    datapool.drop(rm_index,inplace=True)\r\n    datapool.drop_duplicates(['PRS_HWC'],'first',inplace=True)\r\n\r\n    return datapool\r\n\r\ndef dicFillValues2None(dic):\r\n    u'''\r\n    convert fill values to None \r\n    '''\r\n    for k in dic:\r\n        if dic[k] == 999999:\r\n            dic[k] = None\r\n    return dic\r\n\r\ndef CheckWind(wind):\r\n    u'''\r\n    check whether the wind speed is correct.\r\n    '''\r\n    for i in range(len(wind)):\r\n        if abs(wind[i]) > 10000:\r\n            wind[i] = None\r\n    return wind\r\n\r\ndef arrFillValues2None(arr,fill_value):\r\n    leng = len(arr)\r\n    for i in range(leng):\r\n        if arr[i] == fill_value:\r\n            arr[i] = np.nan\r\n    return arr\r\n\r\ndef dicRound2digit(dic):\r\n    for k in dic:\r\n        try:\r\n            length = len(dic[k])\r\n        except TypeError:\r\n            try:\r\n                dic[k] = round(dic[k],2)\r\n            except TypeError:\r\n                dic[k] = None\r\n            continue\r\n\r\n        dic[k] = list(dic[k])\r\n        for i in range(length):\r\n            try:\r\n                dic[k][i] = round(dic[k][i],2)\r\n            except TypeError:\r\n                continue\r\n    return dic\r\n\r\ndef dicNpNan2None(dic):\r\n    for k in dic:\r\n        try:\r\n            length = len(dic[k])\r\n        except TypeError:\r\n            if np.isnan(dic[k]):\r\n                dic[k] = None\r\n            continue \r\n        dic[k] = list(dic[k])\r\n        for i in range(length):\r\n            if np.isnan(dic[k][i]):\r\n                dic[k][i] = None\r\n    return dic\r\n\r\ndef soundingCalculation(std_id,p,t,td,ws,wd):\r\n    u'''\r\n    calculate sounding data\r\n\r\n    输入\r\n    ---\r\n    std_id : int\r\n        站号编码\r\n        Stations' code\r\n\r\n    p : ndarray\r\n        气压层序列，相当于其他变量的索引，其长度须与t、td、ws、wd的长度相同\r\n        Pressere array, its length must be the same as t, td, ws and wd's. Pressure's unit is hPa\r\n\r\n    t : ndarray\r\n        气温层序列表，其单位为dgeC\r\n        Temperature array, its unit is degC.\r\n\r\n    td : ndarray\r\n        露点气温序列表，其单位为degC\r\n        Dew point temperature array, its unit is degC.\r\n\r\n    ws : ndarray\r\n        风速序列表，其单位为M/S\r\n        Wind speed array, its unit is M/S\r\n\r\n    wd : ndarray\r\n        风向序列表，为其单位为deg\r\n        Wind direction array, its unit is deg.\r\n\r\n    输出\r\n    ---\r\n    new_dic : dict\r\n        处理过得到的数据集，其键包含{'P','T','Td','U','V','LCL','LFC','EL','Parcel','CAPE','CIN','Station_ID'}\r\n        按顺序分别表示\r\n        {气压、温度、露点温度、纬向风速、经向风速、抬升凝结高度、自由对流高度、平衡高度、气块状态曲线（温度）、对流不稳定能量、\r\n        对流抑制能量、观测站编号}\r\n        Dict that we want. Its keys include {'P','T','Td','U','V','LCL','LFC','EL','Parcel','CAPE','CIN','Station_ID'}\r\n\r\n    '''\r\n    P = p * units.hPa\r\n    T = t * units.degC\r\n    Td = td * units.degC\r\n    wind_speed = ws * (units.meter / units.second)\r\n    wind_dir = wd * units.degrees\r\n    u, v = mpcalc.get_wind_components(wind_speed, wind_dir)\r\n    \r\n    # 当具备计算气块状态曲线条件的时候，计算状态曲线 \r\n    # perform calculate when the conditions to calculate parcel profile and lcl etc. are met. \r\n    if P[0].magnitude < 900000 and T[0].magnitude < 900000 and  Td[0].magnitude < 900000:\r\n        # 计算抬升凝结高度LCL\r\n        # calculate lcl\r\n        lcl_p, lcl_T = mpcalc.lcl(P[0],T[0],Td[0])\r\n        # 计算自由对流高度LFC\r\n        # calculate lfc\r\n        # pdb.set_trace()\r\n        lfc_p, lfc_T = mpcalc.lfc(P,T,Td)\r\n        # try:\r\n        #     # *************    此处有bug   ******************\r\n        #     # ************* here apperes bug ***************\r\n        #     lfc_p, lfc_T = mpcalc.lfc(P,T,Td)\r\n        # except IndexError:\r\n        #     pdb.set_trace()\r\n        # # 计算平衡高度EL\r\n        # calculate el\r\n        try:\r\n            el_p, el_T = mpcalc.el(P,T,Td)\r\n        except IndexError:\r\n            el_p = np.nan\r\n            el_T = np.nan\r\n        # 计算气块状态曲线\r\n        # calculate the parcel profile\r\n        try:\r\n            parcel = mpcalc.parcel_profile(P,T[0],Td[0]).to('degC')\r\n        except IndexError:\r\n            parcel = np.array([np.nan] * len(P))\r\n        try:\r\n            cape, cin = mpcalc.cape_cin(P,T,Td,parcel)\r\n        except IndexError:\r\n            cape = np.nan\r\n            cin = np.nan\r\n        Parcel = parcel.magnitude\r\n    # 不具备状态曲线条件的时候，填充为np.nan值\r\n    # if can't meet the conditions to calculate parcel profile, then fill it with np.nan\r\n    elif P[0].magnitude < 900000:\r\n        Parcel = np.array([np.nan] * len(P))\r\n\r\n    P = P.magnitude\r\n    T = arrFillValues2None(T.magnitude,999999)\r\n    Td = arrFillValues2None(Td.magnitude,999999)\r\n    U = np.round(CheckWind(u.magnitude),2)\r\n    V = np.round(CheckWind(v.magnitude),2)\r\n    Parcel = np.round(Parcel,2)\r\n    \r\n    # 将抬升凝结高度点等变量去单位化，并保留2位小数\r\n    # remove units of variables and keep 2 digit decimal\r\n    # 如果值为空,或者不管出他妈的什么bug，先统一填充为np.nan\r\n    # if variable is None or appears other unexpected problems, then fill it with np.nan\r\n    try:\r\n        LCL_P  = round(lcl_p.magnitude,2)\r\n    except:\r\n        LCL_P  = np.nan\r\n    try:\r\n        LCL_T  = round(lcl_T.magnitude,2)\r\n    except:\r\n        LCL_T  = np.nan\r\n    try:\r\n        LFC_P  = round(lfc_p.magnitude,2)\r\n    except:\r\n        LFC_P  = np.nan\r\n    try:\r\n        LFC_T  = round(lfc_T.magnitude,2)\r\n    except:\r\n        LFC_T  = np.nan\r\n    try:\r\n        EL_P   = round(el_p.magnitude,2)\r\n    except:\r\n        EL_P   = np.nan\r\n    try:\r\n        EL_T   = round(el_T.magnitude,2)\r\n    except:\r\n        EL_T   = np.nan\r\n    try:\r\n        CAPE   = round(cape.magnitude,2)\r\n    except:\r\n        CAPE   = np.nan\r\n    try:\r\n        CIN    = round(cin.magnitude,2)\r\n    except:\r\n        CIN    = np.nan\r\n        \r\n    new_dic = {'P':P,'T':T,'Td':Td,'U':U,'V':V,'LCL':[LCL_P,LCL_T],\r\n               'LFC':[LFC_P,LFC_T],'EL':[EL_P,EL_T],'Parcel':Parcel,\r\n               'CAPE':CAPE,'CIN':CIN,'Station_ID':std_id}\r\n    # 把np.nan格式统一改为内建None格式以便json输出时输出为null\r\n    # convert np.nan to None in order to output to \"null\" in json file\r\n    new_dic = dicNpNan2None(new_dic)\r\n    # 保留2位小数\r\n    # keep 2 digit decimal\r\n    new_dic = dicRound2digit(new_dic)\r\n    return new_dic\r\n\r\ndef specStationSounding(num,dataset_dic):\r\n    u'''\r\n    计算单站的所有探空数据\r\n    calculate all sounding data for one specific station.\r\n\r\n    输入\r\n    ---\r\n    num : int\r\n        站点编号\r\n        stations's code\r\n\r\n    dataset_dic : dict\r\n        数据集字典，每个键对应的值应为pd.DataFrame数据\r\n        dataset dictionary, each key's value must be a data type of pd.DataFrame.\r\n\r\n    输出\r\n    ---\r\n    result_dic : dict\r\n        数据集字典，每个键对应的值不再是pd.DataFrame，而是字典，即字典嵌套字典\r\n        dataset dictionary, each key's value is no longer a pd.DataFrame, instead, it's dictionary, too.\r\n        it's dictionary in dictionary.\r\n    '''\r\n    p = cleanDataByPress(dataset_dic[num])['PRS_HWC'].values\r\n    td = cleanDataByPress(dataset_dic[num])['DPT'].values\r\n    t = cleanDataByPress(dataset_dic[num])['TEM'].values\r\n    ws = cleanDataByPress(dataset_dic[num])['WIN_S'].values\r\n    wd = cleanDataByPress(dataset_dic[num])['WIN_D'].values\r\n    \r\n    result_dic = soundingCalculation(num,p,t,td,ws,wd)\r\n    \r\n    return result_dic\r\n\r\ndef dicAddAttrInfo(result_dic,orig_dic):\r\n    u'''\r\n    为新的数据字典添加属性类字段\r\n\r\n    输入\r\n    ---\r\n    result_dic : dict\r\n        需添加属性类字段的字典\r\n    orig_dic : dict\r\n        含有属性类字段原始字典\r\n\r\n    输出\r\n    ---\r\n    result_dic : dict\r\n        添加好属性类字段信息的新字典\r\n    '''\r\n    for k in orig_dic:\r\n        AttrKeys = ['Lon','Lat','Year','Mon','Day','Hour','Min','Second']\r\n        single = orig_dic[k].drop_duplicates(AttrKeys)\r\n        time = timeStrBySingle(single)\r\n        lon = single['Lon'].values[0]\r\n        lat = single['Lat'].values[0]\r\n        \r\n        # result_dic[k]['Station_id'] = k\r\n        result_dic[k]['TIME'] = time\r\n        result_dic[k]['LON'] = lon\r\n        result_dic[k]['LAT'] = lat\r\n    return result_dic\r\n\r\ndef timeStrBySingle(single):\r\n    u'''\r\n    利用single输出标准的时间格式字符串\r\n    \r\n    输入\r\n    ---\r\n    single类型: pd.DataFrame\r\n        仅有一行的pd.DataFrame数据，即该站点删除重复时间后的第一行数据\r\n\r\n    输出\r\n    ---\r\n    time类型: 字符串\r\n        例如：20180910143000\r\n    '''\r\n    yyyy = str(single['Year'].values[0])\r\n    mm = str(single['Mon'].values[0]).zfill(2)\r\n    dd = str(single['Day'].values[0]).zfill(2)\r\n    HH = str(single['Hour'].values[0]).zfill(2)\r\n    MM = str(single['Min'].values[0]).zfill(2)\r\n    SS = str(single['Second'].values[0]).zfill(2)\r\n    time = yyyy+mm+dd+HH+MM+SS\r\n    \r\n    return time\r\n\r\nif __name__ == '__main__':\r\n\r\n    # 读取所有数据\r\n    all_cols = pd.read_csv(inpath,sep='\\t')\r\n\r\n    # 选取有用数据的字段\r\n    useful_col_names = ['Station_Id_C','Lat','Lon','Year','Mon','Day','Hour',\r\n                        'Min','Second','PRS_HWC','TEM','DPT','WIN_D','WIN_S']\r\n    # 读取有用字段数据\r\n    dataset = all_cols[useful_col_names]\r\n\r\n    # 以观测站编号为键，创建字典，字典内存储的是pd.DataFrame表格\r\n    dataset_dic = {}\r\n    for name, group in dataset.groupby('Station_Id_C'):\r\n        dataset_dic[name] = group\r\n\r\n    # 计算探空数据，并存储在新建立的字典中\r\n    newset_dic = {}\r\n    for k in dataset_dic.keys():\r\n        newset_dic[k] = specStationSounding(k,dataset_dic)\r\n\r\n    # 在新建立的字典中添加属性类信息\r\n    newset_dic = dicAddAttrInfo(newset_dic,dataset_dic)\r\n\r\n    # 建立json格式的字符串\r\n    js_str = ''\r\n    for k in newset_dic:\r\n        js_str = js_str + json.dumps(newset_dic[k])+'\\n'\r\n\r\n    # 保存文件\r\n    with open(outpath,'w') as f:\r\n        f.write(js_str)\r\n\r\n    # 打印脚本用时\r\n    time1 = time.time()\r\n    print(time1 - time0,end='\\n')\r\n\r\n```\r\n- Problem description: \r\n\r\nMy Python program raised `IndexError: index 0 is out of bounds for axis 0 with size 0` when I call the `metpy.calc.lfc()` function.\r\n\r\nThe full error informations are as follow:\r\n\r\n```\r\nTraceback (most recent call last):\r\n  File \"cal_sounding_data.py\", line 360, in <module>\r\n    newset_dic[k] = specStationSounding(k,dataset_dic)\r\n  File \"cal_sounding_data.py\", line 284, in specStationSounding\r\n    result_dic = soundingCalculation(num,p,t,td,ws,wd)\r\n  File \"cal_sounding_data.py\", line 170, in soundingCalculation\r\n    lfc_p, lfc_T = mpcalc.lfc(P,T,Td)\r\n  File \"/anaconda2/envs/py3/lib/python3.6/site-packages/metpy/xarray.py\", line 138, in wrapper\r\n    return func(*args, **kwargs)\r\n  File \"/anaconda2/envs/py3/lib/python3.6/site-packages/metpy/units.py\", line 290, in wrapper\r\n    return func(*args, **kwargs)\r\n  File \"/anaconda2/envs/py3/lib/python3.6/site-packages/metpy/calc/thermo.py\", line 378, in lfc\r\n    return x[0], y[0]\r\n  File \"/anaconda2/envs/py3/lib/python3.6/site-packages/pint/quantity.py\", line 1281, in __getitem__\r\n    value = self._magnitude[key]\r\nIndexError: index 0 is out of bounds for axis 0 with size 0\r\n```\r\nI debugged it with pdb and inserted following code to catch the error:\r\n\r\n```python\r\ntry:\r\n    lfc_p, lfc_T = mpcalc.lfc(P,T,Td)\r\nexcept IndexError:\r\n    pdb.set_trace()\r\n```\r\nI ran this program again and then checked variables of P, T and Td when it encounter that error.\r\n\r\nIt shows that:\r\n\r\n```\r\n(Pdb) P\r\n<Quantity([ 1004.  1000.   943.   928.   925.   850.   839.   749.   700.   699.\r\n   603.   500.   404.   400.   363.   306.   300.   250.   213.   200.\r\n   176.   150.   120.   105.   100.    70.    66.    58.    50.    40.\r\n    33.    30.    23.    20.    16.], 'hectopascal')>\r\n(Pdb) T\r\n<Quantity([ 24.2  24.   20.2  21.6  21.4  20.4  20.2  14.4  13.2  13.    6.8  -3.3\r\n -13.1 -13.7 -17.9 -25.5 -26.9 -37.9 -46.7 -48.7 -52.1 -58.9 -67.3 -66.5\r\n -66.7 -65.1 -66.1 -60.9 -60.5 -57.7 -50.1 -50.3 -50.1 -47.9 -43.1], 'degC')>\r\n(Pdb) Td\r\n<Quantity([  2.19000000e+01   2.21000000e+01   1.92000000e+01   2.05000000e+01\r\n   2.04000000e+01   1.84000000e+01   1.74000000e+01   8.40000000e+00\r\n  -2.80000000e+00  -3.00000000e+00  -1.52000000e+01  -2.03000000e+01\r\n  -2.91000000e+01  -2.77000000e+01  -2.49000000e+01  -3.95000000e+01\r\n  -4.19000000e+01  -5.19000000e+01  -6.07000000e+01  -6.27000000e+01\r\n  -6.51000000e+01  -7.19000000e+01   9.99999000e+05   9.99999000e+05\r\n   9.99999000e+05   9.99999000e+05   9.99999000e+05   9.99999000e+05\r\n   9.99999000e+05   9.99999000e+05   9.99999000e+05   9.99999000e+05\r\n   9.99999000e+05   9.99999000e+05   9.99999000e+05], 'degC')>\r\n```\r\nSo it seems that P, T and Td are all correct. After all, they are actually not axis with size 0. Most of the time, this function can run well.\r\n\r\n- Expected output : \r\n    Correct lfc_p and lfc_T.\r\n- Versions :\r\n  * Python version : 3.6.6\r\n  * MetPy version : 0.8.0\r\n"},"comment":{"url":"https://api.github.com/repos/Unidata/MetPy/issues/comments/413005386","html_url":"https://github.com/Unidata/MetPy/issues/902#issuecomment-413005386","issue_url":"https://api.github.com/repos/Unidata/MetPy/issues/902","id":413005386,"node_id":"MDEyOklzc3VlQ29tbWVudDQxMzAwNTM4Ng==","user":{"login":"dopplershift","id":221526,"node_id":"MDQ6VXNlcjIyMTUyNg==","avatar_url":"https://avatars2.githubusercontent.com/u/221526?v=4","gravatar_id":"","url":"https://api.github.com/users/dopplershift","html_url":"https://github.com/dopplershift","followers_url":"https://api.github.com/users/dopplershift/followers","following_url":"https://api.github.com/users/dopplershift/following{/other_user}","gists_url":"https://api.github.com/users/dopplershift/gists{/gist_id}","starred_url":"https://api.github.com/users/dopplershift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dopplershift/subscriptions","organizations_url":"https://api.github.com/users/dopplershift/orgs","repos_url":"https://api.github.com/users/dopplershift/repos","events_url":"https://api.github.com/users/dopplershift/events{/privacy}","received_events_url":"https://api.github.com/users/dopplershift/received_events","type":"User","site_admin":false},"created_at":"2018-08-14T20:30:00Z","updated_at":"2018-08-14T20:30:00Z","author_association":"MEMBER","body":"Right, I've got a bug fix going on this. Essentially, it comes from the fact that `parcel_profile` does not include the LCL (for good reasons); this means the assumed shape of the profile jumps directly from the point below the LCL to the point above, which causes an intersection with the ambient temperature profile that doesn't occur if you include the LCL. This breaks the assumption in `lfc`.\r\n\r\nI've got a fix locally I just need to finish up."}}
{"actor":{"display_login":"dopplershift"}}