code: function generateCodeDescr(producerId, batchId, id, sign, ver) {
      let descr = 0; //this is version 0 code description
  
      descr = descr | ((typeof ver === 'undefined' ? VERSION : ver) << 6);
  
      if (producerId.length > 5) return '';
      let producerIdLength = producerId.length - 2;
      descr = descr | (producerIdLength << 4);
  
      if (batchId.length > 10) return '';
      let batchIdLength = batchId.length - 3;
      descr = descr | (batchIdLength << 1);
  
      if (sign.length !== 4) return '';
      // if (sign.length !== 4 && sign.length !== 6) return '';
      if (sign.length === 6) descr = descr | 1;
  
      return b36.int2Str36(descr).padStart(2, '0');
  }
docs: code consists of 2 36 capacity digits representing 1296 values, so we can use 10 bits (1023) binary structure
  descr structure:
  first 4 bits - version 0 - 15
  next  2 bits - producer code length extension 0 - 3 (assuming min 2 digits producerId length can vary from 2 to 5)
  next  3 bits - batch code length extension 0 - 7 (assuming min 3 digits batchId length can vary from 3 to 10)
  last  1 bit  - indicates code digital sign length extention (asume base length 4 digits extended sign will be 6) (not actual)
  @param {string} producerId
  @param {string} batchId
  @param {string} id
  @param sign
  @param {number} [ver]
  @returns {string}