<?xml version="1.0" encoding="utf-8"?>
<xbrl
  xml:lang="en-US"
  xmlns="http://www.xbrl.org/2003/instance"
  xmlns:dei="http://xbrl.sec.gov/dei/2022q4"
  xmlns:ecd="http://xbrl.sec.gov/ecd/2022q4"
  xmlns:iso4217="http://www.xbrl.org/2003/iso4217"
  xmlns:link="http://www.xbrl.org/2003/linkbase"
  xmlns:spsc="http://www.spscommerce.com/20230330"
  xmlns:us-gaap="http://fasb.org/us-gaap/2022"
  xmlns:xbrldi="http://xbrl.org/2006/xbrldi"
  xmlns:xlink="http://www.w3.org/1999/xlink">
    <link:schemaRef xlink:href="spsc-20230330.xsd" xlink:type="simple"/>
    <context id="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="ifc0c1e4127384ebfa7f598cc7cdec240_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i116473a238b446fc9fb76ba91f40eef9_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i3ec1ef9d05ea4a82adb2aeb1d5ce0012_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i04b1994ecdb1498488ad14058d8068a0_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i56d0d4881a644a5a964d75eefac5ad48_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i047a3f5d3f0e406082fef3babf805d76_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="ie41664f1dfdf40169473ad5726445f2f_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i5aa0b67a1170488d9d398319bf90ee22_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i0cd6ed1f381b481fad71682f12cb6330_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="ia94c072e52d54bdb81840a6c4801a31f_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="i3e672a5862a74cd5a37484c895084c2f_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="ic7f2992edaec41649b53d4816ad7862e_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:PeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="i9cb4248ce9b2454ea1fb645c8a9d45bf_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i8b3142d9abec4ba98336a980c6d50e9d_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i94a1301660204ef9b80ffd6e97e0511b_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="ie5fd3855881f40638238a1edb486507f_D20220101-20221231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="i3945adee74794af69a72d43a253eaf5b_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i5a023545c2d64d5db1982a487188a789_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i06d778fc79254d42994cabd6f692ab4c_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i3ad4497d9f3846b99dee3f1a9c787422_D20210101-20211231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="i3026f3d830b84a7c8b7761bdebc48a6b_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="i2de5bb7ff95c47e4bfb4cf67a84dd6ed_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="ia891b928e8ec4e9ca34a8df411c155ef_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="idfe72acb22b240b58bfda995dff813ac_D20200101-20201231">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <unit id="usd">
        <measure>iso4217:USD</measure>
    </unit>
    <dei:EntityCentralIndexKey
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-1">0001092699</dei:EntityCentralIndexKey>
    <dei:AmendmentFlag
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-2">false</dei:AmendmentFlag>
    <dei:DocumentType
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-3">DEF 14A</dei:DocumentType>
    <dei:EntityRegistrantName
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-4">SPS COMMERCE, INC.</dei:EntityRegistrantName>
    <ecd:PeoTotalCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-5"
      unitRef="usd">6066081</ecd:PeoTotalCompAmt>
    <ecd:PvpTableTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-6">&lt;table style="border-collapse:collapse;display:inline-table;margin-bottom:5pt;vertical-align:text-bottom;width:100.000%"&gt;&lt;tr&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:6.271%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.441%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:10.278%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.441%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:10.278%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.441%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:10.278%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.441%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:10.919%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.441%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:6.752%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.921%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:6.592%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.441%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:10.278%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.921%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:12.366%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="9" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Value of Initial Fixed $100 Investment Based On&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(3)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Year&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Summary Compensation Table Total for PEO&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(1)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Compensation Actually Paid to PEO&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(2)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Average Summary Compensation Table Total for Non-PEO NEOs&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(1)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Average Compensation Actually Paid to Non-PEO NEOs&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(2)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Company TSR ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:0 1pt"/&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Peer Group TSR&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(4)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Net Income ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Company Selected Measure: Adjusted EBITDA&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(5)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2022&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,066,081&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,501,154&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,632,052&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,919,066&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;232&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;133&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;55,134,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;132,268,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2021&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,693,464&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;14,052,465&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,829,274&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,227,613&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;257&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;207&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;44,597,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;107,015,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2020&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,810,804&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;18,046,825&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,283,287&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;8,625,470&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;196&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;150&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;45,586,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;86,994,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</ecd:PvpTableTextBlock>
    <ecd:CoSelectedMeasureName
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-7">Company Selected Measure: Adjusted EBITDA(5) ($)</ecd:CoSelectedMeasureName>
    <ecd:PeoTotalCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-8"
      unitRef="usd">6066081</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-9"
      unitRef="usd">4501154</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-10"
      unitRef="usd">3632052</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-11"
      unitRef="usd">2919066</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-12"
      unitRef="usd">232</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-13"
      unitRef="usd">133</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-14"
      unitRef="usd">55134000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-15"
      unitRef="usd">132268000</ecd:CoSelectedMeasureAmt>
    <ecd:PeoTotalCompAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-16"
      unitRef="usd">6693464</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-17"
      unitRef="usd">14052465</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-18"
      unitRef="usd">3829274</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-19"
      unitRef="usd">7227613</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-20"
      unitRef="usd">257</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-21"
      unitRef="usd">207</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-22"
      unitRef="usd">44597000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-23"
      unitRef="usd">107015000</ecd:CoSelectedMeasureAmt>
    <ecd:PeoTotalCompAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-24"
      unitRef="usd">4810804</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-25"
      unitRef="usd">18046825</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-26"
      unitRef="usd">2283287</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-27"
      unitRef="usd">8625470</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-28"
      unitRef="usd">196</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-29"
      unitRef="usd">150</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-30"
      unitRef="usd">45586000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-31"
      unitRef="usd">86994000</ecd:CoSelectedMeasureAmt>
    <ecd:NamedExecutiveOfficersFnTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-32">Archie Black</ecd:NamedExecutiveOfficersFnTextBlock>
    <ecd:AdjToPeoCompFnTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-33">&lt;table style="border-collapse:collapse;display:inline-table;margin-bottom:5pt;vertical-align:text-bottom;width:97.435%"&gt;&lt;tr&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:5.643%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:6.465%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.457%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:12.551%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.457%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:13.373%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.457%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:13.538%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.457%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:12.551%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.457%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:13.209%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:0.457%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:9.928%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Base&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Less&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Plus&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Plus or (Less)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Plus or (Less)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Total&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Year&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Summary Compensation Table - Total Compensation ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Grant Date Fair Value of Stock Awards and Option Awards Granted in Fiscal Year ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Fair Value at Fiscal Year-End of Outstanding and Unvested Stock Awards and Option Awards Granted in Fiscal Year ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Change in Fair Value of Outstanding and Unvested Stock Awards and Option Awards Granted in Prior Fiscal Years ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Change in Fair Value as of Vesting Date of Stock Awards and Option Awards Granted in Prior Fiscal Years For Which Applicable Vesting Conditions Were Satisfied During Fiscal Year ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Compensation Actually Paid ($)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" rowspan="3" style="padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;PEO&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2022&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,066,081&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(5,089,381)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;5,376,891&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(835,723)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(1,016,714)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,501,154&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;/tr&gt;&lt;tr style="height:15pt"&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2021&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,693,464&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(5,241,434)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,196,040&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;5,349,429&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;54,966&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;14,052,465&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2020&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,810,804&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(3,892,234)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;10,643,528&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;5,921,853&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;562,874&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;18,046,825&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;td colspan="3" style="padding:0 1pt"/&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" rowspan="3" style="padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Non-PEO NEO Average&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2022&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,632,052&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(2,937,683)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,103,639&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(295,785)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(583,157)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,919,066&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2021&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,829,274&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(2,821,974)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,874,330&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,301,858&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#ffffff;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;44,125&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#ffffff;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,227,613&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2020&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,283,287&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(1,658,387)&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,317,603&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,379,146&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="2" style="background-color:#dbdbdb;padding:2px 0 2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;303,821&#160;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color:#dbdbdb;padding:2px 1pt 2px 0;text-align:right;vertical-align:middle"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"/&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:right;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;8,625,470&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</ecd:AdjToPeoCompFnTextBlock>
    <ecd:PeoTotalCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-34"
      unitRef="usd">6066081</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt
      contextRef="ifc0c1e4127384ebfa7f598cc7cdec240_D20220101-20221231"
      decimals="0"
      id="f-35"
      unitRef="usd">-5089381</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i116473a238b446fc9fb76ba91f40eef9_D20220101-20221231"
      decimals="0"
      id="f-36"
      unitRef="usd">5376891</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i3ec1ef9d05ea4a82adb2aeb1d5ce0012_D20220101-20221231"
      decimals="0"
      id="f-37"
      unitRef="usd">-835723</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i04b1994ecdb1498488ad14058d8068a0_D20220101-20221231"
      decimals="0"
      id="f-38"
      unitRef="usd">-1016714</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-39"
      unitRef="usd">4501154</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoTotalCompAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-40"
      unitRef="usd">6693464</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i56d0d4881a644a5a964d75eefac5ad48_D20210101-20211231"
      decimals="0"
      id="f-41"
      unitRef="usd">-5241434</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i047a3f5d3f0e406082fef3babf805d76_D20210101-20211231"
      decimals="0"
      id="f-42"
      unitRef="usd">7196040</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="ie41664f1dfdf40169473ad5726445f2f_D20210101-20211231"
      decimals="0"
      id="f-43"
      unitRef="usd">5349429</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i5aa0b67a1170488d9d398319bf90ee22_D20210101-20211231"
      decimals="0"
      id="f-44"
      unitRef="usd">54966</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-45"
      unitRef="usd">14052465</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoTotalCompAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-46"
      unitRef="usd">4810804</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i0cd6ed1f381b481fad71682f12cb6330_D20200101-20201231"
      decimals="0"
      id="f-47"
      unitRef="usd">-3892234</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="ia94c072e52d54bdb81840a6c4801a31f_D20200101-20201231"
      decimals="0"
      id="f-48"
      unitRef="usd">10643528</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i3e672a5862a74cd5a37484c895084c2f_D20200101-20201231"
      decimals="0"
      id="f-49"
      unitRef="usd">5921853</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="ic7f2992edaec41649b53d4816ad7862e_D20200101-20201231"
      decimals="0"
      id="f-50"
      unitRef="usd">562874</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-51"
      unitRef="usd">18046825</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-52"
      unitRef="usd">3632052</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i9cb4248ce9b2454ea1fb645c8a9d45bf_D20220101-20221231"
      decimals="0"
      id="f-53"
      unitRef="usd">-2937683</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i8b3142d9abec4ba98336a980c6d50e9d_D20220101-20221231"
      decimals="0"
      id="f-54"
      unitRef="usd">3103639</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i94a1301660204ef9b80ffd6e97e0511b_D20220101-20221231"
      decimals="0"
      id="f-55"
      unitRef="usd">-295785</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="ie5fd3855881f40638238a1edb486507f_D20220101-20221231"
      decimals="0"
      id="f-56"
      unitRef="usd">-583157</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      decimals="0"
      id="f-57"
      unitRef="usd">2919066</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-58"
      unitRef="usd">3829274</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i3945adee74794af69a72d43a253eaf5b_D20210101-20211231"
      decimals="0"
      id="f-59"
      unitRef="usd">-2821974</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i5a023545c2d64d5db1982a487188a789_D20210101-20211231"
      decimals="0"
      id="f-60"
      unitRef="usd">3874330</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i06d778fc79254d42994cabd6f692ab4c_D20210101-20211231"
      decimals="0"
      id="f-61"
      unitRef="usd">2301858</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i3ad4497d9f3846b99dee3f1a9c787422_D20210101-20211231"
      decimals="0"
      id="f-62"
      unitRef="usd">44125</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt
      contextRef="i7d8645ed375f48f9b9ed873958b9d95a_D20210101-20211231"
      decimals="0"
      id="f-63"
      unitRef="usd">7227613</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-64"
      unitRef="usd">2283287</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i3026f3d830b84a7c8b7761bdebc48a6b_D20200101-20201231"
      decimals="0"
      id="f-65"
      unitRef="usd">-1658387</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="i2de5bb7ff95c47e4bfb4cf67a84dd6ed_D20200101-20201231"
      decimals="0"
      id="f-66"
      unitRef="usd">4317603</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="ia891b928e8ec4e9ca34a8df411c155ef_D20200101-20201231"
      decimals="0"
      id="f-67"
      unitRef="usd">3379146</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt
      contextRef="idfe72acb22b240b58bfda995dff813ac_D20200101-20201231"
      decimals="0"
      id="f-68"
      unitRef="usd">303821</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt
      contextRef="ib6abed8e064a41dabd6b9f8acbfbea0d_D20200101-20201231"
      decimals="0"
      id="f-69"
      unitRef="usd">8625470</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:PeerGroupIssuersFnTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-70">Our selected Peer Group is the Nasdaq Computer Index, an independently prepared market capitalization weighted index, and which is the same industry index used in our stock price performance graph in our Form 10-K for the fiscal year ended December 31, 2022.</ecd:PeerGroupIssuersFnTextBlock>
    <ecd:CompActuallyPaidVsCoSelectedMeasureTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-71">&lt;img alt="spsc-20230330_g40.jpg" src="spsc-20230330_g40.jpg" style="height:380px;margin-bottom:5pt;vertical-align:text-bottom;width:613px"/&gt;</ecd:CompActuallyPaidVsCoSelectedMeasureTextBlock>
    <ecd:CompActuallyPaidVsNetIncomeTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-72">&lt;img alt="spsc-20230330_g40.jpg" src="spsc-20230330_g40.jpg" style="height:380px;margin-bottom:5pt;vertical-align:text-bottom;width:613px"/&gt;</ecd:CompActuallyPaidVsNetIncomeTextBlock>
    <ecd:CompActuallyPaidVsTotalShareholderRtnTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-73">&lt;img alt="spsc-20230330_g41.jpg" src="spsc-20230330_g41.jpg" style="height:380px;margin-bottom:5pt;vertical-align:text-bottom;width:613px"/&gt;</ecd:CompActuallyPaidVsTotalShareholderRtnTextBlock>
    <ecd:Additional402vDisclosureTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-74">&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:10pt;font-weight:400;line-height:120%"&gt;We believe the Compensation Actually Paid in each of the years reported above and over the three-year cumulative period are reflective of the Compensation &amp;amp; Talent Committee&#x2019;s emphasis on &#x201c;pay-for-performance&#x201d; as the Compensation Actually Paid fluctuated year-over-year, primarily due our stock price and varying levels of achievement against pre-established performance goals under our Management Incentive Plan and equity program, including our Adjusted EBITDA and TSR performance.&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:12pt;font-weight:400;line-height:120%"&gt; &lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:10pt;font-weight:400;line-height:120%"&gt;Due to the leverage of our executive compensation program toward long-term incentives through grants of PSUs and RSUs, the Compensation Actually Paid is most significantly impacted by changes in our stock price over the vesting period of the awards. The Compensation Discussion and Analysis section of this Proxy Statement describes in greater detail the Compensation &amp;amp; Talent Committee&#x2019;s emphasis on &#x201c;pay-for-performance&#x201d; and how our executive compensation program is designed to link executive compensation with the achievement of our financial and strategic objectives as well as stockholder value creation.&lt;/span&gt;</ecd:Additional402vDisclosureTextBlock>
    <ecd:TabularListTableTextBlock
      contextRef="i9aa3f8d9b4174f0881093ddcda9735e3_D20220101-20221231"
      id="f-75">&lt;table style="border-collapse:collapse;display:inline-table;margin-bottom:5pt;vertical-align:text-bottom;width:26.442%"&gt;&lt;tr&gt;&lt;td style="width:1.0%"/&gt;&lt;td style="width:98.900%"/&gt;&lt;td style="width:0.1%"/&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:11pt;font-weight:400;line-height:120%"&gt;TSR&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:11pt;font-weight:400;line-height:120%"&gt;Adjusted EBITDA&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7.15pt;font-weight:400;line-height:120%;position:relative;top:-3.85pt;vertical-align:baseline"&gt;(1)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:11pt;font-weight:400;line-height:120%"&gt;Revenue&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</ecd:TabularListTableTextBlock>
</xbrl>
