docs: def set_lock_code(ctx, lock_code, new_lock_code, clear, generate, force):
      """
      Set or change the configuration lock code.
  
      A lock code may be used to protect the application configuration.
      The lock code must be a 32 characters (16 bytes) hex value.
      """
  
      dev = ctx.obj['dev']
  
      def prompt_new_lock_code():
          return prompt_lock_code(prompt='Enter your new lock code')
  
      def prompt_current_lock_code():
          return prompt_lock_code(prompt='Enter your current lock code')
  
      def change_lock_code(lock_code, new_lock_code):
          lock_code = _parse_lock_code(ctx, lock_code)
          new_lock_code = _parse_lock_code(ctx, new_lock_code)
          try:
              dev.write_config(
                  device_config(
                      config_lock=new_lock_code),
                  reboot=True,
                  lock_key=lock_code)
          except Exception as e:
              logger.error('Changing the lock code failed', exc_info=e)
              ctx.fail('Failed to change the lock code. Wrong current code?')
  
      def set_lock_code(new_lock_code):
          new_lock_code = _parse_lock_code(ctx, new_lock_code)
          try:
              dev.write_config(
                  device_config(
                      config_lock=new_lock_code),
                  reboot=True)
          except Exception as e:
              logger.error('Setting the lock code failed', exc_info=e)
              ctx.fail('Failed to set the lock code.')
  
      if generate and new_lock_code:
          ctx.fail('Invalid options: --new-lock-code conflicts with --generate.')
  
      if clear:
          new_lock_code = CLEAR_LOCK_CODE
  
      if generate:
          new_lock_code = b2a_hex(os.urandom(16)).decode('utf-8')
          click.echo(
              'Using a randomly generated lock code: {}'.format(new_lock_code))
          force or click.confirm(
              'Lock configuration with this lock code?', abort=True, err=True)
  
      if dev.config.configuration_locked:
          if lock_code:
              if new_lock_code:
                  change_lock_code(lock_code, new_lock_code)
              else:
                  new_lock_code = prompt_new_lock_code()
                  change_lock_code(lock_code, new_lock_code)
          else:
              if new_lock_code:
                  lock_code = prompt_current_lock_code()
                  change_lock_code(lock_code, new_lock_code)
              else:
                  lock_code = prompt_current_lock_code()
                  new_lock_code = prompt_new_lock_code()
                  change_lock_code(lock_code, new_lock_code)
      else:
          if lock_code:
              ctx.fail(
                  'There is no current lock code set. '
                  'Use --new-lock-code to set one.')
          else:
              if new_lock_code:
                  set_lock_code(new_lock_code)
              else:
                  new_lock_code = prompt_new_lock_code()
                  set_lock_code(new_lock_code)