text: /**
   * Example of acme.Client.auto()
   */
  
  const acme = require('./../');
  
  // const Promise = require('bluebird');
  // const fs = Promise.promisifyAll(require('fs'));
  
  
  function log(m) {
      process.stdout.write(`${m}\n`);
  }
  
  
  /**
   * Function used to satisfy an ACME challenge
   *
   * @param {object} authz Authorization object
   * @param {object} challenge Selected challenge
   * @param {string} keyAuthorization Authorization key
   * @returns {Promise}
   */
  
  async function challengeCreateFn(authz, challenge, keyAuthorization) {
      log('Triggered challengeCreateFn()');
  
      /* http-01 */
      if (challenge.type === 'http-01') {
          const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`;
          const fileContents = keyAuthorization;
  
          log(`Creating challenge response for ${authz.identifier.value} at path: ${filePath}`);
  
          /* Replace this */
          log(`Would write "${fileContents}" to path "${filePath}"`);
          // await fs.writeFileAsync(filePath, fileContents);
      }
  
      /* dns-01 */
      else if (challenge.type === 'dns-01') {
          const dnsRecord = `_acme-challenge.${authz.identifier.value}`;
          const recordValue = keyAuthorization;
  
          log(`Creating TXT record for ${authz.identifier.value}: ${dnsRecord}`);
  
          /* Replace this */
          log(`Would create TXT record "${dnsRecord}" with value "${recordValue}"`);
          // await dnsProvider.createRecord(dnsRecord, 'TXT', recordValue);
      }
  }
  
  
  /**
   * Function used to remove an ACME challenge response
   *
   * @param {object} authz Authorization object
   * @param {object} challenge Selected challenge
   * @param {string} keyAuthorization Authorization key
   * @returns {Promise}
   */
  
  async function challengeRemoveFn(authz, challenge, keyAuthorization) {
      log('Triggered challengeRemoveFn()');
  
      /* http-01 */
      if (challenge.type === 'http-01') {
          const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`;
  
          log(`Removing challenge response for ${authz.identifier.value} at path: ${filePath}`);
  
          /* Replace this */
          log(`Would remove file on path "${filePath}"`);
          // await fs.unlinkAsync(filePath);
      }
  
      /* dns-01 */
      else if (challenge.type === 'dns-01') {
          const dnsRecord = `_acme-challenge.${authz.identifier.value}`;
          const recordValue = keyAuthorization;
  
          log(`Removing TXT record for ${authz.identifier.value}: ${dnsRecord}`);
  
          /* Replace this */
          log(`Would remove TXT record "${dnsRecord}" with value "${recordValue}"`);
          // await dnsProvider.removeRecord(dnsRecord, 'TXT');
      }
  }
  
  
  /**
   * Main
   */
  
  module.exports = async function() {
      /* Init client */
      const client = new acme.Client({
          directoryUrl: acme.directory.letsencrypt.staging,
          accountKey: await acme.forge.createPrivateKey()
      });
  
      /* Create CSR */
      const [key, csr] = await acme.forge.createCsr({
          commonName: 'example.com'
      });
  
      /* Certificate */
      const cert = await client.auto({
          csr,
          email: 'test@example.com',
          termsOfServiceAgreed: true,
          challengeCreateFn,
          challengeRemoveFn
      });
  
      /* Done */
      log(`CSR:\n${csr.toString()}`);
      log(`Private key:\n${key.toString()}`);
      log(`Certificate:\n${cert.toString()}`);
  };
  