async def METHOD_NAME(self, amodel: ConcActionModel, data: KwicPageData, args: SaveConcArgs):
    output = asdict(data)
    output['from_line'] = int(args.from_line)
    output['to_line'] = min(args.to_line, data.concsize)
    output['heading'] = args.heading
    output['numbering'] = args.numbering
    output['align_kwic'] = args.align_kwic
    output['human_corpname'] = amodel.corp.human_readable_corpname
    output['usesubcorp'] = amodel.args.usesubcorp
    if args.align_kwic:
        kwic_lengths = [len(' '.join(k['str'] for k in line['Kwic'])) for line in data.Lines]
        max_kwic_length = max(kwic_lengths)
        output['kwic_spaces'] = [' ' * (max_kwic_length - l) for l in kwic_lengths]
    for line in data.Lines:
        line['ref'] = ', '.join(line['ref'])
    # we must set contains_within = False as it is impossible (in the current user interface)
    # to offer a custom i.p.m. calculation before the download starts
    output['result_relative_freq_rel_to'] = _get_ipm_base_set_desc(
        amodel.corp, contains_within=False, translate=amodel.plugin_ctx.translate)
    output['Desc'] = await amodel.concdesc_json()
    amodel.update_output_with_group_info(output)
    template = self._template_env.get_template('txt_conc.jinja2')
    self._data = await template.render_async(output)