<?xml version="1.0" ?>
<informationTable xsi:schemaLocation="http://www.sec.gov/edgar/document/thirteenf/informationtable eis_13FDocument.xsd" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:n1="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <infoTable>
    <nameOfIssuer>3M CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>88579Y101</cusip>
    <value>625</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4580</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4060</Sole>
      <Shared>0</Shared>
      <None>520</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AAON INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.004</titleOfClass>
    <cusip>000360206</cusip>
    <value>77939</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1612978</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1609411</Sole>
      <Shared>0</Shared>
      <None>3567</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBOTT LABS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>002824100</cusip>
    <value>709</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8990</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8990</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBVIE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00287Y109</cusip>
    <value>605</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7935</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7935</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ACI WORLDWIDE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>004498101</cusip>
    <value>66391</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2749111</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2729111</Sole>
      <Shared>0</Shared>
      <None>20000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ADOBE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00724F101</cusip>
    <value>398</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1080</Sole>
      <Shared>0</Shared>
      <None>170</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALBANY INTL CORP</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>012348108</cusip>
    <value>39370</value>
    <shrsOrPrnAmt>
      <sshPrnamt>831811</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>829958</Sole>
      <Shared>0</Shared>
      <None>1853</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALIGN TECHNOLOGY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>016255101</cusip>
    <value>328</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1887</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1887</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL A</titleOfClass>
    <cusip>02079K305</cusip>
    <value>238</value>
    <shrsOrPrnAmt>
      <sshPrnamt>205</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>60</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL C</titleOfClass>
    <cusip>02079K107</cusip>
    <value>238</value>
    <shrsOrPrnAmt>
      <sshPrnamt>205</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>60</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALTAIR ENGR INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>021369103</cusip>
    <value>53870</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2032827</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2014077</Sole>
      <Shared>0</Shared>
      <None>18750</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AMGEN INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>031162100</cusip>
    <value>270</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1330</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ANSYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03662Q105</cusip>
    <value>9219</value>
    <shrsOrPrnAmt>
      <sshPrnamt>39658</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>36188</Sole>
      <Shared>0</Shared>
      <None>3470</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>APPLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>037833100</cusip>
    <value>631</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2480</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1560</Sole>
      <Shared>0</Shared>
      <None>920</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AXON ENTERPRISE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>05464C101</cusip>
    <value>62607</value>
    <shrsOrPrnAmt>
      <sshPrnamt>884661</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>871581</Sole>
      <Shared>0</Shared>
      <None>13080</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BALCHEM CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>057665200</cusip>
    <value>83592</value>
    <shrsOrPrnAmt>
      <sshPrnamt>846760</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>838852</Sole>
      <Shared>0</Shared>
      <None>7908</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIOLIFE SOLUTIONS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>09062W204</cusip>
    <value>290</value>
    <shrsOrPrnAmt>
      <sshPrnamt>30560</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>30560</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIO-TECHNE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09073M104</cusip>
    <value>66581</value>
    <shrsOrPrnAmt>
      <sshPrnamt>351128</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>346451</Sole>
      <Shared>0</Shared>
      <None>4677</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKBAUD INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09227Q100</cusip>
    <value>59160</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1064981</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1053812</Sole>
      <Shared>0</Shared>
      <None>11169</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKLINE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09239B109</cusip>
    <value>81451</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1548212</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1544837</Sole>
      <Shared>0</Shared>
      <None>3375</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BOTTOMLINE TECH DEL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>101388106</cusip>
    <value>73284</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1999564</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1984009</Sole>
      <Shared>0</Shared>
      <None>15555</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BRIGHT HORIZONS FAM SOL IN D</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>109194100</cusip>
    <value>12388</value>
    <shrsOrPrnAmt>
      <sshPrnamt>121454</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>110509</Sole>
      <Shared>0</Shared>
      <None>10945</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CANTEL MEDICAL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>138098108</cusip>
    <value>27210</value>
    <shrsOrPrnAmt>
      <sshPrnamt>757939</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>756293</Sole>
      <Shared>0</Shared>
      <None>1646</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CAREDX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>14167L103</cusip>
    <value>574</value>
    <shrsOrPrnAmt>
      <sshPrnamt>26305</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>26305</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CASELLA WASTE SYS INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>147448104</cusip>
    <value>76558</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1960005</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1937775</Sole>
      <Shared>0</Shared>
      <None>22230</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEMBIO DIAGNOSTICS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>163572209</cusip>
    <value>631</value>
    <shrsOrPrnAmt>
      <sshPrnamt>123155</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>123155</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEVRON CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>166764100</cusip>
    <value>215</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2974</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2974</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CODEXIS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192005106</cusip>
    <value>599</value>
    <shrsOrPrnAmt>
      <sshPrnamt>53635</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>53635</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COGNEX CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192422103</cusip>
    <value>6927</value>
    <shrsOrPrnAmt>
      <sshPrnamt>164066</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>148911</Sole>
      <Shared>0</Shared>
      <None>15155</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CONSTRUCTION PARTNERS INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>21044C107</cusip>
    <value>61271</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3627622</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3584484</Sole>
      <Shared>0</Shared>
      <None>43138</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COPART INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>217204106</cusip>
    <value>6867</value>
    <shrsOrPrnAmt>
      <sshPrnamt>100212</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>91382</Sole>
      <Shared>0</Shared>
      <None>8830</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTAR GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160N109</cusip>
    <value>898</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1530</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1530</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTCO WHSL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160K105</cusip>
    <value>657</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2305</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1770</Sole>
      <Shared>0</Shared>
      <None>535</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CRYOPORT INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.001</titleOfClass>
    <cusip>229050307</cusip>
    <value>673</value>
    <shrsOrPrnAmt>
      <sshPrnamt>39420</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>39420</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DANAHER CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>235851102</cusip>
    <value>235</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1695</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1255</Sole>
      <Shared>0</Shared>
      <None>440</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DESCARTES SYS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>249906108</cusip>
    <value>100361</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2918325</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2888590</Sole>
      <Shared>0</Shared>
      <None>29735</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DIGI INTL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>253798102</cusip>
    <value>373</value>
    <shrsOrPrnAmt>
      <sshPrnamt>39100</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>39100</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOLBY LABORATORIES INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>25659T107</cusip>
    <value>326</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6018</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5518</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DORMAN PRODUCTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>258278100</cusip>
    <value>44945</value>
    <shrsOrPrnAmt>
      <sshPrnamt>813198</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>811398</Sole>
      <Shared>0</Shared>
      <None>1800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOUGLAS DYNAMICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>25960R105</cusip>
    <value>75659</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2130646</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2101795</Sole>
      <Shared>0</Shared>
      <None>28851</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ECOLAB INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>278865100</cusip>
    <value>205</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1315</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>735</Sole>
      <Shared>0</Shared>
      <None>580</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESCO TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>296315104</cusip>
    <value>67080</value>
    <shrsOrPrnAmt>
      <sshPrnamt>883683</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>881707</Sole>
      <Shared>0</Shared>
      <None>1976</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESSENTIAL UTILS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>29670G102</cusip>
    <value>248</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6087</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5387</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVI INDUSTRIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>26929N102</cusip>
    <value>14180</value>
    <shrsOrPrnAmt>
      <sshPrnamt>898630</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>881640</Sole>
      <Shared>0</Shared>
      <None>16990</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVOLENT HEALTH INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>30050B101</cusip>
    <value>349</value>
    <shrsOrPrnAmt>
      <sshPrnamt>64340</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>64340</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXPONENT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30214U102</cusip>
    <value>122602</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1704937</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1686957</Sole>
      <Shared>0</Shared>
      <None>17980</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXXON MOBIL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30231G102</cusip>
    <value>708</value>
    <shrsOrPrnAmt>
      <sshPrnamt>18654</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18504</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FACTSET RESH SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303075105</cusip>
    <value>514</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1971</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1971</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FAIR ISAAC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303250104</cusip>
    <value>9432</value>
    <shrsOrPrnAmt>
      <sshPrnamt>30655</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>27775</Sole>
      <Shared>0</Shared>
      <None>2880</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FASTENAL CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>311900104</cusip>
    <value>848</value>
    <shrsOrPrnAmt>
      <sshPrnamt>27127</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23027</Sole>
      <Shared>0</Shared>
      <None>4100</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIRSTSERVICE CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>33767E202</cusip>
    <value>59420</value>
    <shrsOrPrnAmt>
      <sshPrnamt>770487</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>760039</Sole>
      <Shared>0</Shared>
      <None>10448</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIVE9 INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>338307101</cusip>
    <value>38156</value>
    <shrsOrPrnAmt>
      <sshPrnamt>499035</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>497910</Sole>
      <Shared>0</Shared>
      <None>1125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FORTINET INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>34959E109</cusip>
    <value>580</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5733</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5733</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FOX FACTORY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>35138V102</cusip>
    <value>67110</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1597856</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1594331</Sole>
      <Shared>0</Shared>
      <None>3525</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARMIN LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>H2906T109</cusip>
    <value>343</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3870</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARTNER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>366651107</cusip>
    <value>4945</value>
    <shrsOrPrnAmt>
      <sshPrnamt>49663</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>44938</Sole>
      <Shared>0</Shared>
      <None>4725</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRACO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>384109104</cusip>
    <value>8868</value>
    <shrsOrPrnAmt>
      <sshPrnamt>181990</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>166165</Sole>
      <Shared>0</Shared>
      <None>15825</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRAND CANYON ED INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>38526M106</cusip>
    <value>64956</value>
    <shrsOrPrnAmt>
      <sshPrnamt>851486</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>843536</Sole>
      <Shared>0</Shared>
      <None>7950</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GUIDEWIRE SOFTWARE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>40171V100</cusip>
    <value>10013</value>
    <shrsOrPrnAmt>
      <sshPrnamt>126252</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>114762</Sole>
      <Shared>0</Shared>
      <None>11490</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEALTH CATALYST INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42225T107</cusip>
    <value>5683</value>
    <shrsOrPrnAmt>
      <sshPrnamt>217342</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>197617</Sole>
      <Shared>0</Shared>
      <None>19725</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEICO CORP NEW</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>422806208</cusip>
    <value>10318</value>
    <shrsOrPrnAmt>
      <sshPrnamt>161471</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>147321</Sole>
      <Shared>0</Shared>
      <None>14150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HELIOS TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42328H109</cusip>
    <value>56274</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1484014</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1480799</Sole>
      <Shared>0</Shared>
      <None>3215</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HENRY JACK &amp; ASSOC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>426281101</cusip>
    <value>13964</value>
    <shrsOrPrnAmt>
      <sshPrnamt>89951</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>81751</Sole>
      <Shared>0</Shared>
      <None>8200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HOME DEPOT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>437076102</cusip>
    <value>224</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1200</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1200</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IAA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>449253103</cusip>
    <value>5038</value>
    <shrsOrPrnAmt>
      <sshPrnamt>168143</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>153243</Sole>
      <Shared>0</Shared>
      <None>14900</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IDEXX LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>45168D104</cusip>
    <value>309</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1275</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1275</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IHS MARKIT LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G47567105</cusip>
    <value>1179</value>
    <shrsOrPrnAmt>
      <sshPrnamt>19650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17212</Sole>
      <Shared>0</Shared>
      <None>2438</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEGRA LIFESCIENCES HLDGS C</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>457985208</cusip>
    <value>223</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>458140100</cusip>
    <value>373</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6900</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6400</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTERNATIONAL BUSINESS MACHS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>459200101</cusip>
    <value>248</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2235</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2235</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTRICON CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46121H109</cusip>
    <value>385</value>
    <shrsOrPrnAmt>
      <sshPrnamt>32700</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>32700</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTUIT</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>461202103</cusip>
    <value>420</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1825</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1605</Sole>
      <Shared>0</Shared>
      <None>220</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IPG PHOTONICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>44980X109</cusip>
    <value>289</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2625</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2625</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ISHARES TR</nameOfIssuer>
    <titleOfClass>RUS 2000 GRW ETF</titleOfClass>
    <cusip>464287648</cusip>
    <value>791</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHN BEAN TECHNOLOGIES CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>477839104</cusip>
    <value>47499</value>
    <shrsOrPrnAmt>
      <sshPrnamt>639545</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>631046</Sole>
      <Shared>0</Shared>
      <None>8499</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHNSON &amp; JOHNSON</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>478160104</cusip>
    <value>422</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3216</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2516</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JPMORGAN CHASE &amp; CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46625H100</cusip>
    <value>247</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2741</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2341</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>KIMBERLY CLARK CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>494368103</cusip>
    <value>543</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4250</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LCI INDS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>50189K103</cusip>
    <value>4522</value>
    <shrsOrPrnAmt>
      <sshPrnamt>67658</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>60953</Sole>
      <Shared>0</Shared>
      <None>6705</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LEMAITRE VASCULAR INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>525558201</cusip>
    <value>42889</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1721081</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1717231</Sole>
      <Shared>0</Shared>
      <None>3850</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LIGAND PHARMACEUTICALS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>53220K504</cusip>
    <value>47166</value>
    <shrsOrPrnAmt>
      <sshPrnamt>648603</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>641818</Sole>
      <Shared>0</Shared>
      <None>6785</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LINDE PLC</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G5494J103</cusip>
    <value>482</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2785</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2165</Sole>
      <Shared>0</Shared>
      <None>620</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MARKEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>570535104</cusip>
    <value>764</value>
    <shrsOrPrnAmt>
      <sshPrnamt>824</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>674</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MASTERCARD INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>57636Q104</cusip>
    <value>293</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1215</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1065</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCK &amp; CO. INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58933Y105</cusip>
    <value>512</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6650</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCURY SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589378108</cusip>
    <value>118901</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1666683</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1647768</Sole>
      <Shared>0</Shared>
      <None>18915</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERIT MED SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589889104</cusip>
    <value>49808</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1593852</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1577745</Sole>
      <Shared>0</Shared>
      <None>16107</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MESA LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>59064R109</cusip>
    <value>101801</value>
    <shrsOrPrnAmt>
      <sshPrnamt>450269</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>449832</Sole>
      <Shared>0</Shared>
      <None>437</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MGP INGREDIENTS INC NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>55303J106</cusip>
    <value>14364</value>
    <shrsOrPrnAmt>
      <sshPrnamt>534183</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>533039</Sole>
      <Shared>0</Shared>
      <None>1144</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MICROSOFT CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>594918104</cusip>
    <value>733</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4649</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4039</Sole>
      <Shared>0</Shared>
      <None>610</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NANOSTRING TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>63009R109</cusip>
    <value>539</value>
    <shrsOrPrnAmt>
      <sshPrnamt>22395</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>22395</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NATIONAL RESH CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>637372202</cusip>
    <value>28093</value>
    <shrsOrPrnAmt>
      <sshPrnamt>617710</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>616206</Sole>
      <Shared>0</Shared>
      <None>1504</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>640491106</cusip>
    <value>110902</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1655497</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1636988</Sole>
      <Shared>0</Shared>
      <None>18509</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NIKE INC</nameOfIssuer>
    <titleOfClass>CL B</titleOfClass>
    <cusip>654106103</cusip>
    <value>238</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2875</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2255</Sole>
      <Shared>0</Shared>
      <None>620</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NOVANTA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>67000B104</cusip>
    <value>76781</value>
    <shrsOrPrnAmt>
      <sshPrnamt>961209</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>959084</Sole>
      <Shared>0</Shared>
      <None>2125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NV5 GLOBAL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>62945V109</cusip>
    <value>628</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15205</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>15205</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMEGA FLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>682095104</cusip>
    <value>29656</value>
    <shrsOrPrnAmt>
      <sshPrnamt>351375</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>350559</Sole>
      <Shared>0</Shared>
      <None>816</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMNICELL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68213N109</cusip>
    <value>109241</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1665760</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1645630</Sole>
      <Shared>0</Shared>
      <None>20130</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ORTHOPEDIATRICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68752L100</cusip>
    <value>632</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15945</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>15945</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PALOMAR HLDGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>69753M105</cusip>
    <value>416</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7150</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7150</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PAYLOCITY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>70438V106</cusip>
    <value>60880</value>
    <shrsOrPrnAmt>
      <sshPrnamt>689308</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>687793</Sole>
      <Shared>0</Shared>
      <None>1515</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PFIZER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>717081103</cusip>
    <value>558</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17108</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17108</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PLURALSIGHT INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>72941B106</cusip>
    <value>4143</value>
    <shrsOrPrnAmt>
      <sshPrnamt>377343</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>344338</Sole>
      <Shared>0</Shared>
      <None>33005</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>POOL CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>73278L105</cusip>
    <value>12812</value>
    <shrsOrPrnAmt>
      <sshPrnamt>65113</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>59063</Sole>
      <Shared>0</Shared>
      <None>6050</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROCTER &amp; GAMBLE CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>742718109</cusip>
    <value>433</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3940</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3740</Sole>
      <Shared>0</Shared>
      <None>200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROS HOLDINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74346Y103</cusip>
    <value>58216</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1876128</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1872003</Sole>
      <Shared>0</Shared>
      <None>4125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROTO LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>743713109</cusip>
    <value>43432</value>
    <shrsOrPrnAmt>
      <sshPrnamt>570501</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>569276</Sole>
      <Shared>0</Shared>
      <None>1225</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>RBC BEARINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>75524B104</cusip>
    <value>57902</value>
    <shrsOrPrnAmt>
      <sshPrnamt>513361</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>506196</Sole>
      <Shared>0</Shared>
      <None>7165</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>REALPAGE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>75606N109</cusip>
    <value>2763</value>
    <shrsOrPrnAmt>
      <sshPrnamt>52210</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>47460</Sole>
      <Shared>0</Shared>
      <None>4750</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>REPLIGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>759916109</cusip>
    <value>129638</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1342839</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1328164</Sole>
      <Shared>0</Shared>
      <None>14675</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROGERS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775133101</cusip>
    <value>52740</value>
    <shrsOrPrnAmt>
      <sshPrnamt>558570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>557310</Sole>
      <Shared>0</Shared>
      <None>1260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROLLINS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775711104</cusip>
    <value>14240</value>
    <shrsOrPrnAmt>
      <sshPrnamt>394018</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>360111</Sole>
      <Shared>0</Shared>
      <None>33907</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROPER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>776696106</cusip>
    <value>410</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1315</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1045</Sole>
      <Shared>0</Shared>
      <None>270</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SHOTSPOTTER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82536T107</cusip>
    <value>623</value>
    <shrsOrPrnAmt>
      <sshPrnamt>22680</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>22680</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMPSON MANUFACTURING CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829073105</cusip>
    <value>83917</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1353935</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1342519</Sole>
      <Shared>0</Shared>
      <None>11416</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMULATIONS PLUS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829214105</cusip>
    <value>508</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14555</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>14555</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SITEONE LANDSCAPE SUPPLY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82982L103</cusip>
    <value>78870</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1071318</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1057883</Sole>
      <Shared>0</Shared>
      <None>13435</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMUCKER J M CO</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>832696405</cusip>
    <value>456</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4105</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3325</Sole>
      <Shared>0</Shared>
      <None>780</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPS COMMERCE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78463M107</cusip>
    <value>63106</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1356828</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1343853</Sole>
      <Shared>0</Shared>
      <None>12975</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TELEFLEX INCORPORATED</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>879369106</cusip>
    <value>9799</value>
    <shrsOrPrnAmt>
      <sshPrnamt>33459</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>30484</Sole>
      <Shared>0</Shared>
      <None>2975</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRACTOR SUPPLY CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>892356106</cusip>
    <value>537</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6345</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5495</Sole>
      <Shared>0</Shared>
      <None>850</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TREX CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89531P105</cusip>
    <value>84447</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1053745</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1042120</Sole>
      <Shared>0</Shared>
      <None>11625</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRIMBLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>896239100</cusip>
    <value>396</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12429</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12429</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TWIST BIOSCIENCE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90184D100</cusip>
    <value>625</value>
    <shrsOrPrnAmt>
      <sshPrnamt>20425</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>20425</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TYLER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>902252105</cusip>
    <value>57357</value>
    <shrsOrPrnAmt>
      <sshPrnamt>193407</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>189667</Sole>
      <Shared>0</Shared>
      <None>3740</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>U S PHYSICAL THERAPY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90337L108</cusip>
    <value>423</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6130</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6130</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNION PAC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>907818108</cusip>
    <value>752</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5332</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5332</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VAIL RESORTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>91879Q109</cusip>
    <value>8935</value>
    <shrsOrPrnAmt>
      <sshPrnamt>60492</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>55827</Sole>
      <Shared>0</Shared>
      <None>4665</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VEEVA SYS INC</nameOfIssuer>
    <titleOfClass>CL A COM</titleOfClass>
    <cusip>922475108</cusip>
    <value>356</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2275</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2275</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERICEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92346J108</cusip>
    <value>533</value>
    <shrsOrPrnAmt>
      <sshPrnamt>58150</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>58150</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERISK ANALYTICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92345Y106</cusip>
    <value>871</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6247</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5867</Sole>
      <Shared>0</Shared>
      <None>380</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERIZON COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92343V104</cusip>
    <value>203</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3773</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3773</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VOCERA COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92857F107</cusip>
    <value>63901</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3008539</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3005514</Sole>
      <Shared>0</Shared>
      <None>3025</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WASTE CONNECTIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>94106B101</cusip>
    <value>259</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3340</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2850</Sole>
      <Shared>0</Shared>
      <None>490</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WATSCO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>942622200</cusip>
    <value>8198</value>
    <shrsOrPrnAmt>
      <sshPrnamt>51874</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>46724</Sole>
      <Shared>0</Shared>
      <None>5150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WD-40 CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929236107</cusip>
    <value>52352</value>
    <shrsOrPrnAmt>
      <sshPrnamt>260650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>260106</Sole>
      <Shared>0</Shared>
      <None>544</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WEST PHARMACEUTICAL SVSC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>955306105</cusip>
    <value>12427</value>
    <shrsOrPrnAmt>
      <sshPrnamt>81625</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>74655</Sole>
      <Shared>0</Shared>
      <None>6970</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WILLDAN GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>96924N100</cusip>
    <value>561</value>
    <shrsOrPrnAmt>
      <sshPrnamt>26255</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>26255</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WP CAREY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92936U109</cusip>
    <value>282</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4850</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3850</Sole>
      <Shared>0</Shared>
      <None>1000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>XYLEM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>98419M100</cusip>
    <value>367</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5640</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4420</Sole>
      <Shared>0</Shared>
      <None>1220</None>
    </votingAuthority>
  </infoTable>
</informationTable>
