#!/usr/bin/env node
'use strict'

void async function main() {
  const os = await import('node:os')
  const fs = await import('node:fs')
  const process = await import('node:process')

  let flagHelp = false
  let flagRaw = false
  let flagSlurp = false
  let flagYaml = false
  const args = []
  for (const arg of process.argv.slice(2)) {
    if (arg === '--help' || arg === '-h') flagHelp = true
    else if (arg === '--raw' || arg === '-r') flagRaw = true
    else if (arg === '--slurp' || arg === '-s') flagSlurp = true
    else if (arg === '-rs' || arg === '-sr') flagRaw = flagSlurp = true
    else if (arg === '--yaml') flagYaml = true
    else args.push(arg)
  }

  if (flagHelp || (args.length === 0 && process.stdin.isTTY)) {
    return printUsage()
  }

  const theme = themes(process.stdout.isTTY ? (process.env.FX_THEME || '1') : '0')

  await importFxrc(process.cwd())
  await importFxrc(os.homedir())

  let fd = 0 // stdin
  if (args.length > 0) {
    let filename =
      isFile(fs, args[0]) ? args.shift() :
        isFile(fs, args.at(-1)) ? args.pop() : false
    if (filename) {
      fd = fs.openSync(filename, 'r')
      if (!flagYaml) flagYaml = /\.ya?ml$/i.test(filename)
    }
  }

  const gen = await read(fd)
  const input =
    flagRaw
      ? readLine(gen)
      : flagYaml
        ? parseYaml(gen)
        : parseJson(gen)

  if (flagSlurp) {
    const array = []
    for (const json of input) {
      array.push(json)
    }
    await transform(array, args, theme)
  } else {
    for (const json of input) {
      await transform(json, args, theme)
    }
  }
}()

const skip = Symbol('skip')

async function transform(json, args, theme) {
  let i, code, jsCode, output = json
  for ([i, code] of args.entries()) try {
    jsCode = transpile(code)
    const fn = `(function () {
      const x = this
      return ${jsCode}
    })`
    output = await run(output, fn)
  } catch (err) {
    await printErr(err)
  }

  if (typeof output === 'undefined')
    console.error('undefined')
  else if (typeof output === 'string')
    console.log(output)
  else if (output === skip)
    return
  else
    console.log(stringify(output, theme))

  async function printErr(err) {
    const process = await import('node:process')
    let pre = args.slice(0, i).join(' ')
    let post = args.slice(i + 1).join(' ')
    if (pre.length > 20) pre = '...' + pre.substring(pre.length - 20)
    if (post.length > 20) post = post.substring(0, 20) + '...'
    console.error(
      `\n  ${pre} ${code} ${post}\n` +
      `  ${' '.repeat(pre.length + 1)}${'^'.repeat(code.length)}\n` +
      (jsCode !== code ? `\n${jsCode}\n` : ``) +
      `\n${err.stack || err}`,
    )
    process.exit(1)
  }
}

function transpile(code) {
  if ('.' === code)
    return 'x'

  if (/^(\.\w*)+\[]/.test(code))
    return `(${fold(code.split('[]'))})(x)`

  function fold(s) {
    if (s.length === 1)
      return 'x => x' + s[0]
    let obj = s.shift()
    obj = obj === '.' ? 'x' : 'x' + obj
    return `x => ${obj}.flatMap(${fold(s)})`
  }

  if (/^\.\[/.test(code))
    return `x${code.substring(1)}`

  if (/^\./.test(code))
    return `x${code}`

  // deprecated
  if (/^map\(.+?\)$/i.test(code)) {
    let s = code.substring(4, code.length - 1)
    if (s[0] === '.') s = 'x' + s
    return `x.map((x, i) => apply(${s}, x, i))`
  }

  if (/^@/.test(code)) {
    const jsCode = transpile(code.substring(1))
    return `x.map((x, i) => apply(${jsCode}, x, i))`
  }

  return code
}

async function run(json, code) {
  const fn = eval(code).call(json)

  return apply(fn, json)

  function apply(fn, ...args) {
    if (typeof fn === 'function') return fn(...args)
    return fn
  }

  function len(x) {
    if (Array.isArray(x)) return x.length
    if (typeof x === 'string') return x.length
    if (typeof x === 'object' && x !== null) return Object.keys(x).length
    throw new Error(`Cannot get length of ${typeof x}`)
  }

  function uniq(x) {
    if (Array.isArray(x)) return [...new Set(x)]
    throw new Error(`Cannot get unique values of ${typeof x}`)
  }

  function sort(x) {
    if (Array.isArray(x)) return x.sort()
    throw new Error(`Cannot sort ${typeof x}`)
  }

  function map(fn) {
    return function (x) {
      if (Array.isArray(x)) return x.map((v, i) => fn(v, i))
      throw new Error(`Cannot map ${typeof x}`)
    }
  }

  function sortBy(fn) {
    return function (x) {
      if (Array.isArray(x)) return x.sort((a, b) => {
        const fa = fn(a)
        const fb = fn(b)
        return fa < fb ? -1 : fa > fb ? 1 : 0
      })
      throw new Error(`Cannot sort ${typeof x}`)
    }
  }

  function groupBy(keyFn) {
    return function (x) {
      const grouped = {}
      for (const item of x) {
        const key = typeof keyFn === 'function' ? keyFn(item) : item[keyFn]
        if (!grouped.hasOwnProperty(key)) grouped[key] = []
        grouped[key].push(item)
      }
      return grouped
    }
  }

  function chunk(size) {
    return function (x) {
      const res = []
      let i = 0
      while (i < x.length) {
        res.push(x.slice(i, i += size))
      }
      return res
    }
  }

  function zip(...x) {
    const length = Math.min(...x.map(a => a.length))
    const res = []
    for (let i = 0; i < length; i++) {
      res.push(x.map(a => a[i]))
    }
    return res
  }

  function flatten(x) {
    if (Array.isArray(x)) return x.flat()
    throw new Error(`Cannot flatten ${typeof x}`)
  }

  function reverse(x) {
    if (Array.isArray(x)) return x.reverse()
    throw new Error(`Cannot reverse ${typeof x}`)
  }

  function keys(x) {
    if (typeof x === 'object' && x !== null) return Object.keys(x)
    throw new Error(`Cannot get keys of ${typeof x}`)
  }

  function values(x) {
    if (typeof x === 'object' && x !== null) return Object.values(x)
    throw new Error(`Cannot get values of ${typeof x}`)
  }
}

async function read(fd = 0) {
  const fs = await import('node:fs')
  const {Buffer} = await import('node:buffer')
  const {StringDecoder} = await import('node:string_decoder')
  const decoder = new StringDecoder('utf8')
  return function* () {
    while (true) {
      const buffer = Buffer.alloc(4_096)
      let bytesRead
      try {
        bytesRead = fs.readSync(fd, buffer, 0, buffer.length, null)
      } catch (e) {
        if (e.code === 'EAGAIN' || e.code === 'EWOULDBLOCK') {
          sleepSync(10)
          continue
        }
        if (e.code === 'EOF') break
        throw e
      }
      if (bytesRead === 0) break
      for (const ch of decoder.write(buffer.subarray(0, bytesRead)))
        yield ch
    }
    for (const ch of decoder.end())
      yield ch
  }()
}

function isFile(fs, path) {
  const stat = fs.statSync(path, {throwIfNoEntry: false})
  return stat !== undefined && stat.isFile()
}

function sleepSync(ms) {
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)
}

function* readLine(stdin) {
  let buffer = ''
  for (const ch of stdin) {
    if (ch === '\n') {
      yield buffer
      buffer = ''
    } else {
      buffer += ch
    }
  }
  return buffer
}

function* parseYaml(gen) {
  let buffer = ''
  for (const ch of gen) {
    buffer += ch
  }
  try {
    yield YAML.parse(buffer)
  } catch (err) {
    throw new SyntaxError(err.message)
  }
}

function* parseJson(gen) {
  let lineNumber = 1, buffer = '', lastChar, done = false

  function next() {
    ({value: lastChar, done} = gen.next())
    if (lastChar === '\n') lineNumber++
    buffer += (lastChar || '')
    if (buffer.length > 100) buffer = buffer.slice(-40)
  }

  next()
  while (!done) {
    const value = parseValue()
    expectValue(value)
    yield value
  }

  function parseValue() {
    skipWhitespace()
    const value =
      parseString() ??
      parseNumber() ??
      parseObject() ??
      parseArray() ??
      parseKeyword('true', true) ??
      parseKeyword('false', false) ??
      parseKeyword('null', null)
    skipWhitespace()
    return value
  }

  function parseString() {
    if (lastChar !== '"') return
    let str = ''
    let escaped = false
    while (true) {
      next()
      if (escaped) {
        if (lastChar === 'u') {
          let unicode = ''
          for (let i = 0; i < 4; i++) {
            next()
            if (!isHexDigit(lastChar)) {
              throw new SyntaxError(errorSnippet(`Invalid Unicode escape sequence '\\u${unicode}${lastChar}'`))
            }
            unicode += lastChar
          }
          str += String.fromCharCode(parseInt(unicode, 16))
        } else {
          const escapedChar = {
            '"': '"',
            '\\': '\\',
            '/': '/',
            'b': '\b',
            'f': '\f',
            'n': '\n',
            'r': '\r',
            't': '\t',
          }[lastChar]
          if (!escapedChar) {
            throw new SyntaxError(errorSnippet())
          }
          str += escapedChar
        }
        escaped = false
      } else if (lastChar === '\\') {
        escaped = true
      } else if (lastChar === '"') {
        break
      } else if (lastChar < '\x1F') {
        throw new SyntaxError(errorSnippet(`Unescaped control character ${JSON.stringify(lastChar)}`))
      } else if (lastChar === undefined) {
        throw new SyntaxError(errorSnippet())
      } else {
        str += lastChar
      }
    }
    next()
    return str
  }

  function parseNumber() {
    if (!isDigit(lastChar) && lastChar !== '-') return
    let numStr = ''
    if (lastChar === '-') {
      numStr += lastChar
      next()
      if (!isDigit(lastChar)) {
        throw new SyntaxError(errorSnippet())
      }
    }
    if (lastChar === '0') {
      numStr += lastChar
      next()
    } else {
      while (isDigit(lastChar)) {
        numStr += lastChar
        next()
      }
    }
    if (lastChar === '.') {
      numStr += lastChar
      next()
      if (!isDigit(lastChar)) {
        throw new SyntaxError(errorSnippet())
      }
      while (isDigit(lastChar)) {
        numStr += lastChar
        next()
      }
    }
    if (lastChar === 'e' || lastChar === 'E') {
      numStr += lastChar
      next()
      if (lastChar === '+' || lastChar === '-') {
        numStr += lastChar
        next()
      }
      if (!isDigit(lastChar)) {
        throw new SyntaxError(errorSnippet())
      }
      while (isDigit(lastChar)) {
        numStr += lastChar
        next()
      }
    }
    return isInteger(numStr) ? toSafeNumber(numStr) : parseFloat(numStr)
  }

  function parseObject() {
    if (lastChar !== '{') return
    next()
    skipWhitespace()
    const obj = {}
    if (lastChar === '}') {
      next()
      return obj
    }
    while (true) {
      if (lastChar !== '"') {
        throw new SyntaxError(errorSnippet())
      }
      const key = parseString()
      skipWhitespace()
      if (lastChar !== ':') {
        throw new SyntaxError(errorSnippet())
      }
      next()
      const value = parseValue()
      expectValue(value)
      obj[key] = value
      skipWhitespace()
      if (lastChar === '}') {
        next()
        return obj
      } else if (lastChar === ',') {
        next()
        skipWhitespace()
        if (lastChar === '}') {
          next()
          return obj
        }
      } else {
        throw new SyntaxError(errorSnippet())
      }
    }
  }

  function parseArray() {
    if (lastChar !== '[') return
    next()
    skipWhitespace()
    const array = []
    if (lastChar === ']') {
      next()
      return array
    }
    while (true) {
      const value = parseValue()
      expectValue(value)
      array.push(value)
      skipWhitespace()
      if (lastChar === ']') {
        next()
        return array
      } else if (lastChar === ',') {
        next()
        skipWhitespace()
        if (lastChar === ']') {
          next()
          return array
        }
      } else {
        throw new SyntaxError(errorSnippet())
      }
    }
  }

  function parseKeyword(name, value) {
    if (lastChar !== name[0]) return
    for (let i = 1; i < name.length; i++) {
      next()
      if (lastChar !== name[i]) {
        throw new SyntaxError(errorSnippet())
      }
    }
    next()
    if (isWhitespace(lastChar) || lastChar === ',' || lastChar === '}' || lastChar === ']' || lastChar === undefined) {
      return value
    }
    throw new SyntaxError(errorSnippet())
  }

  function skipWhitespace() {
    while (isWhitespace(lastChar)) {
      next()
    }
    skipComment()
  }

  function skipComment() {
    if (lastChar === '/') {
      next()
      if (lastChar === '/') {
        while (!done && lastChar !== '\n') {
          next()
        }
        skipWhitespace()
      } else if (lastChar === '*') {
        while (!done) {
          next()
          if (lastChar === '*') {
            next()
            if (lastChar === '/') {
              next()
              break
            }
          }
        }
        skipWhitespace()
      } else {
        throw new SyntaxError(errorSnippet())
      }
    }
  }

  function isWhitespace(ch) {
    return ch === ' ' || ch === '\n' || ch === '\t' || ch === '\r'
  }

  function isHexDigit(ch) {
    return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')
  }

  function isDigit(ch) {
    return ch >= '0' && ch <= '9'
  }

  function isInteger(value) {
    return /^-?[0-9]+$/.test(value)
  }

  function toSafeNumber(str) {
    const maxSafeInteger = Number.MAX_SAFE_INTEGER
    const minSafeInteger = Number.MIN_SAFE_INTEGER
    const num = BigInt(str)
    return num >= minSafeInteger && num <= maxSafeInteger ? Number(num) : num
  }

  function expectValue(value) {
    if (value === undefined) {
      throw new SyntaxError(errorSnippet(`JSON value expected`))
    }
  }

  function errorSnippet(message = `Unexpected character '${lastChar}'`) {
    if (!lastChar) {
      message = 'Unexpected end of input'
    }
    const lines = buffer.slice(-40).split('\n')
    const lastLine = lines.pop()
    const source =
      lines.map(line => `    ${line}\n`).join('')
      + `    ${lastLine}${readEOL()}\n`
    const p = `    ${'.'.repeat(Math.max(0, lastLine.length - 1))}^\n`
    return `${message} on line ${lineNumber}.\n\n${source}${p}`
  }

  function readEOL() {
    let line = ''
    for (const ch of gen) {
      if (!ch || ch === '\n' || line.length >= 60) break
      line += ch
    }
    return line
  }
}

function stringify(value, theme) {
  function color(id, str) {
    if (theme[id] === '') return str
    return `\x1b[${theme[id]}m${str}\x1b[0m`
  }

  function getIndent(level) {
    return ' '.repeat(2 * level)
  }

  function stringifyValue(value, level = 0) {
    if (typeof value === 'string') {
      return color(2, JSON.stringify(value))
    } else if (typeof value === 'number') {
      return color(3, `${value}`)
    } else if (typeof value === 'bigint') {
      return color(3, `${value}`)
    } else if (typeof value === 'boolean') {
      return color(4, `${value}`)
    } else if (value === null || typeof value === 'undefined') {
      return color(5, `null`)
    } else if (Array.isArray(value)) {
      if (value.length === 0) {
        return color(0, `[]`)
      }
      const items = value
        .map((v) => getIndent(level + 1) + stringifyValue(v, level + 1))
        .join(color(0, ',') + '\n')
      return color(0, '[') + '\n' + items + '\n' + getIndent(level) + color(0, ']')
    } else if (typeof value === 'object') {
      const keys = Object.keys(value)
      if (keys.length === 0) {
        return color(0, '{}')
      }
      const entries = keys
        .map((key) =>
          getIndent(level + 1) + color(1, `"${key}"`) + color(0, ': ') +
          stringifyValue(value[key], level + 1),
        )
        .join(color(0, ',') + '\n')
      return color(0, '{') + '\n' + entries + '\n' + getIndent(level) + color(0, '}')
    }
    throw new Error(`Unsupported value type: ${typeof value}`)
  }

  return stringifyValue(value)
}

function themes(id) {
  const themes = {
    '0': ['', '', '', '', '', ''],
    '1': ['', '1;34', '32', '36', '35', '38;5;243'],
    '2': ['', '32', '34', '36', '35', '38;5;243'],
    '3': ['', '95', '93', '96', '31', '38;5;243'],
    '4': ['', '38;5;50', '38;5;39', '38;5;98', '38;5;205', '38;5;243'],
    '5': ['', '38;5;230', '38;5;221', '38;5;209', '38;5;209', '38;5;243'],
    '6': ['', '38;5;69', '38;5;78', '38;5;221', '38;5;203', '38;5;243'],
    '7': ['', '1;38;5;42', '1;38;5;213', '1;38;5;201', '1;38;5;201', '38;5;243'],
    '8': ['', '1;38;5;51', '38;5;195', '38;5;123', '38;5;50', '38;5;243'],
    '🔵': ['1;38;5;33', '38;5;33', '', '', '', ''],
    '🥝': ['38;5;179', '1;38;5;154', '38;5;82', '38;5;226', '38;5;226', '38;5;230'],
  }
  return themes[id] || themes['1']
}

async function importFxrc(path) {
  const {join} = await import('node:path')
  const {pathToFileURL} = await import('node:url')
  try {
    await import(pathToFileURL(join(path, '.fxrc.js')))
  } catch (err) {
    if (err.code !== 'ERR_MODULE_NOT_FOUND') throw err
  }
}

function printUsage() {
  const usage = `Usage
  fx [flags] [code...]

Flags
  -h, --help    print help
  -r, --raw     treat input as a raw string
  -s, --slurp   read all inputs into an array
  --yaml        parse input as YAML`
  console.log(usage)
}

// yaml v2.4.0
// @formatter:off
void function () {var ALIAS=Symbol.for("yaml.alias");var DOC=Symbol.for("yaml.document");var MAP=Symbol.for("yaml.map");var PAIR=Symbol.for("yaml.pair");var SCALAR=Symbol.for("yaml.scalar");var SEQ=Symbol.for("yaml.seq");var NODE_TYPE=Symbol.for("yaml.node.type");var isAlias=node=>!!node&&typeof node==="object"&&node[NODE_TYPE]===ALIAS;var isDocument=node=>!!node&&typeof node==="object"&&node[NODE_TYPE]===DOC;var isMap=node=>!!node&&typeof node==="object"&&node[NODE_TYPE]===MAP;var isPair=node=>!!node&&typeof node==="object"&&node[NODE_TYPE]===PAIR;var isScalar=node=>!!node&&typeof node==="object"&&node[NODE_TYPE]===SCALAR;var isSeq=node=>!!node&&typeof node==="object"&&node[NODE_TYPE]===SEQ;function isCollection(node){if(node&&typeof node==="object")switch(node[NODE_TYPE]){case MAP:case SEQ:return true}return false}function isNode(node){if(node&&typeof node==="object")switch(node[NODE_TYPE]){case ALIAS:case MAP:case SCALAR:case SEQ:return true}return false}var hasAnchor=node=>(isScalar(node)||isCollection(node))&&!!node.anchor;var BREAK=Symbol("break visit");var SKIP=Symbol("skip children");var REMOVE=Symbol("remove node");function visit(node,visitor){const visitor_=initVisitor(visitor);if(isDocument(node)){const cd=visit_(null,node.contents,visitor_,Object.freeze([node]));if(cd===REMOVE)node.contents=null}else visit_(null,node,visitor_,Object.freeze([]))}visit.BREAK=BREAK;visit.SKIP=SKIP;visit.REMOVE=REMOVE;function visit_(key,node,visitor,path){const ctrl=callVisitor(key,node,visitor,path);if(isNode(ctrl)||isPair(ctrl)){replaceNode(key,path,ctrl);return visit_(key,ctrl,visitor,path)}if(typeof ctrl!=="symbol"){if(isCollection(node)){path=Object.freeze(path.concat(node));for(let i=0;i<node.items.length;++i){const ci=visit_(i,node.items[i],visitor,path);if(typeof ci==="number")i=ci-1;else if(ci===BREAK)return BREAK;else if(ci===REMOVE){node.items.splice(i,1);i-=1}}}else if(isPair(node)){path=Object.freeze(path.concat(node));const ck=visit_("key",node.key,visitor,path);if(ck===BREAK)return BREAK;else if(ck===REMOVE)node.key=null;const cv=visit_("value",node.value,visitor,path);if(cv===BREAK)return BREAK;else if(cv===REMOVE)node.value=null}}return ctrl}async function visitAsync(node,visitor){const visitor_=initVisitor(visitor);if(isDocument(node)){const cd=await visitAsync_(null,node.contents,visitor_,Object.freeze([node]));if(cd===REMOVE)node.contents=null}else await visitAsync_(null,node,visitor_,Object.freeze([]))}visitAsync.BREAK=BREAK;visitAsync.SKIP=SKIP;visitAsync.REMOVE=REMOVE;async function visitAsync_(key,node,visitor,path){const ctrl=await callVisitor(key,node,visitor,path);if(isNode(ctrl)||isPair(ctrl)){replaceNode(key,path,ctrl);return visitAsync_(key,ctrl,visitor,path)}if(typeof ctrl!=="symbol"){if(isCollection(node)){path=Object.freeze(path.concat(node));for(let i=0;i<node.items.length;++i){const ci=await visitAsync_(i,node.items[i],visitor,path);if(typeof ci==="number")i=ci-1;else if(ci===BREAK)return BREAK;else if(ci===REMOVE){node.items.splice(i,1);i-=1}}}else if(isPair(node)){path=Object.freeze(path.concat(node));const ck=await visitAsync_("key",node.key,visitor,path);if(ck===BREAK)return BREAK;else if(ck===REMOVE)node.key=null;const cv=await visitAsync_("value",node.value,visitor,path);if(cv===BREAK)return BREAK;else if(cv===REMOVE)node.value=null}}return ctrl}function initVisitor(visitor){if(typeof visitor==="object"&&(visitor.Collection||visitor.Node||visitor.Value)){return Object.assign({Alias:visitor.Node,Map:visitor.Node,Scalar:visitor.Node,Seq:visitor.Node},visitor.Value&&{Map:visitor.Value,Scalar:visitor.Value,Seq:visitor.Value},visitor.Collection&&{Map:visitor.Collection,Seq:visitor.Collection},visitor)}return visitor}function callVisitor(key,node,visitor,path){if(typeof visitor==="function")return visitor(key,node,path);if(isMap(node))return visitor.Map?.(key,node,path);if(isSeq(node))return visitor.Seq?.(key,node,path);if(isPair(node))return visitor.Pair?.(key,node,path);if(isScalar(node))return visitor.Scalar?.(key,node,path);if(isAlias(node))return visitor.Alias?.(key,node,path);return void 0}function replaceNode(key,path,node){const parent=path[path.length-1];if(isCollection(parent)){parent.items[key]=node}else if(isPair(parent)){if(key==="key")parent.key=node;else parent.value=node}else if(isDocument(parent)){parent.contents=node}else{const pt=isAlias(parent)?"alias":"scalar";throw new Error(`Cannot replace node with ${pt} parent`)}}var escapeChars={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"};var escapeTagName=tn=>tn.replace(/[!,[\]{}]/g,ch=>escapeChars[ch]);var Directives=class _Directives{constructor(yaml,tags){this.docStart=null;this.docEnd=false;this.yaml=Object.assign({},_Directives.defaultYaml,yaml);this.tags=Object.assign({},_Directives.defaultTags,tags)}clone(){const copy=new _Directives(this.yaml,this.tags);copy.docStart=this.docStart;return copy}atDocument(){const res=new _Directives(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=true;break;case"1.2":this.atNextDocument=false;this.yaml={explicit:_Directives.defaultYaml.explicit,version:"1.2"};this.tags=Object.assign({},_Directives.defaultTags);break}return res}add(line,onError){if(this.atNextDocument){this.yaml={explicit:_Directives.defaultYaml.explicit,version:"1.1"};this.tags=Object.assign({},_Directives.defaultTags);this.atNextDocument=false}const parts=line.trim().split(/[ \t]+/);const name=parts.shift();switch(name){case"%TAG":{if(parts.length!==2){onError(0,"%TAG directive should contain exactly two parts");if(parts.length<2)return false}const[handle,prefix]=parts;this.tags[handle]=prefix;return true}case"%YAML":{this.yaml.explicit=true;if(parts.length!==1){onError(0,"%YAML directive should contain exactly one part");return false}const[version]=parts;if(version==="1.1"||version==="1.2"){this.yaml.version=version;return true}else{const isValid=/^\d+\.\d+$/.test(version);onError(6,`Unsupported YAML version ${version}`,isValid);return false}}default:onError(0,`Unknown directive ${name}`,true);return false}}tagName(source,onError){if(source==="!")return"!";if(source[0]!=="!"){onError(`Not a valid tag: ${source}`);return null}if(source[1]==="<"){const verbatim=source.slice(2,-1);if(verbatim==="!"||verbatim==="!!"){onError(`Verbatim tags aren't resolved, so ${source} is invalid.`);return null}if(source[source.length-1]!==">")onError("Verbatim tags must end with a >");return verbatim}const[,handle,suffix]=source.match(/^(.*!)([^!]*)$/s);if(!suffix)onError(`The ${source} tag has no suffix`);const prefix=this.tags[handle];if(prefix){try{return prefix+decodeURIComponent(suffix)}catch(error){onError(String(error));return null}}if(handle==="!")return source;onError(`Could not resolve tag: ${source}`);return null}tagString(tag){for(const[handle,prefix]of Object.entries(this.tags)){if(tag.startsWith(prefix))return handle+escapeTagName(tag.substring(prefix.length))}return tag[0]==="!"?tag:`!<${tag}>`}toString(doc){const lines=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[];const tagEntries=Object.entries(this.tags);let tagNames;if(doc&&tagEntries.length>0&&isNode(doc.contents)){const tags={};visit(doc.contents,(_key,node)=>{if(isNode(node)&&node.tag)tags[node.tag]=true});tagNames=Object.keys(tags)}else tagNames=[];for(const[handle,prefix]of tagEntries){if(handle==="!!"&&prefix==="tag:yaml.org,2002:")continue;if(!doc||tagNames.some(tn=>tn.startsWith(prefix)))lines.push(`%TAG ${handle} ${prefix}`)}return lines.join("\n")}};Directives.defaultYaml={explicit:false,version:"1.2"};Directives.defaultTags={"!!":"tag:yaml.org,2002:"};function anchorIsValid(anchor){if(/[\x00-\x19\s,[\]{}]/.test(anchor)){const sa=JSON.stringify(anchor);const msg=`Anchor must not contain whitespace or control characters: ${sa}`;throw new Error(msg)}return true}function anchorNames(root){const anchors=new Set;visit(root,{Value(_key,node){if(node.anchor)anchors.add(node.anchor)}});return anchors}function findNewAnchor(prefix,exclude){for(let i=1;true;++i){const name=`${prefix}${i}`;if(!exclude.has(name))return name}}function createNodeAnchors(doc,prefix){const aliasObjects=[];const sourceObjects=new Map;let prevAnchors=null;return{onAnchor:source=>{aliasObjects.push(source);if(!prevAnchors)prevAnchors=anchorNames(doc);const anchor=findNewAnchor(prefix,prevAnchors);prevAnchors.add(anchor);return anchor},setAnchors:()=>{for(const source of aliasObjects){const ref=sourceObjects.get(source);if(typeof ref==="object"&&ref.anchor&&(isScalar(ref.node)||isCollection(ref.node))){ref.node.anchor=ref.anchor}else{const error=new Error("Failed to resolve repeated object (this should not happen)");error.source=source;throw error}}},sourceObjects}}function applyReviver(reviver,obj,key,val){if(val&&typeof val==="object"){if(Array.isArray(val)){for(let i=0,len=val.length;i<len;++i){const v0=val[i];const v1=applyReviver(reviver,val,String(i),v0);if(v1===void 0)delete val[i];else if(v1!==v0)val[i]=v1}}else if(val instanceof Map){for(const k of Array.from(val.keys())){const v0=val.get(k);const v1=applyReviver(reviver,val,k,v0);if(v1===void 0)val.delete(k);else if(v1!==v0)val.set(k,v1)}}else if(val instanceof Set){for(const v0 of Array.from(val)){const v1=applyReviver(reviver,val,v0,v0);if(v1===void 0)val.delete(v0);else if(v1!==v0){val.delete(v0);val.add(v1)}}}else{for(const[k,v0]of Object.entries(val)){const v1=applyReviver(reviver,val,k,v0);if(v1===void 0)delete val[k];else if(v1!==v0)val[k]=v1}}}return reviver.call(obj,key,val)}function toJS(value,arg,ctx){if(Array.isArray(value))return value.map((v,i)=>toJS(v,String(i),ctx));if(value&&typeof value.toJSON==="function"){if(!ctx||!hasAnchor(value))return value.toJSON(arg,ctx);const data={aliasCount:0,count:1,res:void 0};ctx.anchors.set(value,data);ctx.onCreate=res2=>{data.res=res2;delete ctx.onCreate};const res=value.toJSON(arg,ctx);if(ctx.onCreate)ctx.onCreate(res);return res}if(typeof value==="bigint"&&!ctx?.keep)return Number(value);return value}var NodeBase=class{constructor(type){Object.defineProperty(this,NODE_TYPE,{value:type})}clone(){const copy=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(this.range)copy.range=this.range.slice();return copy}toJS(doc,{mapAsMap,maxAliasCount,onAnchor,reviver}={}){if(!isDocument(doc))throw new TypeError("A document argument is required");const ctx={anchors:new Map,doc,keep:true,mapAsMap:mapAsMap===true,mapKeyWarned:false,maxAliasCount:typeof maxAliasCount==="number"?maxAliasCount:100};const res=toJS(this,"",ctx);if(typeof onAnchor==="function")for(const{count,res:res2}of ctx.anchors.values())onAnchor(res2,count);return typeof reviver==="function"?applyReviver(reviver,{"":res},"",res):res}};var Alias=class extends NodeBase{constructor(source){super(ALIAS);this.source=source;Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(doc){let found=void 0;visit(doc,{Node:(_key,node)=>{if(node===this)return visit.BREAK;if(node.anchor===this.source)found=node}});return found}toJSON(_arg,ctx){if(!ctx)return{source:this.source};const{anchors,doc,maxAliasCount}=ctx;const source=this.resolve(doc);if(!source){const msg=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(msg)}let data=anchors.get(source);if(!data){toJS(source,null,ctx);data=anchors.get(source)}if(!data||data.res===void 0){const msg="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(msg)}if(maxAliasCount>=0){data.count+=1;if(data.aliasCount===0)data.aliasCount=getAliasCount(doc,source,anchors);if(data.count*data.aliasCount>maxAliasCount){const msg="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(msg)}}return data.res}toString(ctx,_onComment,_onChompKeep){const src=`*${this.source}`;if(ctx){anchorIsValid(this.source);if(ctx.options.verifyAliasOrder&&!ctx.anchors.has(this.source)){const msg=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(msg)}if(ctx.implicitKey)return`${src} `}return src}};function getAliasCount(doc,node,anchors){if(isAlias(node)){const source=node.resolve(doc);const anchor=anchors&&source&&anchors.get(source);return anchor?anchor.count*anchor.aliasCount:0}else if(isCollection(node)){let count=0;for(const item of node.items){const c=getAliasCount(doc,item,anchors);if(c>count)count=c}return count}else if(isPair(node)){const kc=getAliasCount(doc,node.key,anchors);const vc=getAliasCount(doc,node.value,anchors);return Math.max(kc,vc)}return 1}var isScalarValue=value=>!value||typeof value!=="function"&&typeof value!=="object";var Scalar=class extends NodeBase{constructor(value){super(SCALAR);this.value=value}toJSON(arg,ctx){return ctx?.keep?this.value:toJS(this.value,arg,ctx)}toString(){return String(this.value)}};Scalar.BLOCK_FOLDED="BLOCK_FOLDED";Scalar.BLOCK_LITERAL="BLOCK_LITERAL";Scalar.PLAIN="PLAIN";Scalar.QUOTE_DOUBLE="QUOTE_DOUBLE";Scalar.QUOTE_SINGLE="QUOTE_SINGLE";var defaultTagPrefix="tag:yaml.org,2002:";function findTagObject(value,tagName,tags){if(tagName){const match=tags.filter(t=>t.tag===tagName);const tagObj=match.find(t=>!t.format)??match[0];if(!tagObj)throw new Error(`Tag ${tagName} not found`);return tagObj}return tags.find(t=>t.identify?.(value)&&!t.format)}function createNode(value,tagName,ctx){if(isDocument(value))value=value.contents;if(isNode(value))return value;if(isPair(value)){const map2=ctx.schema[MAP].createNode?.(ctx.schema,null,ctx);map2.items.push(value);return map2}if(value instanceof String||value instanceof Number||value instanceof Boolean||typeof BigInt!=="undefined"&&value instanceof BigInt){value=value.valueOf()}const{aliasDuplicateObjects,onAnchor,onTagObj,schema:schema4,sourceObjects}=ctx;let ref=void 0;if(aliasDuplicateObjects&&value&&typeof value==="object"){ref=sourceObjects.get(value);if(ref){if(!ref.anchor)ref.anchor=onAnchor(value);return new Alias(ref.anchor)}else{ref={anchor:null,node:null};sourceObjects.set(value,ref)}}if(tagName?.startsWith("!!"))tagName=defaultTagPrefix+tagName.slice(2);let tagObj=findTagObject(value,tagName,schema4.tags);if(!tagObj){if(value&&typeof value.toJSON==="function"){value=value.toJSON()}if(!value||typeof value!=="object"){const node2=new Scalar(value);if(ref)ref.node=node2;return node2}tagObj=value instanceof Map?schema4[MAP]:Symbol.iterator in Object(value)?schema4[SEQ]:schema4[MAP]}if(onTagObj){onTagObj(tagObj);delete ctx.onTagObj}const node=tagObj?.createNode?tagObj.createNode(ctx.schema,value,ctx):typeof tagObj?.nodeClass?.from==="function"?tagObj.nodeClass.from(ctx.schema,value,ctx):new Scalar(value);if(tagName)node.tag=tagName;else if(!tagObj.default)node.tag=tagObj.tag;if(ref)ref.node=node;return node}function collectionFromPath(schema4,path,value){let v=value;for(let i=path.length-1;i>=0;--i){const k=path[i];if(typeof k==="number"&&Number.isInteger(k)&&k>=0){const a=[];a[k]=v;v=a}else{v=new Map([[k,v]])}}return createNode(v,void 0,{aliasDuplicateObjects:false,keepUndefined:false,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:schema4,sourceObjects:new Map})}var isEmptyPath=path=>path==null||typeof path==="object"&&!!path[Symbol.iterator]().next().done;var Collection=class extends NodeBase{constructor(type,schema4){super(type);Object.defineProperty(this,"schema",{value:schema4,configurable:true,enumerable:false,writable:true})}clone(schema4){const copy=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(schema4)copy.schema=schema4;copy.items=copy.items.map(it=>isNode(it)||isPair(it)?it.clone(schema4):it);if(this.range)copy.range=this.range.slice();return copy}addIn(path,value){if(isEmptyPath(path))this.add(value);else{const[key,...rest]=path;const node=this.get(key,true);if(isCollection(node))node.addIn(rest,value);else if(node===void 0&&this.schema)this.set(key,collectionFromPath(this.schema,rest,value));else throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`)}}deleteIn(path){const[key,...rest]=path;if(rest.length===0)return this.delete(key);const node=this.get(key,true);if(isCollection(node))return node.deleteIn(rest);else throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`)}getIn(path,keepScalar){const[key,...rest]=path;const node=this.get(key,true);if(rest.length===0)return!keepScalar&&isScalar(node)?node.value:node;else return isCollection(node)?node.getIn(rest,keepScalar):void 0}hasAllNullValues(allowScalar){return this.items.every(node=>{if(!isPair(node))return false;const n=node.value;return n==null||allowScalar&&isScalar(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(path){const[key,...rest]=path;if(rest.length===0)return this.has(key);const node=this.get(key,true);return isCollection(node)?node.hasIn(rest):false}setIn(path,value){const[key,...rest]=path;if(rest.length===0){this.set(key,value)}else{const node=this.get(key,true);if(isCollection(node))node.setIn(rest,value);else if(node===void 0&&this.schema)this.set(key,collectionFromPath(this.schema,rest,value));else throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`)}}};Collection.maxFlowStringSingleLineLength=60;var stringifyComment=str=>str.replace(/^(?!$)(?: $)?/gm,"#");function indentComment(comment,indent){if(/^\n+$/.test(comment))return comment.substring(1);return indent?comment.replace(/^(?! *$)/gm,indent):comment}var lineComment=(str,indent,comment)=>str.endsWith("\n")?indentComment(comment,indent):comment.includes("\n")?"\n"+indentComment(comment,indent):(str.endsWith(" ")?"":" ")+comment;var FOLD_FLOW="flow";var FOLD_BLOCK="block";var FOLD_QUOTED="quoted";function foldFlowLines(text,indent,mode="flow",{indentAtStart,lineWidth=80,minContentWidth=20,onFold,onOverflow}={}){if(!lineWidth||lineWidth<0)return text;const endStep=Math.max(1+minContentWidth,1+lineWidth-indent.length);if(text.length<=endStep)return text;const folds=[];const escapedFolds={};let end=lineWidth-indent.length;if(typeof indentAtStart==="number"){if(indentAtStart>lineWidth-Math.max(2,minContentWidth))folds.push(0);else end=lineWidth-indentAtStart}let split=void 0;let prev=void 0;let overflow=false;let i=-1;let escStart=-1;let escEnd=-1;if(mode===FOLD_BLOCK){i=consumeMoreIndentedLines(text,i);if(i!==-1)end=i+endStep}for(let ch;ch=text[i+=1];){if(mode===FOLD_QUOTED&&ch==="\\"){escStart=i;switch(text[i+1]){case"x":i+=3;break;case"u":i+=5;break;case"U":i+=9;break;default:i+=1}escEnd=i}if(ch==="\n"){if(mode===FOLD_BLOCK)i=consumeMoreIndentedLines(text,i);end=i+endStep;split=void 0}else{if(ch===" "&&prev&&prev!==" "&&prev!=="\n"&&prev!=="	"){const next=text[i+1];if(next&&next!==" "&&next!=="\n"&&next!=="	")split=i}if(i>=end){if(split){folds.push(split);end=split+endStep;split=void 0}else if(mode===FOLD_QUOTED){while(prev===" "||prev==="	"){prev=ch;ch=text[i+=1];overflow=true}const j=i>escEnd+1?i-2:escStart-1;if(escapedFolds[j])return text;folds.push(j);escapedFolds[j]=true;end=j+endStep;split=void 0}else{overflow=true}}}prev=ch}if(overflow&&onOverflow)onOverflow();if(folds.length===0)return text;if(onFold)onFold();let res=text.slice(0,folds[0]);for(let i2=0;i2<folds.length;++i2){const fold=folds[i2];const end2=folds[i2+1]||text.length;if(fold===0)res=`
${indent}${text.slice(0,end2)}`;else{if(mode===FOLD_QUOTED&&escapedFolds[fold])res+=`${text[fold]}\\`;res+=`
${indent}${text.slice(fold+1,end2)}`}}return res}function consumeMoreIndentedLines(text,i){let ch=text[i+1];while(ch===" "||ch==="	"){do{ch=text[i+=1]}while(ch&&ch!=="\n");ch=text[i+1]}return i}var getFoldOptions=(ctx,isBlock2)=>({indentAtStart:isBlock2?ctx.indent.length:ctx.indentAtStart,lineWidth:ctx.options.lineWidth,minContentWidth:ctx.options.minContentWidth});var containsDocumentMarker=str=>/^(%|---|\.\.\.)/m.test(str);function lineLengthOverLimit(str,lineWidth,indentLength){if(!lineWidth||lineWidth<0)return false;const limit=lineWidth-indentLength;const strLen=str.length;if(strLen<=limit)return false;for(let i=0,start=0;i<strLen;++i){if(str[i]==="\n"){if(i-start>limit)return true;start=i+1;if(strLen-start<=limit)return false}}return true}function doubleQuotedString(value,ctx){const json=JSON.stringify(value);if(ctx.options.doubleQuotedAsJSON)return json;const{implicitKey}=ctx;const minMultiLineLength=ctx.options.doubleQuotedMinMultiLineLength;const indent=ctx.indent||(containsDocumentMarker(value)?"  ":"");let str="";let start=0;for(let i=0,ch=json[i];ch;ch=json[++i]){if(ch===" "&&json[i+1]==="\\"&&json[i+2]==="n"){str+=json.slice(start,i)+"\\ ";i+=1;start=i;ch="\\"}if(ch==="\\")switch(json[i+1]){case"u":{str+=json.slice(start,i);const code=json.substr(i+2,4);switch(code){case"0000":str+="\\0";break;case"0007":str+="\\a";break;case"000b":str+="\\v";break;case"001b":str+="\\e";break;case"0085":str+="\\N";break;case"00a0":str+="\\_";break;case"2028":str+="\\L";break;case"2029":str+="\\P";break;default:if(code.substr(0,2)==="00")str+="\\x"+code.substr(2);else str+=json.substr(i,6)}i+=5;start=i+1}break;case"n":if(implicitKey||json[i+2]==='"'||json.length<minMultiLineLength){i+=1}else{str+=json.slice(start,i)+"\n\n";while(json[i+2]==="\\"&&json[i+3]==="n"&&json[i+4]!=='"'){str+="\n";i+=2}str+=indent;if(json[i+2]===" ")str+="\\";i+=1;start=i+1}break;default:i+=1}}str=start?str+json.slice(start):json;return implicitKey?str:foldFlowLines(str,indent,FOLD_QUOTED,getFoldOptions(ctx,false))}function singleQuotedString(value,ctx){if(ctx.options.singleQuote===false||ctx.implicitKey&&value.includes("\n")||/[ \t]\n|\n[ \t]/.test(value))return doubleQuotedString(value,ctx);const indent=ctx.indent||(containsDocumentMarker(value)?"  ":"");const res="'"+value.replace(/'/g,"''").replace(/\n+/g,`$&
${indent}`)+"'";return ctx.implicitKey?res:foldFlowLines(res,indent,FOLD_FLOW,getFoldOptions(ctx,false))}function quotedString(value,ctx){const{singleQuote}=ctx.options;let qs;if(singleQuote===false)qs=doubleQuotedString;else{const hasDouble=value.includes('"');const hasSingle=value.includes("'");if(hasDouble&&!hasSingle)qs=singleQuotedString;else if(hasSingle&&!hasDouble)qs=doubleQuotedString;else qs=singleQuote?singleQuotedString:doubleQuotedString}return qs(value,ctx)}var blockEndNewlines;try{blockEndNewlines=new RegExp("(^|(?<!\n))\n+(?!\n|$)","g")}catch{blockEndNewlines=/\n+(?!\n|$)/g}function blockString({comment,type,value},ctx,onComment,onChompKeep){const{blockQuote,commentString,lineWidth}=ctx.options;if(!blockQuote||/\n[\t ]+$/.test(value)||/^\s*$/.test(value)){return quotedString(value,ctx)}const indent=ctx.indent||(ctx.forceBlockIndent||containsDocumentMarker(value)?"  ":"");const literal=blockQuote==="literal"?true:blockQuote==="folded"||type===Scalar.BLOCK_FOLDED?false:type===Scalar.BLOCK_LITERAL?true:!lineLengthOverLimit(value,lineWidth,indent.length);if(!value)return literal?"|\n":">\n";let chomp;let endStart;for(endStart=value.length;endStart>0;--endStart){const ch=value[endStart-1];if(ch!=="\n"&&ch!=="	"&&ch!==" ")break}let end=value.substring(endStart);const endNlPos=end.indexOf("\n");if(endNlPos===-1){chomp="-"}else if(value===end||endNlPos!==end.length-1){chomp="+";if(onChompKeep)onChompKeep()}else{chomp=""}if(end){value=value.slice(0,-end.length);if(end[end.length-1]==="\n")end=end.slice(0,-1);end=end.replace(blockEndNewlines,`$&${indent}`)}let startWithSpace=false;let startEnd;let startNlPos=-1;for(startEnd=0;startEnd<value.length;++startEnd){const ch=value[startEnd];if(ch===" ")startWithSpace=true;else if(ch==="\n")startNlPos=startEnd;else break}let start=value.substring(0,startNlPos<startEnd?startNlPos+1:startEnd);if(start){value=value.substring(start.length);start=start.replace(/\n+/g,`$&${indent}`)}const indentSize=indent?"2":"1";let header=(literal?"|":">")+(startWithSpace?indentSize:"")+chomp;if(comment){header+=" "+commentString(comment.replace(/ ?[\r\n]+/g," "));if(onComment)onComment()}if(literal){value=value.replace(/\n+/g,`$&${indent}`);return`${header}
${indent}${start}${value}${end}`}value=value.replace(/\n+/g,"\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${indent}`);const body=foldFlowLines(`${start}${value}${end}`,indent,FOLD_BLOCK,getFoldOptions(ctx,true));return`${header}
${indent}${body}`}function plainString(item,ctx,onComment,onChompKeep){const{type,value}=item;const{actualString,implicitKey,indent,indentStep,inFlow}=ctx;if(implicitKey&&value.includes("\n")||inFlow&&/[[\]{},]/.test(value)){return quotedString(value,ctx)}if(!value||/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)){return implicitKey||inFlow||!value.includes("\n")?quotedString(value,ctx):blockString(item,ctx,onComment,onChompKeep)}if(!implicitKey&&!inFlow&&type!==Scalar.PLAIN&&value.includes("\n")){return blockString(item,ctx,onComment,onChompKeep)}if(containsDocumentMarker(value)){if(indent===""){ctx.forceBlockIndent=true;return blockString(item,ctx,onComment,onChompKeep)}else if(implicitKey&&indent===indentStep){return quotedString(value,ctx)}}const str=value.replace(/\n+/g,`$&
${indent}`);if(actualString){const test=tag=>tag.default&&tag.tag!=="tag:yaml.org,2002:str"&&tag.test?.test(str);const{compat,tags}=ctx.doc.schema;if(tags.some(test)||compat?.some(test))return quotedString(value,ctx)}return implicitKey?str:foldFlowLines(str,indent,FOLD_FLOW,getFoldOptions(ctx,false))}function stringifyString(item,ctx,onComment,onChompKeep){const{implicitKey,inFlow}=ctx;const ss=typeof item.value==="string"?item:Object.assign({},item,{value:String(item.value)});let{type}=item;if(type!==Scalar.QUOTE_DOUBLE){if(/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value))type=Scalar.QUOTE_DOUBLE}const _stringify=_type=>{switch(_type){case Scalar.BLOCK_FOLDED:case Scalar.BLOCK_LITERAL:return implicitKey||inFlow?quotedString(ss.value,ctx):blockString(ss,ctx,onComment,onChompKeep);case Scalar.QUOTE_DOUBLE:return doubleQuotedString(ss.value,ctx);case Scalar.QUOTE_SINGLE:return singleQuotedString(ss.value,ctx);case Scalar.PLAIN:return plainString(ss,ctx,onComment,onChompKeep);default:return null}};let res=_stringify(type);if(res===null){const{defaultKeyType,defaultStringType}=ctx.options;const t=implicitKey&&defaultKeyType||defaultStringType;res=_stringify(t);if(res===null)throw new Error(`Unsupported default string type ${t}`)}return res}function createStringifyContext(doc,options){const opt=Object.assign({blockQuote:true,commentString:stringifyComment,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:false,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:true,indentSeq:true,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:false,singleQuote:null,trueStr:"true",verifyAliasOrder:true},doc.schema.toStringOptions,options);let inFlow;switch(opt.collectionStyle){case"block":inFlow=false;break;case"flow":inFlow=true;break;default:inFlow=null}return{anchors:new Set,doc,flowCollectionPadding:opt.flowCollectionPadding?" ":"",indent:"",indentStep:typeof opt.indent==="number"?" ".repeat(opt.indent):"  ",inFlow,options:opt}}function getTagObject(tags,item){if(item.tag){const match=tags.filter(t=>t.tag===item.tag);if(match.length>0)return match.find(t=>t.format===item.format)??match[0]}let tagObj=void 0;let obj;if(isScalar(item)){obj=item.value;const match=tags.filter(t=>t.identify?.(obj));tagObj=match.find(t=>t.format===item.format)??match.find(t=>!t.format)}else{obj=item;tagObj=tags.find(t=>t.nodeClass&&obj instanceof t.nodeClass)}if(!tagObj){const name=obj?.constructor?.name??typeof obj;throw new Error(`Tag not resolved for ${name} value`)}return tagObj}function stringifyProps(node,tagObj,{anchors,doc}){if(!doc.directives)return"";const props=[];const anchor=(isScalar(node)||isCollection(node))&&node.anchor;if(anchor&&anchorIsValid(anchor)){anchors.add(anchor);props.push(`&${anchor}`)}const tag=node.tag?node.tag:tagObj.default?null:tagObj.tag;if(tag)props.push(doc.directives.tagString(tag));return props.join(" ")}function stringify(item,ctx,onComment,onChompKeep){if(isPair(item))return item.toString(ctx,onComment,onChompKeep);if(isAlias(item)){if(ctx.doc.directives)return item.toString(ctx);if(ctx.resolvedAliases?.has(item)){throw new TypeError(`Cannot stringify circular structure without alias nodes`)}else{if(ctx.resolvedAliases)ctx.resolvedAliases.add(item);else ctx.resolvedAliases=new Set([item]);item=item.resolve(ctx.doc)}}let tagObj=void 0;const node=isNode(item)?item:ctx.doc.createNode(item,{onTagObj:o=>tagObj=o});if(!tagObj)tagObj=getTagObject(ctx.doc.schema.tags,node);const props=stringifyProps(node,tagObj,ctx);if(props.length>0)ctx.indentAtStart=(ctx.indentAtStart??0)+props.length+1;const str=typeof tagObj.stringify==="function"?tagObj.stringify(node,ctx,onComment,onChompKeep):isScalar(node)?stringifyString(node,ctx,onComment,onChompKeep):node.toString(ctx,onComment,onChompKeep);if(!props)return str;return isScalar(node)||str[0]==="{"||str[0]==="["?`${props} ${str}`:`${props}
${ctx.indent}${str}`}function stringifyPair({key,value},ctx,onComment,onChompKeep){const{allNullValues,doc,indent,indentStep,options:{commentString,indentSeq,simpleKeys}}=ctx;let keyComment=isNode(key)&&key.comment||null;if(simpleKeys){if(keyComment){throw new Error("With simple keys, key nodes cannot have comments")}if(isCollection(key)){const msg="With simple keys, collection cannot be used as a key value";throw new Error(msg)}}let explicitKey=!simpleKeys&&(!key||keyComment&&value==null&&!ctx.inFlow||isCollection(key)||(isScalar(key)?key.type===Scalar.BLOCK_FOLDED||key.type===Scalar.BLOCK_LITERAL:typeof key==="object"));ctx=Object.assign({},ctx,{allNullValues:false,implicitKey:!explicitKey&&(simpleKeys||!allNullValues),indent:indent+indentStep});let keyCommentDone=false;let chompKeep=false;let str=stringify(key,ctx,()=>keyCommentDone=true,()=>chompKeep=true);if(!explicitKey&&!ctx.inFlow&&str.length>1024){if(simpleKeys)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");explicitKey=true}if(ctx.inFlow){if(allNullValues||value==null){if(keyCommentDone&&onComment)onComment();return str===""?"?":explicitKey?`? ${str}`:str}}else if(allNullValues&&!simpleKeys||value==null&&explicitKey){str=`? ${str}`;if(keyComment&&!keyCommentDone){str+=lineComment(str,ctx.indent,commentString(keyComment))}else if(chompKeep&&onChompKeep)onChompKeep();return str}if(keyCommentDone)keyComment=null;if(explicitKey){if(keyComment)str+=lineComment(str,ctx.indent,commentString(keyComment));str=`? ${str}
${indent}:`}else{str=`${str}:`;if(keyComment)str+=lineComment(str,ctx.indent,commentString(keyComment))}let vsb,vcb,valueComment;if(isNode(value)){vsb=!!value.spaceBefore;vcb=value.commentBefore;valueComment=value.comment}else{vsb=false;vcb=null;valueComment=null;if(value&&typeof value==="object")value=doc.createNode(value)}ctx.implicitKey=false;if(!explicitKey&&!keyComment&&isScalar(value))ctx.indentAtStart=str.length+1;chompKeep=false;if(!indentSeq&&indentStep.length>=2&&!ctx.inFlow&&!explicitKey&&isSeq(value)&&!value.flow&&!value.tag&&!value.anchor){ctx.indent=ctx.indent.substring(2)}let valueCommentDone=false;const valueStr=stringify(value,ctx,()=>valueCommentDone=true,()=>chompKeep=true);let ws=" ";if(keyComment||vsb||vcb){ws=vsb?"\n":"";if(vcb){const cs=commentString(vcb);ws+=`
${indentComment(cs,ctx.indent)}`}if(valueStr===""&&!ctx.inFlow){if(ws==="\n")ws="\n\n"}else{ws+=`
${ctx.indent}`}}else if(!explicitKey&&isCollection(value)){const vs0=valueStr[0];const nl0=valueStr.indexOf("\n");const hasNewline=nl0!==-1;const flow=ctx.inFlow??value.flow??value.items.length===0;if(hasNewline||!flow){let hasPropsLine=false;if(hasNewline&&(vs0==="&"||vs0==="!")){let sp0=valueStr.indexOf(" ");if(vs0==="&"&&sp0!==-1&&sp0<nl0&&valueStr[sp0+1]==="!"){sp0=valueStr.indexOf(" ",sp0+1)}if(sp0===-1||nl0<sp0)hasPropsLine=true}if(!hasPropsLine)ws=`
${ctx.indent}`}}else if(valueStr===""||valueStr[0]==="\n"){ws=""}str+=ws+valueStr;if(ctx.inFlow){if(valueCommentDone&&onComment)onComment()}else if(valueComment&&!valueCommentDone){str+=lineComment(str,ctx.indent,commentString(valueComment))}else if(chompKeep&&onChompKeep){onChompKeep()}return str}function warn(logLevel,warning){if(logLevel==="debug"||logLevel==="warn"){if(typeof process!=="undefined"&&process.emitWarning)process.emitWarning(warning);else console.warn(warning)}}var MERGE_KEY="<<";function addPairToJSMap(ctx,map2,{key,value}){if(ctx?.doc.schema.merge&&isMergeKey(key)){value=isAlias(value)?value.resolve(ctx.doc):value;if(isSeq(value))for(const it of value.items)mergeToJSMap(ctx,map2,it);else if(Array.isArray(value))for(const it of value)mergeToJSMap(ctx,map2,it);else mergeToJSMap(ctx,map2,value)}else{const jsKey=toJS(key,"",ctx);if(map2 instanceof Map){map2.set(jsKey,toJS(value,jsKey,ctx))}else if(map2 instanceof Set){map2.add(jsKey)}else{const stringKey=stringifyKey(key,jsKey,ctx);const jsValue=toJS(value,stringKey,ctx);if(stringKey in map2)Object.defineProperty(map2,stringKey,{value:jsValue,writable:true,enumerable:true,configurable:true});else map2[stringKey]=jsValue}}return map2}var isMergeKey=key=>key===MERGE_KEY||isScalar(key)&&key.value===MERGE_KEY&&(!key.type||key.type===Scalar.PLAIN);function mergeToJSMap(ctx,map2,value){const source=ctx&&isAlias(value)?value.resolve(ctx.doc):value;if(!isMap(source))throw new Error("Merge sources must be maps or map aliases");const srcMap=source.toJSON(null,ctx,Map);for(const[key,value2]of srcMap){if(map2 instanceof Map){if(!map2.has(key))map2.set(key,value2)}else if(map2 instanceof Set){map2.add(key)}else if(!Object.prototype.hasOwnProperty.call(map2,key)){Object.defineProperty(map2,key,{value:value2,writable:true,enumerable:true,configurable:true})}}return map2}function stringifyKey(key,jsKey,ctx){if(jsKey===null)return"";if(typeof jsKey!=="object")return String(jsKey);if(isNode(key)&&ctx?.doc){const strCtx=createStringifyContext(ctx.doc,{});strCtx.anchors=new Set;for(const node of ctx.anchors.keys())strCtx.anchors.add(node.anchor);strCtx.inFlow=true;strCtx.inStringifyKey=true;const strKey=key.toString(strCtx);if(!ctx.mapKeyWarned){let jsonStr=JSON.stringify(strKey);if(jsonStr.length>40)jsonStr=jsonStr.substring(0,36)+'..."';warn(ctx.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);ctx.mapKeyWarned=true}return strKey}return JSON.stringify(jsKey)}function createPair(key,value,ctx){const k=createNode(key,void 0,ctx);const v=createNode(value,void 0,ctx);return new Pair(k,v)}var Pair=class _Pair{constructor(key,value=null){Object.defineProperty(this,NODE_TYPE,{value:PAIR});this.key=key;this.value=value}clone(schema4){let{key,value}=this;if(isNode(key))key=key.clone(schema4);if(isNode(value))value=value.clone(schema4);return new _Pair(key,value)}toJSON(_,ctx){const pair=ctx?.mapAsMap?new Map:{};return addPairToJSMap(ctx,pair,this)}toString(ctx,onComment,onChompKeep){return ctx?.doc?stringifyPair(this,ctx,onComment,onChompKeep):JSON.stringify(this)}};function stringifyCollection(collection,ctx,options){const flow=ctx.inFlow??collection.flow;const stringify4=flow?stringifyFlowCollection:stringifyBlockCollection;return stringify4(collection,ctx,options)}function stringifyBlockCollection({comment,items},ctx,{blockItemPrefix,flowChars,itemIndent,onChompKeep,onComment}){const{indent,options:{commentString}}=ctx;const itemCtx=Object.assign({},ctx,{indent:itemIndent,type:null});let chompKeep=false;const lines=[];for(let i=0;i<items.length;++i){const item=items[i];let comment2=null;if(isNode(item)){if(!chompKeep&&item.spaceBefore)lines.push("");addCommentBefore(ctx,lines,item.commentBefore,chompKeep);if(item.comment)comment2=item.comment}else if(isPair(item)){const ik=isNode(item.key)?item.key:null;if(ik){if(!chompKeep&&ik.spaceBefore)lines.push("");addCommentBefore(ctx,lines,ik.commentBefore,chompKeep)}}chompKeep=false;let str2=stringify(item,itemCtx,()=>comment2=null,()=>chompKeep=true);if(comment2)str2+=lineComment(str2,itemIndent,commentString(comment2));if(chompKeep&&comment2)chompKeep=false;lines.push(blockItemPrefix+str2)}let str;if(lines.length===0){str=flowChars.start+flowChars.end}else{str=lines[0];for(let i=1;i<lines.length;++i){const line=lines[i];str+=line?`
${indent}${line}`:"\n"}}if(comment){str+="\n"+indentComment(commentString(comment),indent);if(onComment)onComment()}else if(chompKeep&&onChompKeep)onChompKeep();return str}function stringifyFlowCollection({comment,items},ctx,{flowChars,itemIndent,onComment}){const{indent,indentStep,flowCollectionPadding:fcPadding,options:{commentString}}=ctx;itemIndent+=indentStep;const itemCtx=Object.assign({},ctx,{indent:itemIndent,inFlow:true,type:null});let reqNewline=false;let linesAtValue=0;const lines=[];for(let i=0;i<items.length;++i){const item=items[i];let comment2=null;if(isNode(item)){if(item.spaceBefore)lines.push("");addCommentBefore(ctx,lines,item.commentBefore,false);if(item.comment)comment2=item.comment}else if(isPair(item)){const ik=isNode(item.key)?item.key:null;if(ik){if(ik.spaceBefore)lines.push("");addCommentBefore(ctx,lines,ik.commentBefore,false);if(ik.comment)reqNewline=true}const iv=isNode(item.value)?item.value:null;if(iv){if(iv.comment)comment2=iv.comment;if(iv.commentBefore)reqNewline=true}else if(item.value==null&&ik?.comment){comment2=ik.comment}}if(comment2)reqNewline=true;let str2=stringify(item,itemCtx,()=>comment2=null);if(i<items.length-1)str2+=",";if(comment2)str2+=lineComment(str2,itemIndent,commentString(comment2));if(!reqNewline&&(lines.length>linesAtValue||str2.includes("\n")))reqNewline=true;lines.push(str2);linesAtValue=lines.length}let str;const{start,end}=flowChars;if(lines.length===0){str=start+end}else{if(!reqNewline){const len=lines.reduce((sum,line)=>sum+line.length+2,2);reqNewline=ctx.options.lineWidth>0&&len>ctx.options.lineWidth}if(reqNewline){str=start;for(const line of lines)str+=line?`
${indentStep}${indent}${line}`:"\n";str+=`
${indent}${end}`}else{str=`${start}${fcPadding}${lines.join(" ")}${fcPadding}${end}`}}if(comment){str+=lineComment(str,indent,commentString(comment));if(onComment)onComment()}return str}function addCommentBefore({indent,options:{commentString}},lines,comment,chompKeep){if(comment&&chompKeep)comment=comment.replace(/^\n+/,"");if(comment){const ic=indentComment(commentString(comment),indent);lines.push(ic.trimStart())}}function findPair(items,key){const k=isScalar(key)?key.value:key;for(const it of items){if(isPair(it)){if(it.key===key||it.key===k)return it;if(isScalar(it.key)&&it.key.value===k)return it}}return void 0}var YAMLMap=class extends Collection{static get tagName(){return"tag:yaml.org,2002:map"}constructor(schema4){super(MAP,schema4);this.items=[]}static from(schema4,obj,ctx){const{keepUndefined,replacer}=ctx;const map2=new this(schema4);const add=(key,value)=>{if(typeof replacer==="function")value=replacer.call(obj,key,value);else if(Array.isArray(replacer)&&!replacer.includes(key))return;if(value!==void 0||keepUndefined)map2.items.push(createPair(key,value,ctx))};if(obj instanceof Map){for(const[key,value]of obj)add(key,value)}else if(obj&&typeof obj==="object"){for(const key of Object.keys(obj))add(key,obj[key])}if(typeof schema4.sortMapEntries==="function"){map2.items.sort(schema4.sortMapEntries)}return map2}add(pair,overwrite){let _pair;if(isPair(pair))_pair=pair;else if(!pair||typeof pair!=="object"||!("key"in pair)){_pair=new Pair(pair,pair?.value)}else _pair=new Pair(pair.key,pair.value);const prev=findPair(this.items,_pair.key);const sortEntries=this.schema?.sortMapEntries;if(prev){if(!overwrite)throw new Error(`Key ${_pair.key} already set`);if(isScalar(prev.value)&&isScalarValue(_pair.value))prev.value.value=_pair.value;else prev.value=_pair.value}else if(sortEntries){const i=this.items.findIndex(item=>sortEntries(_pair,item)<0);if(i===-1)this.items.push(_pair);else this.items.splice(i,0,_pair)}else{this.items.push(_pair)}}delete(key){const it=findPair(this.items,key);if(!it)return false;const del=this.items.splice(this.items.indexOf(it),1);return del.length>0}get(key,keepScalar){const it=findPair(this.items,key);const node=it?.value;return(!keepScalar&&isScalar(node)?node.value:node)??void 0}has(key){return!!findPair(this.items,key)}set(key,value){this.add(new Pair(key,value),true)}toJSON(_,ctx,Type){const map2=Type?new Type:ctx?.mapAsMap?new Map:{};if(ctx?.onCreate)ctx.onCreate(map2);for(const item of this.items)addPairToJSMap(ctx,map2,item);return map2}toString(ctx,onComment,onChompKeep){if(!ctx)return JSON.stringify(this);for(const item of this.items){if(!isPair(item))throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`)}if(!ctx.allNullValues&&this.hasAllNullValues(false))ctx=Object.assign({},ctx,{allNullValues:true});return stringifyCollection(this,ctx,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:ctx.indent||"",onChompKeep,onComment})}};var map={collection:"map",default:true,nodeClass:YAMLMap,tag:"tag:yaml.org,2002:map",resolve(map2,onError){if(!isMap(map2))onError("Expected a mapping for this tag");return map2},createNode:(schema4,obj,ctx)=>YAMLMap.from(schema4,obj,ctx)};var YAMLSeq=class extends Collection{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(schema4){super(SEQ,schema4);this.items=[]}add(value){this.items.push(value)}delete(key){const idx=asItemIndex(key);if(typeof idx!=="number")return false;const del=this.items.splice(idx,1);return del.length>0}get(key,keepScalar){const idx=asItemIndex(key);if(typeof idx!=="number")return void 0;const it=this.items[idx];return!keepScalar&&isScalar(it)?it.value:it}has(key){const idx=asItemIndex(key);return typeof idx==="number"&&idx<this.items.length}set(key,value){const idx=asItemIndex(key);if(typeof idx!=="number")throw new Error(`Expected a valid index, not ${key}.`);const prev=this.items[idx];if(isScalar(prev)&&isScalarValue(value))prev.value=value;else this.items[idx]=value}toJSON(_,ctx){const seq2=[];if(ctx?.onCreate)ctx.onCreate(seq2);let i=0;for(const item of this.items)seq2.push(toJS(item,String(i++),ctx));return seq2}toString(ctx,onComment,onChompKeep){if(!ctx)return JSON.stringify(this);return stringifyCollection(this,ctx,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(ctx.indent||"")+"  ",onChompKeep,onComment})}static from(schema4,obj,ctx){const{replacer}=ctx;const seq2=new this(schema4);if(obj&&Symbol.iterator in Object(obj)){let i=0;for(let it of obj){if(typeof replacer==="function"){const key=obj instanceof Set?it:String(i++);it=replacer.call(obj,key,it)}seq2.items.push(createNode(it,void 0,ctx))}}return seq2}};function asItemIndex(key){let idx=isScalar(key)?key.value:key;if(idx&&typeof idx==="string")idx=Number(idx);return typeof idx==="number"&&Number.isInteger(idx)&&idx>=0?idx:null}var seq={collection:"seq",default:true,nodeClass:YAMLSeq,tag:"tag:yaml.org,2002:seq",resolve(seq2,onError){if(!isSeq(seq2))onError("Expected a sequence for this tag");return seq2},createNode:(schema4,obj,ctx)=>YAMLSeq.from(schema4,obj,ctx)};var string={identify:value=>typeof value==="string",default:true,tag:"tag:yaml.org,2002:str",resolve:str=>str,stringify(item,ctx,onComment,onChompKeep){ctx=Object.assign({actualString:true},ctx);return stringifyString(item,ctx,onComment,onChompKeep)}};var nullTag={identify:value=>value==null,createNode:()=>new Scalar(null),default:true,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new Scalar(null),stringify:({source},ctx)=>typeof source==="string"&&nullTag.test.test(source)?source:ctx.options.nullStr};var boolTag={identify:value=>typeof value==="boolean",default:true,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:str=>new Scalar(str[0]==="t"||str[0]==="T"),stringify({source,value},ctx){if(source&&boolTag.test.test(source)){const sv=source[0]==="t"||source[0]==="T";if(value===sv)return source}return value?ctx.options.trueStr:ctx.options.falseStr}};function stringifyNumber({format,minFractionDigits,tag,value}){if(typeof value==="bigint")return String(value);const num=typeof value==="number"?value:Number(value);if(!isFinite(num))return isNaN(num)?".nan":num<0?"-.inf":".inf";let n=JSON.stringify(value);if(!format&&minFractionDigits&&(!tag||tag==="tag:yaml.org,2002:float")&&/^\d/.test(n)){let i=n.indexOf(".");if(i<0){i=n.length;n+="."}let d=minFractionDigits-(n.length-i-1);while(d-- >0)n+="0"}return n}var floatNaN={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/,resolve:str=>str.slice(-3).toLowerCase()==="nan"?NaN:str[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:stringifyNumber};var floatExp={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:str=>parseFloat(str),stringify(node){const num=Number(node.value);return isFinite(num)?num.toExponential():stringifyNumber(node)}};var float={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(str){const node=new Scalar(parseFloat(str));const dot=str.indexOf(".");if(dot!==-1&&str[str.length-1]==="0")node.minFractionDigits=str.length-dot-1;return node},stringify:stringifyNumber};var intIdentify=value=>typeof value==="bigint"||Number.isInteger(value);var intResolve=(str,offset,radix,{intAsBigInt})=>intAsBigInt?BigInt(str):parseInt(str.substring(offset),radix);function intStringify(node,radix,prefix){const{value}=node;if(intIdentify(value)&&value>=0)return prefix+value.toString(radix);return stringifyNumber(node)}var intOct={identify:value=>intIdentify(value)&&value>=0,default:true,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(str,_onError,opt)=>intResolve(str,2,8,opt),stringify:node=>intStringify(node,8,"0o")};var int={identify:intIdentify,default:true,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(str,_onError,opt)=>intResolve(str,0,10,opt),stringify:stringifyNumber};var intHex={identify:value=>intIdentify(value)&&value>=0,default:true,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(str,_onError,opt)=>intResolve(str,2,16,opt),stringify:node=>intStringify(node,16,"0x")};var schema=[map,seq,string,nullTag,boolTag,intOct,int,intHex,floatNaN,floatExp,float];function intIdentify2(value){return typeof value==="bigint"||Number.isInteger(value)}var stringifyJSON=({value})=>JSON.stringify(value);var jsonScalars=[{identify:value=>typeof value==="string",default:true,tag:"tag:yaml.org,2002:str",resolve:str=>str,stringify:stringifyJSON},{identify:value=>value==null,createNode:()=>new Scalar(null),default:true,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:stringifyJSON},{identify:value=>typeof value==="boolean",default:true,tag:"tag:yaml.org,2002:bool",test:/^true|false$/,resolve:str=>str==="true",stringify:stringifyJSON},{identify:intIdentify2,default:true,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(str,_onError,{intAsBigInt})=>intAsBigInt?BigInt(str):parseInt(str,10),stringify:({value})=>intIdentify2(value)?value.toString():JSON.stringify(value)},{identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:str=>parseFloat(str),stringify:stringifyJSON}];var jsonError={default:true,tag:"",test:/^/,resolve(str,onError){onError(`Unresolved plain scalar ${JSON.stringify(str)}`);return str}};var schema2=[map,seq].concat(jsonScalars,jsonError);var binary={identify:value=>value instanceof Uint8Array,default:false,tag:"tag:yaml.org,2002:binary",resolve(src,onError){if(typeof Buffer==="function"){return Buffer.from(src,"base64")}else if(typeof atob==="function"){const str=atob(src.replace(/[\n\r]/g,""));const buffer=new Uint8Array(str.length);for(let i=0;i<str.length;++i)buffer[i]=str.charCodeAt(i);return buffer}else{onError("This environment does not support reading binary tags; either Buffer or atob is required");return src}},stringify({comment,type,value},ctx,onComment,onChompKeep){const buf=value;let str;if(typeof Buffer==="function"){str=buf instanceof Buffer?buf.toString("base64"):Buffer.from(buf.buffer).toString("base64")}else if(typeof btoa==="function"){let s="";for(let i=0;i<buf.length;++i)s+=String.fromCharCode(buf[i]);str=btoa(s)}else{throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required")}if(!type)type=Scalar.BLOCK_LITERAL;if(type!==Scalar.QUOTE_DOUBLE){const lineWidth=Math.max(ctx.options.lineWidth-ctx.indent.length,ctx.options.minContentWidth);const n=Math.ceil(str.length/lineWidth);const lines=new Array(n);for(let i=0,o=0;i<n;++i,o+=lineWidth){lines[i]=str.substr(o,lineWidth)}str=lines.join(type===Scalar.BLOCK_LITERAL?"\n":" ")}return stringifyString({comment,type,value:str},ctx,onComment,onChompKeep)}};function resolvePairs(seq2,onError){if(isSeq(seq2)){for(let i=0;i<seq2.items.length;++i){let item=seq2.items[i];if(isPair(item))continue;else if(isMap(item)){if(item.items.length>1)onError("Each pair must have its own sequence indicator");const pair=item.items[0]||new Pair(new Scalar(null));if(item.commentBefore)pair.key.commentBefore=pair.key.commentBefore?`${item.commentBefore}
${pair.key.commentBefore}`:item.commentBefore;if(item.comment){const cn=pair.value??pair.key;cn.comment=cn.comment?`${item.comment}
${cn.comment}`:item.comment}item=pair}seq2.items[i]=isPair(item)?item:new Pair(item)}}else onError("Expected a sequence for this tag");return seq2}function createPairs(schema4,iterable,ctx){const{replacer}=ctx;const pairs2=new YAMLSeq(schema4);pairs2.tag="tag:yaml.org,2002:pairs";let i=0;if(iterable&&Symbol.iterator in Object(iterable))for(let it of iterable){if(typeof replacer==="function")it=replacer.call(iterable,String(i++),it);let key,value;if(Array.isArray(it)){if(it.length===2){key=it[0];value=it[1]}else throw new TypeError(`Expected [key, value] tuple: ${it}`)}else if(it&&it instanceof Object){const keys=Object.keys(it);if(keys.length===1){key=keys[0];value=it[key]}else{throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`)}}else{key=it}pairs2.items.push(createPair(key,value,ctx))}return pairs2}var pairs={collection:"seq",default:false,tag:"tag:yaml.org,2002:pairs",resolve:resolvePairs,createNode:createPairs};var YAMLOMap=class _YAMLOMap extends YAMLSeq{constructor(){super();this.add=YAMLMap.prototype.add.bind(this);this.delete=YAMLMap.prototype.delete.bind(this);this.get=YAMLMap.prototype.get.bind(this);this.has=YAMLMap.prototype.has.bind(this);this.set=YAMLMap.prototype.set.bind(this);this.tag=_YAMLOMap.tag}toJSON(_,ctx){if(!ctx)return super.toJSON(_);const map2=new Map;if(ctx?.onCreate)ctx.onCreate(map2);for(const pair of this.items){let key,value;if(isPair(pair)){key=toJS(pair.key,"",ctx);value=toJS(pair.value,key,ctx)}else{key=toJS(pair,"",ctx)}if(map2.has(key))throw new Error("Ordered maps must not include duplicate keys");map2.set(key,value)}return map2}static from(schema4,iterable,ctx){const pairs2=createPairs(schema4,iterable,ctx);const omap2=new this;omap2.items=pairs2.items;return omap2}};YAMLOMap.tag="tag:yaml.org,2002:omap";var omap={collection:"seq",identify:value=>value instanceof Map,nodeClass:YAMLOMap,default:false,tag:"tag:yaml.org,2002:omap",resolve(seq2,onError){const pairs2=resolvePairs(seq2,onError);const seenKeys=[];for(const{key}of pairs2.items){if(isScalar(key)){if(seenKeys.includes(key.value)){onError(`Ordered maps must not include duplicate keys: ${key.value}`)}else{seenKeys.push(key.value)}}}return Object.assign(new YAMLOMap,pairs2)},createNode:(schema4,iterable,ctx)=>YAMLOMap.from(schema4,iterable,ctx)};function boolStringify({value,source},ctx){const boolObj=value?trueTag:falseTag;if(source&&boolObj.test.test(source))return source;return value?ctx.options.trueStr:ctx.options.falseStr}var trueTag={identify:value=>value===true,default:true,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new Scalar(true),stringify:boolStringify};var falseTag={identify:value=>value===false,default:true,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i,resolve:()=>new Scalar(false),stringify:boolStringify};var floatNaN2={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",test:/^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/,resolve:str=>str.slice(-3).toLowerCase()==="nan"?NaN:str[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:stringifyNumber};var floatExp2={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:str=>parseFloat(str.replace(/_/g,"")),stringify(node){const num=Number(node.value);return isFinite(num)?num.toExponential():stringifyNumber(node)}};var float2={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(str){const node=new Scalar(parseFloat(str.replace(/_/g,"")));const dot=str.indexOf(".");if(dot!==-1){const f=str.substring(dot+1).replace(/_/g,"");if(f[f.length-1]==="0")node.minFractionDigits=f.length}return node},stringify:stringifyNumber};var intIdentify3=value=>typeof value==="bigint"||Number.isInteger(value);function intResolve2(str,offset,radix,{intAsBigInt}){const sign=str[0];if(sign==="-"||sign==="+")offset+=1;str=str.substring(offset).replace(/_/g,"");if(intAsBigInt){switch(radix){case 2:str=`0b${str}`;break;case 8:str=`0o${str}`;break;case 16:str=`0x${str}`;break}const n2=BigInt(str);return sign==="-"?BigInt(-1)*n2:n2}const n=parseInt(str,radix);return sign==="-"?-1*n:n}function intStringify2(node,radix,prefix){const{value}=node;if(intIdentify3(value)){const str=value.toString(radix);return value<0?"-"+prefix+str.substr(1):prefix+str}return stringifyNumber(node)}var intBin={identify:intIdentify3,default:true,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(str,_onError,opt)=>intResolve2(str,2,2,opt),stringify:node=>intStringify2(node,2,"0b")};var intOct2={identify:intIdentify3,default:true,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(str,_onError,opt)=>intResolve2(str,1,8,opt),stringify:node=>intStringify2(node,8,"0")};var int2={identify:intIdentify3,default:true,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(str,_onError,opt)=>intResolve2(str,0,10,opt),stringify:stringifyNumber};var intHex2={identify:intIdentify3,default:true,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(str,_onError,opt)=>intResolve2(str,2,16,opt),stringify:node=>intStringify2(node,16,"0x")};var YAMLSet=class _YAMLSet extends YAMLMap{constructor(schema4){super(schema4);this.tag=_YAMLSet.tag}add(key){let pair;if(isPair(key))pair=key;else if(key&&typeof key==="object"&&"key"in key&&"value"in key&&key.value===null)pair=new Pair(key.key,null);else pair=new Pair(key,null);const prev=findPair(this.items,pair.key);if(!prev)this.items.push(pair)}get(key,keepPair){const pair=findPair(this.items,key);return!keepPair&&isPair(pair)?isScalar(pair.key)?pair.key.value:pair.key:pair}set(key,value){if(typeof value!=="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);const prev=findPair(this.items,key);if(prev&&!value){this.items.splice(this.items.indexOf(prev),1)}else if(!prev&&value){this.items.push(new Pair(key))}}toJSON(_,ctx){return super.toJSON(_,ctx,Set)}toString(ctx,onComment,onChompKeep){if(!ctx)return JSON.stringify(this);if(this.hasAllNullValues(true))return super.toString(Object.assign({},ctx,{allNullValues:true}),onComment,onChompKeep);else throw new Error("Set items must all have null values")}static from(schema4,iterable,ctx){const{replacer}=ctx;const set2=new this(schema4);if(iterable&&Symbol.iterator in Object(iterable))for(let value of iterable){if(typeof replacer==="function")value=replacer.call(iterable,value,value);set2.items.push(createPair(value,null,ctx))}return set2}};YAMLSet.tag="tag:yaml.org,2002:set";var set={collection:"map",identify:value=>value instanceof Set,nodeClass:YAMLSet,default:false,tag:"tag:yaml.org,2002:set",createNode:(schema4,iterable,ctx)=>YAMLSet.from(schema4,iterable,ctx),resolve(map2,onError){if(isMap(map2)){if(map2.hasAllNullValues(true))return Object.assign(new YAMLSet,map2);else onError("Set items must all have null values")}else onError("Expected a mapping for this tag");return map2}};function parseSexagesimal(str,asBigInt){const sign=str[0];const parts=sign==="-"||sign==="+"?str.substring(1):str;const num=n=>asBigInt?BigInt(n):Number(n);const res=parts.replace(/_/g,"").split(":").reduce((res2,p)=>res2*num(60)+num(p),num(0));return sign==="-"?num(-1)*res:res}function stringifySexagesimal(node){let{value}=node;let num=n=>n;if(typeof value==="bigint")num=n=>BigInt(n);else if(isNaN(value)||!isFinite(value))return stringifyNumber(node);let sign="";if(value<0){sign="-";value*=num(-1)}const _60=num(60);const parts=[value%_60];if(value<60){parts.unshift(0)}else{value=(value-parts[0])/_60;parts.unshift(value%_60);if(value>=60){value=(value-parts[0])/_60;parts.unshift(value)}}return sign+parts.map(n=>String(n).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var intTime={identify:value=>typeof value==="bigint"||Number.isInteger(value),default:true,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(str,_onError,{intAsBigInt})=>parseSexagesimal(str,intAsBigInt),stringify:stringifySexagesimal};var floatTime={identify:value=>typeof value==="number",default:true,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:str=>parseSexagesimal(str,false),stringify:stringifySexagesimal};var timestamp={identify:value=>value instanceof Date,default:true,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(str){const match=str.match(timestamp.test);if(!match)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");const[,year,month,day,hour,minute,second]=match.map(Number);const millisec=match[7]?Number((match[7]+"00").substr(1,3)):0;let date=Date.UTC(year,month-1,day,hour||0,minute||0,second||0,millisec);const tz=match[8];if(tz&&tz!=="Z"){let d=parseSexagesimal(tz,false);if(Math.abs(d)<30)d*=60;date-=6e4*d}return new Date(date)},stringify:({value})=>value.toISOString().replace(/((T00:00)?:00)?\.000Z$/,"")};var schema3=[map,seq,string,nullTag,trueTag,falseTag,intBin,intOct2,int2,intHex2,floatNaN2,floatExp2,float2,binary,omap,pairs,set,intTime,floatTime,timestamp];var schemas=new Map([["core",schema],["failsafe",[map,seq,string]],["json",schema2],["yaml11",schema3],["yaml-1.1",schema3]]);var tagsByName={binary,bool:boolTag,float,floatExp,floatNaN,floatTime,int,intHex,intOct,intTime,map,null:nullTag,omap,pairs,seq,set,timestamp};var coreKnownTags={"tag:yaml.org,2002:binary":binary,"tag:yaml.org,2002:omap":omap,"tag:yaml.org,2002:pairs":pairs,"tag:yaml.org,2002:set":set,"tag:yaml.org,2002:timestamp":timestamp};function getTags(customTags,schemaName){let tags=schemas.get(schemaName);if(!tags){if(Array.isArray(customTags))tags=[];else{const keys=Array.from(schemas.keys()).filter(key=>key!=="yaml11").map(key=>JSON.stringify(key)).join(", ");throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`)}}if(Array.isArray(customTags)){for(const tag of customTags)tags=tags.concat(tag)}else if(typeof customTags==="function"){tags=customTags(tags.slice())}return tags.map(tag=>{if(typeof tag!=="string")return tag;const tagObj=tagsByName[tag];if(tagObj)return tagObj;const keys=Object.keys(tagsByName).map(key=>JSON.stringify(key)).join(", ");throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`)})}var sortMapEntriesByKey=(a,b)=>a.key<b.key?-1:a.key>b.key?1:0;var Schema=class _Schema{constructor({compat,customTags,merge,resolveKnownTags,schema:schema4,sortMapEntries,toStringDefaults}){this.compat=Array.isArray(compat)?getTags(compat,"compat"):compat?getTags(null,compat):null;this.merge=!!merge;this.name=typeof schema4==="string"&&schema4||"core";this.knownTags=resolveKnownTags?coreKnownTags:{};this.tags=getTags(customTags,this.name);this.toStringOptions=toStringDefaults??null;Object.defineProperty(this,MAP,{value:map});Object.defineProperty(this,SCALAR,{value:string});Object.defineProperty(this,SEQ,{value:seq});this.sortMapEntries=typeof sortMapEntries==="function"?sortMapEntries:sortMapEntries===true?sortMapEntriesByKey:null}clone(){const copy=Object.create(_Schema.prototype,Object.getOwnPropertyDescriptors(this));copy.tags=this.tags.slice();return copy}};function stringifyDocument(doc,options){const lines=[];let hasDirectives=options.directives===true;if(options.directives!==false&&doc.directives){const dir=doc.directives.toString(doc);if(dir){lines.push(dir);hasDirectives=true}else if(doc.directives.docStart)hasDirectives=true}if(hasDirectives)lines.push("---");const ctx=createStringifyContext(doc,options);const{commentString}=ctx.options;if(doc.commentBefore){if(lines.length!==1)lines.unshift("");const cs=commentString(doc.commentBefore);lines.unshift(indentComment(cs,""))}let chompKeep=false;let contentComment=null;if(doc.contents){if(isNode(doc.contents)){if(doc.contents.spaceBefore&&hasDirectives)lines.push("");if(doc.contents.commentBefore){const cs=commentString(doc.contents.commentBefore);lines.push(indentComment(cs,""))}ctx.forceBlockIndent=!!doc.comment;contentComment=doc.contents.comment}const onChompKeep=contentComment?void 0:()=>chompKeep=true;let body=stringify(doc.contents,ctx,()=>contentComment=null,onChompKeep);if(contentComment)body+=lineComment(body,"",commentString(contentComment));if((body[0]==="|"||body[0]===">")&&lines[lines.length-1]==="---"){lines[lines.length-1]=`--- ${body}`}else lines.push(body)}else{lines.push(stringify(doc.contents,ctx))}if(doc.directives?.docEnd){if(doc.comment){const cs=commentString(doc.comment);if(cs.includes("\n")){lines.push("...");lines.push(indentComment(cs,""))}else{lines.push(`... ${cs}`)}}else{lines.push("...")}}else{let dc=doc.comment;if(dc&&chompKeep)dc=dc.replace(/^\n+/,"");if(dc){if((!chompKeep||contentComment)&&lines[lines.length-1]!=="")lines.push("");lines.push(indentComment(commentString(dc),""))}}return lines.join("\n")+"\n"}var Document=class _Document{constructor(value,replacer,options){this.commentBefore=null;this.comment=null;this.errors=[];this.warnings=[];Object.defineProperty(this,NODE_TYPE,{value:DOC});let _replacer=null;if(typeof replacer==="function"||Array.isArray(replacer)){_replacer=replacer}else if(options===void 0&&replacer){options=replacer;replacer=void 0}const opt=Object.assign({intAsBigInt:false,keepSourceTokens:false,logLevel:"warn",prettyErrors:true,strict:true,uniqueKeys:true,version:"1.2"},options);this.options=opt;let{version}=opt;if(options?._directives){this.directives=options._directives.atDocument();if(this.directives.yaml.explicit)version=this.directives.yaml.version}else this.directives=new Directives({version});this.setSchema(version,options);this.contents=value===void 0?null:this.createNode(value,_replacer,options)}clone(){const copy=Object.create(_Document.prototype,{[NODE_TYPE]:{value:DOC}});copy.commentBefore=this.commentBefore;copy.comment=this.comment;copy.errors=this.errors.slice();copy.warnings=this.warnings.slice();copy.options=Object.assign({},this.options);if(this.directives)copy.directives=this.directives.clone();copy.schema=this.schema.clone();copy.contents=isNode(this.contents)?this.contents.clone(copy.schema):this.contents;if(this.range)copy.range=this.range.slice();return copy}add(value){if(assertCollection(this.contents))this.contents.add(value)}addIn(path,value){if(assertCollection(this.contents))this.contents.addIn(path,value)}createAlias(node,name){if(!node.anchor){const prev=anchorNames(this);node.anchor=!name||prev.has(name)?findNewAnchor(name||"a",prev):name}return new Alias(node.anchor)}createNode(value,replacer,options){let _replacer=void 0;if(typeof replacer==="function"){value=replacer.call({"":value},"",value);_replacer=replacer}else if(Array.isArray(replacer)){const keyToStr=v=>typeof v==="number"||v instanceof String||v instanceof Number;const asStr=replacer.filter(keyToStr).map(String);if(asStr.length>0)replacer=replacer.concat(asStr);_replacer=replacer}else if(options===void 0&&replacer){options=replacer;replacer=void 0}const{aliasDuplicateObjects,anchorPrefix,flow,keepUndefined,onTagObj,tag}=options??{};const{onAnchor,setAnchors,sourceObjects}=createNodeAnchors(this,anchorPrefix||"a");const ctx={aliasDuplicateObjects:aliasDuplicateObjects??true,keepUndefined:keepUndefined??false,onAnchor,onTagObj,replacer:_replacer,schema:this.schema,sourceObjects};const node=createNode(value,tag,ctx);if(flow&&isCollection(node))node.flow=true;setAnchors();return node}createPair(key,value,options={}){const k=this.createNode(key,null,options);const v=this.createNode(value,null,options);return new Pair(k,v)}delete(key){return assertCollection(this.contents)?this.contents.delete(key):false}deleteIn(path){if(isEmptyPath(path)){if(this.contents==null)return false;this.contents=null;return true}return assertCollection(this.contents)?this.contents.deleteIn(path):false}get(key,keepScalar){return isCollection(this.contents)?this.contents.get(key,keepScalar):void 0}getIn(path,keepScalar){if(isEmptyPath(path))return!keepScalar&&isScalar(this.contents)?this.contents.value:this.contents;return isCollection(this.contents)?this.contents.getIn(path,keepScalar):void 0}has(key){return isCollection(this.contents)?this.contents.has(key):false}hasIn(path){if(isEmptyPath(path))return this.contents!==void 0;return isCollection(this.contents)?this.contents.hasIn(path):false}set(key,value){if(this.contents==null){this.contents=collectionFromPath(this.schema,[key],value)}else if(assertCollection(this.contents)){this.contents.set(key,value)}}setIn(path,value){if(isEmptyPath(path)){this.contents=value}else if(this.contents==null){this.contents=collectionFromPath(this.schema,Array.from(path),value)}else if(assertCollection(this.contents)){this.contents.setIn(path,value)}}setSchema(version,options={}){if(typeof version==="number")version=String(version);let opt;switch(version){case"1.1":if(this.directives)this.directives.yaml.version="1.1";else this.directives=new Directives({version:"1.1"});opt={merge:true,resolveKnownTags:false,schema:"yaml-1.1"};break;case"1.2":case"next":if(this.directives)this.directives.yaml.version=version;else this.directives=new Directives({version});opt={merge:false,resolveKnownTags:true,schema:"core"};break;case null:if(this.directives)delete this.directives;opt=null;break;default:{const sv=JSON.stringify(version);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`)}}if(options.schema instanceof Object)this.schema=options.schema;else if(opt)this.schema=new Schema(Object.assign(opt,options));else throw new Error(`With a null YAML version, the { schema: Schema } option is required`)}toJS({json,jsonArg,mapAsMap,maxAliasCount,onAnchor,reviver}={}){const ctx={anchors:new Map,doc:this,keep:!json,mapAsMap:mapAsMap===true,mapKeyWarned:false,maxAliasCount:typeof maxAliasCount==="number"?maxAliasCount:100};const res=toJS(this.contents,jsonArg??"",ctx);if(typeof onAnchor==="function")for(const{count,res:res2}of ctx.anchors.values())onAnchor(res2,count);return typeof reviver==="function"?applyReviver(reviver,{"":res},"",res):res}toJSON(jsonArg,onAnchor){return this.toJS({json:true,jsonArg,mapAsMap:false,onAnchor})}toString(options={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in options&&(!Number.isInteger(options.indent)||Number(options.indent)<=0)){const s=JSON.stringify(options.indent);throw new Error(`"indent" option must be a positive integer, not ${s}`)}return stringifyDocument(this,options)}};function assertCollection(contents){if(isCollection(contents))return true;throw new Error("Expected a YAML collection as document contents")}var YAMLError=class extends Error{constructor(name,pos,code,message){super();this.name=name;this.code=code;this.message=message;this.pos=pos}};var YAMLParseError=class extends YAMLError{constructor(pos,code,message){super("YAMLParseError",pos,code,message)}};var YAMLWarning=class extends YAMLError{constructor(pos,code,message){super("YAMLWarning",pos,code,message)}};var prettifyError=(src,lc)=>error=>{if(error.pos[0]===-1)return;error.linePos=error.pos.map(pos=>lc.linePos(pos));const{line,col}=error.linePos[0];error.message+=` at line ${line}, column ${col}`;let ci=col-1;let lineStr=src.substring(lc.lineStarts[line-1],lc.lineStarts[line]).replace(/[\n\r]+$/,"");if(ci>=60&&lineStr.length>80){const trimStart=Math.min(ci-39,lineStr.length-79);lineStr="\u2026"+lineStr.substring(trimStart);ci-=trimStart-1}if(lineStr.length>80)lineStr=lineStr.substring(0,79)+"\u2026";if(line>1&&/^ *$/.test(lineStr.substring(0,ci))){let prev=src.substring(lc.lineStarts[line-2],lc.lineStarts[line-1]);if(prev.length>80)prev=prev.substring(0,79)+"\u2026\n";lineStr=prev+lineStr}if(/[^ ]/.test(lineStr)){let count=1;const end=error.linePos[1];if(end&&end.line===line&&end.col>col){count=Math.max(1,Math.min(end.col-col,80-ci))}const pointer=" ".repeat(ci)+"^".repeat(count);error.message+=`:

${lineStr}
${pointer}
`}};function resolveProps(tokens,{flow,indicator,next,offset,onError,startOnNewline}){let spaceBefore=false;let atNewline=startOnNewline;let hasSpace=startOnNewline;let comment="";let commentSep="";let hasNewline=false;let hasNewlineAfterProp=false;let reqSpace=false;let anchor=null;let tag=null;let comma=null;let found=null;let start=null;for(const token of tokens){if(reqSpace){if(token.type!=="space"&&token.type!=="newline"&&token.type!=="comma")onError(token.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space");reqSpace=false}switch(token.type){case"space":if(!flow&&atNewline&&indicator!=="doc-start"&&token.source[0]==="	")onError(token,"TAB_AS_INDENT","Tabs are not allowed as indentation");hasSpace=true;break;case"comment":{if(!hasSpace)onError(token,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");const cb=token.source.substring(1)||" ";if(!comment)comment=cb;else comment+=commentSep+cb;commentSep="";atNewline=false;break}case"newline":if(atNewline){if(comment)comment+=token.source;else spaceBefore=true}else commentSep+=token.source;atNewline=true;hasNewline=true;if(anchor||tag)hasNewlineAfterProp=true;hasSpace=true;break;case"anchor":if(anchor)onError(token,"MULTIPLE_ANCHORS","A node can have at most one anchor");if(token.source.endsWith(":"))onError(token.offset+token.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",true);anchor=token;if(start===null)start=token.offset;atNewline=false;hasSpace=false;reqSpace=true;break;case"tag":{if(tag)onError(token,"MULTIPLE_TAGS","A node can have at most one tag");tag=token;if(start===null)start=token.offset;atNewline=false;hasSpace=false;reqSpace=true;break}case indicator:if(anchor||tag)onError(token,"BAD_PROP_ORDER",`Anchors and tags must be after the ${token.source} indicator`);if(found)onError(token,"UNEXPECTED_TOKEN",`Unexpected ${token.source} in ${flow??"collection"}`);found=token;atNewline=false;hasSpace=false;break;case"comma":if(flow){if(comma)onError(token,"UNEXPECTED_TOKEN",`Unexpected , in ${flow}`);comma=token;atNewline=false;hasSpace=false;break}default:onError(token,"UNEXPECTED_TOKEN",`Unexpected ${token.type} token`);atNewline=false;hasSpace=false}}const last=tokens[tokens.length-1];const end=last?last.offset+last.source.length:offset;if(reqSpace&&next&&next.type!=="space"&&next.type!=="newline"&&next.type!=="comma"&&(next.type!=="scalar"||next.source!==""))onError(next.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space");return{comma,found,spaceBefore,comment,hasNewline,hasNewlineAfterProp,anchor,tag,end,start:start??end}}function containsNewline(key){if(!key)return null;switch(key.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(key.source.includes("\n"))return true;if(key.end){for(const st of key.end)if(st.type==="newline")return true}return false;case"flow-collection":for(const it of key.items){for(const st of it.start)if(st.type==="newline")return true;if(it.sep){for(const st of it.sep)if(st.type==="newline")return true}if(containsNewline(it.key)||containsNewline(it.value))return true}return false;default:return true}}function flowIndentCheck(indent,fc,onError){if(fc?.type==="flow-collection"){const end=fc.end[0];if(end.indent===indent&&(end.source==="]"||end.source==="}")&&containsNewline(fc)){const msg="Flow end indicator should be more indented than parent";onError(end,"BAD_INDENT",msg,true)}}}function mapIncludes(ctx,items,search){const{uniqueKeys}=ctx.options;if(uniqueKeys===false)return false;const isEqual=typeof uniqueKeys==="function"?uniqueKeys:(a,b)=>a===b||isScalar(a)&&isScalar(b)&&a.value===b.value&&!(a.value==="<<"&&ctx.schema.merge);return items.some(pair=>isEqual(pair.key,search))}var startColMsg="All mapping items must start at the same column";function resolveBlockMap({composeNode:composeNode2,composeEmptyNode:composeEmptyNode2},ctx,bm,onError,tag){const NodeClass=tag?.nodeClass??YAMLMap;const map2=new NodeClass(ctx.schema);if(ctx.atRoot)ctx.atRoot=false;let offset=bm.offset;let commentEnd=null;for(const collItem of bm.items){const{start,key,sep,value}=collItem;const keyProps=resolveProps(start,{indicator:"explicit-key-ind",next:key??sep?.[0],offset,onError,startOnNewline:true});const implicitKey=!keyProps.found;if(implicitKey){if(key){if(key.type==="block-seq")onError(offset,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key");else if("indent"in key&&key.indent!==bm.indent)onError(offset,"BAD_INDENT",startColMsg)}if(!keyProps.anchor&&!keyProps.tag&&!sep){commentEnd=keyProps.end;if(keyProps.comment){if(map2.comment)map2.comment+="\n"+keyProps.comment;else map2.comment=keyProps.comment}continue}if(keyProps.hasNewlineAfterProp||containsNewline(key)){onError(key??start[start.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}}else if(keyProps.found?.indent!==bm.indent){onError(offset,"BAD_INDENT",startColMsg)}const keyStart=keyProps.end;const keyNode=key?composeNode2(ctx,key,keyProps,onError):composeEmptyNode2(ctx,keyStart,start,null,keyProps,onError);if(ctx.schema.compat)flowIndentCheck(bm.indent,key,onError);if(mapIncludes(ctx,map2.items,keyNode))onError(keyStart,"DUPLICATE_KEY","Map keys must be unique");const valueProps=resolveProps(sep??[],{indicator:"map-value-ind",next:value,offset:keyNode.range[2],onError,startOnNewline:!key||key.type==="block-scalar"});offset=valueProps.end;if(valueProps.found){if(implicitKey){if(value?.type==="block-map"&&!valueProps.hasNewline)onError(offset,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings");if(ctx.options.strict&&keyProps.start<valueProps.found.offset-1024)onError(keyNode.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key")}const valueNode=value?composeNode2(ctx,value,valueProps,onError):composeEmptyNode2(ctx,offset,sep,null,valueProps,onError);if(ctx.schema.compat)flowIndentCheck(bm.indent,value,onError);offset=valueNode.range[2];const pair=new Pair(keyNode,valueNode);if(ctx.options.keepSourceTokens)pair.srcToken=collItem;map2.items.push(pair)}else{if(implicitKey)onError(keyNode.range,"MISSING_CHAR","Implicit map keys need to be followed by map values");if(valueProps.comment){if(keyNode.comment)keyNode.comment+="\n"+valueProps.comment;else keyNode.comment=valueProps.comment}const pair=new Pair(keyNode);if(ctx.options.keepSourceTokens)pair.srcToken=collItem;map2.items.push(pair)}}if(commentEnd&&commentEnd<offset)onError(commentEnd,"IMPOSSIBLE","Map comment with trailing content");map2.range=[bm.offset,offset,commentEnd??offset];return map2}function resolveBlockSeq({composeNode:composeNode2,composeEmptyNode:composeEmptyNode2},ctx,bs,onError,tag){const NodeClass=tag?.nodeClass??YAMLSeq;const seq2=new NodeClass(ctx.schema);if(ctx.atRoot)ctx.atRoot=false;let offset=bs.offset;let commentEnd=null;for(const{start,value}of bs.items){const props=resolveProps(start,{indicator:"seq-item-ind",next:value,offset,onError,startOnNewline:true});if(!props.found){if(props.anchor||props.tag||value){if(value&&value.type==="block-seq")onError(props.end,"BAD_INDENT","All sequence items must start at the same column");else onError(offset,"MISSING_CHAR","Sequence item without - indicator")}else{commentEnd=props.end;if(props.comment)seq2.comment=props.comment;continue}}const node=value?composeNode2(ctx,value,props,onError):composeEmptyNode2(ctx,props.end,start,null,props,onError);if(ctx.schema.compat)flowIndentCheck(bs.indent,value,onError);offset=node.range[2];seq2.items.push(node)}seq2.range=[bs.offset,offset,commentEnd??offset];return seq2}function resolveEnd(end,offset,reqSpace,onError){let comment="";if(end){let hasSpace=false;let sep="";for(const token of end){const{source,type}=token;switch(type){case"space":hasSpace=true;break;case"comment":{if(reqSpace&&!hasSpace)onError(token,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");const cb=source.substring(1)||" ";if(!comment)comment=cb;else comment+=sep+cb;sep="";break}case"newline":if(comment)sep+=source;hasSpace=true;break;default:onError(token,"UNEXPECTED_TOKEN",`Unexpected ${type} at node end`)}offset+=source.length}}return{comment,offset}}var blockMsg="Block collections are not allowed within flow collections";var isBlock=token=>token&&(token.type==="block-map"||token.type==="block-seq");function resolveFlowCollection({composeNode:composeNode2,composeEmptyNode:composeEmptyNode2},ctx,fc,onError,tag){const isMap2=fc.start.source==="{";const fcName=isMap2?"flow map":"flow sequence";const NodeClass=tag?.nodeClass??(isMap2?YAMLMap:YAMLSeq);const coll=new NodeClass(ctx.schema);coll.flow=true;const atRoot=ctx.atRoot;if(atRoot)ctx.atRoot=false;let offset=fc.offset+fc.start.source.length;for(let i=0;i<fc.items.length;++i){const collItem=fc.items[i];const{start,key,sep,value}=collItem;const props=resolveProps(start,{flow:fcName,indicator:"explicit-key-ind",next:key??sep?.[0],offset,onError,startOnNewline:false});if(!props.found){if(!props.anchor&&!props.tag&&!sep&&!value){if(i===0&&props.comma)onError(props.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${fcName}`);else if(i<fc.items.length-1)onError(props.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${fcName}`);if(props.comment){if(coll.comment)coll.comment+="\n"+props.comment;else coll.comment=props.comment}offset=props.end;continue}if(!isMap2&&ctx.options.strict&&containsNewline(key))onError(key,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(i===0){if(props.comma)onError(props.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${fcName}`)}else{if(!props.comma)onError(props.start,"MISSING_CHAR",`Missing , between ${fcName} items`);if(props.comment){let prevItemComment="";loop:for(const st of start){switch(st.type){case"comma":case"space":break;case"comment":prevItemComment=st.source.substring(1);break loop;default:break loop}}if(prevItemComment){let prev=coll.items[coll.items.length-1];if(isPair(prev))prev=prev.value??prev.key;if(prev.comment)prev.comment+="\n"+prevItemComment;else prev.comment=prevItemComment;props.comment=props.comment.substring(prevItemComment.length+1)}}}if(!isMap2&&!sep&&!props.found){const valueNode=value?composeNode2(ctx,value,props,onError):composeEmptyNode2(ctx,props.end,sep,null,props,onError);coll.items.push(valueNode);offset=valueNode.range[2];if(isBlock(value))onError(valueNode.range,"BLOCK_IN_FLOW",blockMsg)}else{const keyStart=props.end;const keyNode=key?composeNode2(ctx,key,props,onError):composeEmptyNode2(ctx,keyStart,start,null,props,onError);if(isBlock(key))onError(keyNode.range,"BLOCK_IN_FLOW",blockMsg);const valueProps=resolveProps(sep??[],{flow:fcName,indicator:"map-value-ind",next:value,offset:keyNode.range[2],onError,startOnNewline:false});if(valueProps.found){if(!isMap2&&!props.found&&ctx.options.strict){if(sep)for(const st of sep){if(st===valueProps.found)break;if(st.type==="newline"){onError(st,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}if(props.start<valueProps.found.offset-1024)onError(valueProps.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else if(value){if("source"in value&&value.source&&value.source[0]===":")onError(value,"MISSING_CHAR",`Missing space after : in ${fcName}`);else onError(valueProps.start,"MISSING_CHAR",`Missing , or : between ${fcName} items`)}const valueNode=value?composeNode2(ctx,value,valueProps,onError):valueProps.found?composeEmptyNode2(ctx,valueProps.end,sep,null,valueProps,onError):null;if(valueNode){if(isBlock(value))onError(valueNode.range,"BLOCK_IN_FLOW",blockMsg)}else if(valueProps.comment){if(keyNode.comment)keyNode.comment+="\n"+valueProps.comment;else keyNode.comment=valueProps.comment}const pair=new Pair(keyNode,valueNode);if(ctx.options.keepSourceTokens)pair.srcToken=collItem;if(isMap2){const map2=coll;if(mapIncludes(ctx,map2.items,keyNode))onError(keyStart,"DUPLICATE_KEY","Map keys must be unique");map2.items.push(pair)}else{const map2=new YAMLMap(ctx.schema);map2.flow=true;map2.items.push(pair);coll.items.push(map2)}offset=valueNode?valueNode.range[2]:valueProps.end}}const expectedEnd=isMap2?"}":"]";const[ce,...ee]=fc.end;let cePos=offset;if(ce&&ce.source===expectedEnd)cePos=ce.offset+ce.source.length;else{const name=fcName[0].toUpperCase()+fcName.substring(1);const msg=atRoot?`${name} must end with a ${expectedEnd}`:`${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;onError(offset,atRoot?"MISSING_CHAR":"BAD_INDENT",msg);if(ce&&ce.source.length!==1)ee.unshift(ce)}if(ee.length>0){const end=resolveEnd(ee,cePos,ctx.options.strict,onError);if(end.comment){if(coll.comment)coll.comment+="\n"+end.comment;else coll.comment=end.comment}coll.range=[fc.offset,cePos,end.offset]}else{coll.range=[fc.offset,cePos,cePos]}return coll}function resolveCollection(CN2,ctx,token,onError,tagName,tag){const coll=token.type==="block-map"?resolveBlockMap(CN2,ctx,token,onError,tag):token.type==="block-seq"?resolveBlockSeq(CN2,ctx,token,onError,tag):resolveFlowCollection(CN2,ctx,token,onError,tag);const Coll=coll.constructor;if(tagName==="!"||tagName===Coll.tagName){coll.tag=Coll.tagName;return coll}if(tagName)coll.tag=tagName;return coll}function composeCollection(CN2,ctx,token,tagToken,onError){const tagName=!tagToken?null:ctx.directives.tagName(tagToken.source,msg=>onError(tagToken,"TAG_RESOLVE_FAILED",msg));const expType=token.type==="block-map"?"map":token.type==="block-seq"?"seq":token.start.source==="{"?"map":"seq";if(!tagToken||!tagName||tagName==="!"||tagName===YAMLMap.tagName&&expType==="map"||tagName===YAMLSeq.tagName&&expType==="seq"||!expType){return resolveCollection(CN2,ctx,token,onError,tagName)}let tag=ctx.schema.tags.find(t=>t.tag===tagName&&t.collection===expType);if(!tag){const kt=ctx.schema.knownTags[tagName];if(kt&&kt.collection===expType){ctx.schema.tags.push(Object.assign({},kt,{default:false}));tag=kt}else{if(kt?.collection){onError(tagToken,"BAD_COLLECTION_TYPE",`${kt.tag} used for ${expType} collection, but expects ${kt.collection}`,true)}else{onError(tagToken,"TAG_RESOLVE_FAILED",`Unresolved tag: ${tagName}`,true)}return resolveCollection(CN2,ctx,token,onError,tagName)}}const coll=resolveCollection(CN2,ctx,token,onError,tagName,tag);const res=tag.resolve?.(coll,msg=>onError(tagToken,"TAG_RESOLVE_FAILED",msg),ctx.options)??coll;const node=isNode(res)?res:new Scalar(res);node.range=coll.range;node.tag=tagName;if(tag?.format)node.format=tag.format;return node}function resolveBlockScalar(scalar,strict,onError){const start=scalar.offset;const header=parseBlockScalarHeader(scalar,strict,onError);if(!header)return{value:"",type:null,comment:"",range:[start,start,start]};const type=header.mode===">"?Scalar.BLOCK_FOLDED:Scalar.BLOCK_LITERAL;const lines=scalar.source?splitLines(scalar.source):[];let chompStart=lines.length;for(let i=lines.length-1;i>=0;--i){const content=lines[i][1];if(content===""||content==="\r")chompStart=i;else break}if(chompStart===0){const value2=header.chomp==="+"&&lines.length>0?"\n".repeat(Math.max(1,lines.length-1)):"";let end2=start+header.length;if(scalar.source)end2+=scalar.source.length;return{value:value2,type,comment:header.comment,range:[start,end2,end2]}}let trimIndent=scalar.indent+header.indent;let offset=scalar.offset+header.length;let contentStart=0;for(let i=0;i<chompStart;++i){const[indent,content]=lines[i];if(content===""||content==="\r"){if(header.indent===0&&indent.length>trimIndent)trimIndent=indent.length}else{if(indent.length<trimIndent){const message="Block scalars with more-indented leading empty lines must use an explicit indentation indicator";onError(offset+indent.length,"MISSING_CHAR",message)}if(header.indent===0)trimIndent=indent.length;contentStart=i;break}offset+=indent.length+content.length+1}for(let i=lines.length-1;i>=chompStart;--i){if(lines[i][0].length>trimIndent)chompStart=i+1}let value="";let sep="";let prevMoreIndented=false;for(let i=0;i<contentStart;++i)value+=lines[i][0].slice(trimIndent)+"\n";for(let i=contentStart;i<chompStart;++i){let[indent,content]=lines[i];offset+=indent.length+content.length+1;const crlf=content[content.length-1]==="\r";if(crlf)content=content.slice(0,-1);if(content&&indent.length<trimIndent){const src=header.indent?"explicit indentation indicator":"first line";const message=`Block scalar lines must not be less indented than their ${src}`;onError(offset-content.length-(crlf?2:1),"BAD_INDENT",message);indent=""}if(type===Scalar.BLOCK_LITERAL){value+=sep+indent.slice(trimIndent)+content;sep="\n"}else if(indent.length>trimIndent||content[0]==="	"){if(sep===" ")sep="\n";else if(!prevMoreIndented&&sep==="\n")sep="\n\n";value+=sep+indent.slice(trimIndent)+content;sep="\n";prevMoreIndented=true}else if(content===""){if(sep==="\n")value+="\n";else sep="\n"}else{value+=sep+content;sep=" ";prevMoreIndented=false}}switch(header.chomp){case"-":break;case"+":for(let i=chompStart;i<lines.length;++i)value+="\n"+lines[i][0].slice(trimIndent);if(value[value.length-1]!=="\n")value+="\n";break;default:value+="\n"}const end=start+header.length+scalar.source.length;return{value,type,comment:header.comment,range:[start,end,end]}}function parseBlockScalarHeader({offset,props},strict,onError){if(props[0].type!=="block-scalar-header"){onError(props[0],"IMPOSSIBLE","Block scalar header not found");return null}const{source}=props[0];const mode=source[0];let indent=0;let chomp="";let error=-1;for(let i=1;i<source.length;++i){const ch=source[i];if(!chomp&&(ch==="-"||ch==="+"))chomp=ch;else{const n=Number(ch);if(!indent&&n)indent=n;else if(error===-1)error=offset+i}}if(error!==-1)onError(error,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${source}`);let hasSpace=false;let comment="";let length=source.length;for(let i=1;i<props.length;++i){const token=props[i];switch(token.type){case"space":hasSpace=true;case"newline":length+=token.source.length;break;case"comment":if(strict&&!hasSpace){const message="Comments must be separated from other tokens by white space characters";onError(token,"MISSING_CHAR",message)}length+=token.source.length;comment=token.source.substring(1);break;case"error":onError(token,"UNEXPECTED_TOKEN",token.message);length+=token.source.length;break;default:{const message=`Unexpected token in block scalar header: ${token.type}`;onError(token,"UNEXPECTED_TOKEN",message);const ts=token.source;if(ts&&typeof ts==="string")length+=ts.length}}}return{mode,indent,chomp,comment,length}}function splitLines(source){const split=source.split(/\n( *)/);const first=split[0];const m=first.match(/^( *)/);const line0=m?.[1]?[m[1],first.slice(m[1].length)]:["",first];const lines=[line0];for(let i=1;i<split.length;i+=2)lines.push([split[i],split[i+1]]);return lines}function resolveFlowScalar(scalar,strict,onError){const{offset,type,source,end}=scalar;let _type;let value;const _onError=(rel,code,msg)=>onError(offset+rel,code,msg);switch(type){case"scalar":_type=Scalar.PLAIN;value=plainValue(source,_onError);break;case"single-quoted-scalar":_type=Scalar.QUOTE_SINGLE;value=singleQuotedValue(source,_onError);break;case"double-quoted-scalar":_type=Scalar.QUOTE_DOUBLE;value=doubleQuotedValue(source,_onError);break;default:onError(scalar,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${type}`);return{value:"",type:null,comment:"",range:[offset,offset+source.length,offset+source.length]}}const valueEnd=offset+source.length;const re=resolveEnd(end,valueEnd,strict,onError);return{value,type:_type,comment:re.comment,range:[offset,valueEnd,re.offset]}}function plainValue(source,onError){let badChar="";switch(source[0]){case"	":badChar="a tab character";break;case",":badChar="flow indicator character ,";break;case"%":badChar="directive indicator character %";break;case"|":case">":{badChar=`block scalar indicator ${source[0]}`;break}case"@":case"`":{badChar=`reserved character ${source[0]}`;break}}if(badChar)onError(0,"BAD_SCALAR_START",`Plain value cannot start with ${badChar}`);return foldLines(source)}function singleQuotedValue(source,onError){if(source[source.length-1]!=="'"||source.length===1)onError(source.length,"MISSING_CHAR","Missing closing 'quote");return foldLines(source.slice(1,-1)).replace(/''/g,"'")}function foldLines(source){let first,line;try{first=new RegExp("(.*?)(?<![ 	])[ 	]*\r?\n","sy");line=new RegExp("[ 	]*(.*?)(?:(?<![ 	])[ 	]*)?\r?\n","sy")}catch(_){first=/(.*?)[ \t]*\r?\n/sy;line=/[ \t]*(.*?)[ \t]*\r?\n/sy}let match=first.exec(source);if(!match)return source;let res=match[1];let sep=" ";let pos=first.lastIndex;line.lastIndex=pos;while(match=line.exec(source)){if(match[1]===""){if(sep==="\n")res+=sep;else sep="\n"}else{res+=sep+match[1];sep=" "}pos=line.lastIndex}const last=/[ \t]*(.*)/sy;last.lastIndex=pos;match=last.exec(source);return res+sep+(match?.[1]??"")}function doubleQuotedValue(source,onError){let res="";for(let i=1;i<source.length-1;++i){const ch=source[i];if(ch==="\r"&&source[i+1]==="\n")continue;if(ch==="\n"){const{fold,offset}=foldNewline(source,i);res+=fold;i=offset}else if(ch==="\\"){let next=source[++i];const cc=escapeCodes[next];if(cc)res+=cc;else if(next==="\n"){next=source[i+1];while(next===" "||next==="	")next=source[++i+1]}else if(next==="\r"&&source[i+1]==="\n"){next=source[++i+1];while(next===" "||next==="	")next=source[++i+1]}else if(next==="x"||next==="u"||next==="U"){const length={x:2,u:4,U:8}[next];res+=parseCharCode(source,i+1,length,onError);i+=length}else{const raw=source.substr(i-1,2);onError(i-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${raw}`);res+=raw}}else if(ch===" "||ch==="	"){const wsStart=i;let next=source[i+1];while(next===" "||next==="	")next=source[++i+1];if(next!=="\n"&&!(next==="\r"&&source[i+2]==="\n"))res+=i>wsStart?source.slice(wsStart,i+1):ch}else{res+=ch}}if(source[source.length-1]!=='"'||source.length===1)onError(source.length,"MISSING_CHAR",'Missing closing "quote');return res}function foldNewline(source,offset){let fold="";let ch=source[offset+1];while(ch===" "||ch==="	"||ch==="\n"||ch==="\r"){if(ch==="\r"&&source[offset+2]!=="\n")break;if(ch==="\n")fold+="\n";offset+=1;ch=source[offset+1]}if(!fold)fold=" ";return{fold,offset}}var escapeCodes={"0":"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:"\n",r:"\r",t:"	",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\","	":"	"};function parseCharCode(source,offset,length,onError){const cc=source.substr(offset,length);const ok=cc.length===length&&/^[0-9a-fA-F]+$/.test(cc);const code=ok?parseInt(cc,16):NaN;if(isNaN(code)){const raw=source.substr(offset-2,length+2);onError(offset-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${raw}`);return raw}return String.fromCodePoint(code)}function composeScalar(ctx,token,tagToken,onError){const{value,type,comment,range}=token.type==="block-scalar"?resolveBlockScalar(token,ctx.options.strict,onError):resolveFlowScalar(token,ctx.options.strict,onError);const tagName=tagToken?ctx.directives.tagName(tagToken.source,msg=>onError(tagToken,"TAG_RESOLVE_FAILED",msg)):null;const tag=tagToken&&tagName?findScalarTagByName(ctx.schema,value,tagName,tagToken,onError):token.type==="scalar"?findScalarTagByTest(ctx,value,token,onError):ctx.schema[SCALAR];let scalar;try{const res=tag.resolve(value,msg=>onError(tagToken??token,"TAG_RESOLVE_FAILED",msg),ctx.options);scalar=isScalar(res)?res:new Scalar(res)}catch(error){const msg=error instanceof Error?error.message:String(error);onError(tagToken??token,"TAG_RESOLVE_FAILED",msg);scalar=new Scalar(value)}scalar.range=range;scalar.source=value;if(type)scalar.type=type;if(tagName)scalar.tag=tagName;if(tag.format)scalar.format=tag.format;if(comment)scalar.comment=comment;return scalar}function findScalarTagByName(schema4,value,tagName,tagToken,onError){if(tagName==="!")return schema4[SCALAR];const matchWithTest=[];for(const tag of schema4.tags){if(!tag.collection&&tag.tag===tagName){if(tag.default&&tag.test)matchWithTest.push(tag);else return tag}}for(const tag of matchWithTest)if(tag.test?.test(value))return tag;const kt=schema4.knownTags[tagName];if(kt&&!kt.collection){schema4.tags.push(Object.assign({},kt,{default:false,test:void 0}));return kt}onError(tagToken,"TAG_RESOLVE_FAILED",`Unresolved tag: ${tagName}`,tagName!=="tag:yaml.org,2002:str");return schema4[SCALAR]}function findScalarTagByTest({directives,schema:schema4},value,token,onError){const tag=schema4.tags.find(tag2=>tag2.default&&tag2.test?.test(value))||schema4[SCALAR];if(schema4.compat){const compat=schema4.compat.find(tag2=>tag2.default&&tag2.test?.test(value))??schema4[SCALAR];if(tag.tag!==compat.tag){const ts=directives.tagString(tag.tag);const cs=directives.tagString(compat.tag);const msg=`Value may be parsed as either ${ts} or ${cs}`;onError(token,"TAG_RESOLVE_FAILED",msg,true)}}return tag}function emptyScalarPosition(offset,before,pos){if(before){if(pos===null)pos=before.length;for(let i=pos-1;i>=0;--i){let st=before[i];switch(st.type){case"space":case"comment":case"newline":offset-=st.source.length;continue}st=before[++i];while(st?.type==="space"){offset+=st.source.length;st=before[++i]}break}}return offset}var CN={composeNode,composeEmptyNode};function composeNode(ctx,token,props,onError){const{spaceBefore,comment,anchor,tag}=props;let node;let isSrcToken=true;switch(token.type){case"alias":node=composeAlias(ctx,token,onError);if(anchor||tag)onError(token,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":node=composeScalar(ctx,token,tag,onError);if(anchor)node.anchor=anchor.source.substring(1);break;case"block-map":case"block-seq":case"flow-collection":node=composeCollection(CN,ctx,token,tag,onError);if(anchor)node.anchor=anchor.source.substring(1);break;default:{const message=token.type==="error"?token.message:`Unsupported token (type: ${token.type})`;onError(token,"UNEXPECTED_TOKEN",message);node=composeEmptyNode(ctx,token.offset,void 0,null,props,onError);isSrcToken=false}}if(anchor&&node.anchor==="")onError(anchor,"BAD_ALIAS","Anchor cannot be an empty string");if(spaceBefore)node.spaceBefore=true;if(comment){if(token.type==="scalar"&&token.source==="")node.comment=comment;else node.commentBefore=comment}if(ctx.options.keepSourceTokens&&isSrcToken)node.srcToken=token;return node}function composeEmptyNode(ctx,offset,before,pos,{spaceBefore,comment,anchor,tag,end},onError){const token={type:"scalar",offset:emptyScalarPosition(offset,before,pos),indent:-1,source:""};const node=composeScalar(ctx,token,tag,onError);if(anchor){node.anchor=anchor.source.substring(1);if(node.anchor==="")onError(anchor,"BAD_ALIAS","Anchor cannot be an empty string")}if(spaceBefore)node.spaceBefore=true;if(comment){node.comment=comment;node.range[2]=end}return node}function composeAlias({options},{offset,source,end},onError){const alias=new Alias(source.substring(1));if(alias.source==="")onError(offset,"BAD_ALIAS","Alias cannot be an empty string");if(alias.source.endsWith(":"))onError(offset+source.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",true);const valueEnd=offset+source.length;const re=resolveEnd(end,valueEnd,options.strict,onError);alias.range=[offset,valueEnd,re.offset];if(re.comment)alias.comment=re.comment;return alias}function composeDoc(options,directives,{offset,start,value,end},onError){const opts=Object.assign({_directives:directives},options);const doc=new Document(void 0,opts);const ctx={atRoot:true,directives:doc.directives,options:doc.options,schema:doc.schema};const props=resolveProps(start,{indicator:"doc-start",next:value??end?.[0],offset,onError,startOnNewline:true});if(props.found){doc.directives.docStart=true;if(value&&(value.type==="block-map"||value.type==="block-seq")&&!props.hasNewline)onError(props.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")}doc.contents=value?composeNode(ctx,value,props,onError):composeEmptyNode(ctx,props.end,start,null,props,onError);const contentEnd=doc.contents.range[2];const re=resolveEnd(end,contentEnd,false,onError);if(re.comment)doc.comment=re.comment;doc.range=[offset,contentEnd,re.offset];return doc}function getErrorPos(src){if(typeof src==="number")return[src,src+1];if(Array.isArray(src))return src.length===2?src:[src[0],src[1]];const{offset,source}=src;return[offset,offset+(typeof source==="string"?source.length:1)]}function parsePrelude(prelude){let comment="";let atComment=false;let afterEmptyLine=false;for(let i=0;i<prelude.length;++i){const source=prelude[i];switch(source[0]){case"#":comment+=(comment===""?"":afterEmptyLine?"\n\n":"\n")+(source.substring(1)||" ");atComment=true;afterEmptyLine=false;break;case"%":if(prelude[i+1]?.[0]!=="#")i+=1;atComment=false;break;default:if(!atComment)afterEmptyLine=true;atComment=false}}return{comment,afterEmptyLine}}var Composer=class{constructor(options={}){this.doc=null;this.atDirectives=false;this.prelude=[];this.errors=[];this.warnings=[];this.onError=(source,code,message,warning)=>{const pos=getErrorPos(source);if(warning)this.warnings.push(new YAMLWarning(pos,code,message));else this.errors.push(new YAMLParseError(pos,code,message))};this.directives=new Directives({version:options.version||"1.2"});this.options=options}decorate(doc,afterDoc){const{comment,afterEmptyLine}=parsePrelude(this.prelude);if(comment){const dc=doc.contents;if(afterDoc){doc.comment=doc.comment?`${doc.comment}
${comment}`:comment}else if(afterEmptyLine||doc.directives.docStart||!dc){doc.commentBefore=comment}else if(isCollection(dc)&&!dc.flow&&dc.items.length>0){let it=dc.items[0];if(isPair(it))it=it.key;const cb=it.commentBefore;it.commentBefore=cb?`${comment}
${cb}`:comment}else{const cb=dc.commentBefore;dc.commentBefore=cb?`${comment}
${cb}`:comment}}if(afterDoc){Array.prototype.push.apply(doc.errors,this.errors);Array.prototype.push.apply(doc.warnings,this.warnings)}else{doc.errors=this.errors;doc.warnings=this.warnings}this.prelude=[];this.errors=[];this.warnings=[]}streamInfo(){return{comment:parsePrelude(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(tokens,forceDoc=false,endOffset=-1){for(const token of tokens)yield*this.next(token);yield*this.end(forceDoc,endOffset)}*next(token){switch(token.type){case"directive":this.directives.add(token.source,(offset,message,warning)=>{const pos=getErrorPos(token);pos[0]+=offset;this.onError(pos,"BAD_DIRECTIVE",message,warning)});this.prelude.push(token.source);this.atDirectives=true;break;case"document":{const doc=composeDoc(this.options,this.directives,token,this.onError);if(this.atDirectives&&!doc.directives.docStart)this.onError(token,"MISSING_CHAR","Missing directives-end/doc-start indicator line");this.decorate(doc,false);if(this.doc)yield this.doc;this.doc=doc;this.atDirectives=false;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(token.source);break;case"error":{const msg=token.source?`${token.message}: ${JSON.stringify(token.source)}`:token.message;const error=new YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",msg);if(this.atDirectives||!this.doc)this.errors.push(error);else this.doc.errors.push(error);break}case"doc-end":{if(!this.doc){const msg="Unexpected doc-end without preceding document";this.errors.push(new YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",msg));break}this.doc.directives.docEnd=true;const end=resolveEnd(token.end,token.offset+token.source.length,this.doc.options.strict,this.onError);this.decorate(this.doc,true);if(end.comment){const dc=this.doc.comment;this.doc.comment=dc?`${dc}
${end.comment}`:end.comment}this.doc.range[2]=end.offset;break}default:this.errors.push(new YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",`Unsupported token ${token.type}`))}}*end(forceDoc=false,endOffset=-1){if(this.doc){this.decorate(this.doc,true);yield this.doc;this.doc=null}else if(forceDoc){const opts=Object.assign({_directives:this.directives},this.options);const doc=new Document(void 0,opts);if(this.atDirectives)this.onError(endOffset,"MISSING_CHAR","Missing directives-end indicator line");doc.range=[0,endOffset,endOffset];this.decorate(doc,false);yield doc}}};var BREAK2=Symbol("break visit");var SKIP2=Symbol("skip children");var REMOVE2=Symbol("remove item");function visit2(cst,visitor){if("type"in cst&&cst.type==="document")cst={start:cst.start,value:cst.value};_visit(Object.freeze([]),cst,visitor)}visit2.BREAK=BREAK2;visit2.SKIP=SKIP2;visit2.REMOVE=REMOVE2;visit2.itemAtPath=(cst,path)=>{let item=cst;for(const[field,index]of path){const tok=item?.[field];if(tok&&"items"in tok){item=tok.items[index]}else return void 0}return item};visit2.parentCollection=(cst,path)=>{const parent=visit2.itemAtPath(cst,path.slice(0,-1));const field=path[path.length-1][0];const coll=parent?.[field];if(coll&&"items"in coll)return coll;throw new Error("Parent collection not found")};function _visit(path,item,visitor){let ctrl=visitor(item,path);if(typeof ctrl==="symbol")return ctrl;for(const field of["key","value"]){const token=item[field];if(token&&"items"in token){for(let i=0;i<token.items.length;++i){const ci=_visit(Object.freeze(path.concat([[field,i]])),token.items[i],visitor);if(typeof ci==="number")i=ci-1;else if(ci===BREAK2)return BREAK2;else if(ci===REMOVE2){token.items.splice(i,1);i-=1}}if(typeof ctrl==="function"&&field==="key")ctrl=ctrl(item,path)}}return typeof ctrl==="function"?ctrl(item,path):ctrl}var BOM="\uFEFF";var DOCUMENT="";var FLOW_END="";var SCALAR2="";function tokenType(source){switch(source){case BOM:return"byte-order-mark";case DOCUMENT:return"doc-mode";case FLOW_END:return"flow-error-end";case SCALAR2:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case"\n":case"\r\n":return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(source[0]){case" ":case"	":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function isEmpty(ch){switch(ch){case void 0:case" ":case"\n":case"\r":case"	":return true;default:return false}}var hexDigits="0123456789ABCDEFabcdef".split("");var tagChars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split("");var invalidFlowScalarChars=",[]{}".split("");var invalidAnchorChars=" ,[]{}\n\r	".split("");var isNotAnchorChar=ch=>!ch||invalidAnchorChars.includes(ch);var Lexer=class{constructor(){this.atEnd=false;this.blockScalarIndent=-1;this.blockScalarKeep=false;this.buffer="";this.flowKey=false;this.flowLevel=0;this.indentNext=0;this.indentValue=0;this.lineEndPos=null;this.next=null;this.pos=0}*lex(source,incomplete=false){if(source){this.buffer=this.buffer?this.buffer+source:source;this.lineEndPos=null}this.atEnd=!incomplete;let next=this.next??"stream";while(next&&(incomplete||this.hasChars(1)))next=yield*this.parseNext(next)}atLineEnd(){let i=this.pos;let ch=this.buffer[i];while(ch===" "||ch==="	")ch=this.buffer[++i];if(!ch||ch==="#"||ch==="\n")return true;if(ch==="\r")return this.buffer[i+1]==="\n";return false}charAt(n){return this.buffer[this.pos+n]}continueScalar(offset){let ch=this.buffer[offset];if(this.indentNext>0){let indent=0;while(ch===" ")ch=this.buffer[++indent+offset];if(ch==="\r"){const next=this.buffer[indent+offset+1];if(next==="\n"||!next&&!this.atEnd)return offset+indent+1}return ch==="\n"||indent>=this.indentNext||!ch&&!this.atEnd?offset+indent:-1}if(ch==="-"||ch==="."){const dt=this.buffer.substr(offset,3);if((dt==="---"||dt==="...")&&isEmpty(this.buffer[offset+3]))return-1}return offset}getLine(){let end=this.lineEndPos;if(typeof end!=="number"||end!==-1&&end<this.pos){end=this.buffer.indexOf("\n",this.pos);this.lineEndPos=end}if(end===-1)return this.atEnd?this.buffer.substring(this.pos):null;if(this.buffer[end-1]==="\r")end-=1;return this.buffer.substring(this.pos,end)}hasChars(n){return this.pos+n<=this.buffer.length}setNext(state){this.buffer=this.buffer.substring(this.pos);this.pos=0;this.lineEndPos=null;this.next=state;return null}peek(n){return this.buffer.substr(this.pos,n)}*parseNext(next){switch(next){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let line=this.getLine();if(line===null)return this.setNext("stream");if(line[0]===BOM){yield*this.pushCount(1);line=line.substring(1)}if(line[0]==="%"){let dirEnd=line.length;const cs=line.indexOf("#");if(cs!==-1){const ch=line[cs-1];if(ch===" "||ch==="	")dirEnd=cs-1}while(true){const ch=line[dirEnd-1];if(ch===" "||ch==="	")dirEnd-=1;else break}const n=(yield*this.pushCount(dirEnd))+(yield*this.pushSpaces(true));yield*this.pushCount(line.length-n);this.pushNewline();return"stream"}if(this.atLineEnd()){const sp=yield*this.pushSpaces(true);yield*this.pushCount(line.length-sp);yield*this.pushNewline();return"stream"}yield DOCUMENT;return yield*this.parseLineStart()}*parseLineStart(){const ch=this.charAt(0);if(!ch&&!this.atEnd)return this.setNext("line-start");if(ch==="-"||ch==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");const s=this.peek(3);if(s==="---"&&isEmpty(this.charAt(3))){yield*this.pushCount(3);this.indentValue=0;this.indentNext=0;return"doc"}else if(s==="..."&&isEmpty(this.charAt(3))){yield*this.pushCount(3);return"stream"}}this.indentValue=yield*this.pushSpaces(false);if(this.indentNext>this.indentValue&&!isEmpty(this.charAt(1)))this.indentNext=this.indentValue;return yield*this.parseBlockStart()}*parseBlockStart(){const[ch0,ch1]=this.peek(2);if(!ch1&&!this.atEnd)return this.setNext("block-start");if((ch0==="-"||ch0==="?"||ch0===":")&&isEmpty(ch1)){const n=(yield*this.pushCount(1))+(yield*this.pushSpaces(true));this.indentNext=this.indentValue+1;this.indentValue+=n;return yield*this.parseBlockStart()}return"doc"}*parseDocument(){yield*this.pushSpaces(true);const line=this.getLine();if(line===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(line[n]){case"#":yield*this.pushCount(line.length-n);case void 0:yield*this.pushNewline();return yield*this.parseLineStart();case"{":case"[":yield*this.pushCount(1);this.flowKey=false;this.flowLevel=1;return"flow";case"}":case"]":yield*this.pushCount(1);return"doc";case"*":yield*this.pushUntil(isNotAnchorChar);return"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":n+=yield*this.parseBlockScalarHeader();n+=yield*this.pushSpaces(true);yield*this.pushCount(line.length-n);yield*this.pushNewline();return yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let nl,sp;let indent=-1;do{nl=yield*this.pushNewline();if(nl>0){sp=yield*this.pushSpaces(false);this.indentValue=indent=sp}else{sp=0}sp+=yield*this.pushSpaces(true)}while(nl+sp>0);const line=this.getLine();if(line===null)return this.setNext("flow");if(indent!==-1&&indent<this.indentNext&&line[0]!=="#"||indent===0&&(line.startsWith("---")||line.startsWith("..."))&&isEmpty(line[3])){const atFlowEndMarker=indent===this.indentNext-1&&this.flowLevel===1&&(line[0]==="]"||line[0]==="}");if(!atFlowEndMarker){this.flowLevel=0;yield FLOW_END;return yield*this.parseLineStart()}}let n=0;while(line[n]===","){n+=yield*this.pushCount(1);n+=yield*this.pushSpaces(true);this.flowKey=false}n+=yield*this.pushIndicators();switch(line[n]){case void 0:return"flow";case"#":yield*this.pushCount(line.length-n);return"flow";case"{":case"[":yield*this.pushCount(1);this.flowKey=false;this.flowLevel+=1;return"flow";case"}":case"]":yield*this.pushCount(1);this.flowKey=true;this.flowLevel-=1;return this.flowLevel?"flow":"doc";case"*":yield*this.pushUntil(isNotAnchorChar);return"flow";case'"':case"'":this.flowKey=true;return yield*this.parseQuotedScalar();case":":{const next=this.charAt(1);if(this.flowKey||isEmpty(next)||next===","){this.flowKey=false;yield*this.pushCount(1);yield*this.pushSpaces(true);return"flow"}}default:this.flowKey=false;return yield*this.parsePlainScalar()}}*parseQuotedScalar(){const quote=this.charAt(0);let end=this.buffer.indexOf(quote,this.pos+1);if(quote==="'"){while(end!==-1&&this.buffer[end+1]==="'")end=this.buffer.indexOf("'",end+2)}else{while(end!==-1){let n=0;while(this.buffer[end-1-n]==="\\")n+=1;if(n%2===0)break;end=this.buffer.indexOf('"',end+1)}}const qb=this.buffer.substring(0,end);let nl=qb.indexOf("\n",this.pos);if(nl!==-1){while(nl!==-1){const cs=this.continueScalar(nl+1);if(cs===-1)break;nl=qb.indexOf("\n",cs)}if(nl!==-1){end=nl-(qb[nl-1]==="\r"?2:1)}}if(end===-1){if(!this.atEnd)return this.setNext("quoted-scalar");end=this.buffer.length}yield*this.pushToIndex(end+1,false);return this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1;this.blockScalarKeep=false;let i=this.pos;while(true){const ch=this.buffer[++i];if(ch==="+")this.blockScalarKeep=true;else if(ch>"0"&&ch<="9")this.blockScalarIndent=Number(ch)-1;else if(ch!=="-")break}return yield*this.pushUntil(ch=>isEmpty(ch)||ch==="#")}*parseBlockScalar(){let nl=this.pos-1;let indent=0;let ch;loop:for(let i=this.pos;ch=this.buffer[i];++i){switch(ch){case" ":indent+=1;break;case"\n":nl=i;indent=0;break;case"\r":{const next=this.buffer[i+1];if(!next&&!this.atEnd)return this.setNext("block-scalar");if(next==="\n")break}default:break loop}}if(!ch&&!this.atEnd)return this.setNext("block-scalar");if(indent>=this.indentNext){if(this.blockScalarIndent===-1)this.indentNext=indent;else this.indentNext+=this.blockScalarIndent;do{const cs=this.continueScalar(nl+1);if(cs===-1)break;nl=this.buffer.indexOf("\n",cs)}while(nl!==-1);if(nl===-1){if(!this.atEnd)return this.setNext("block-scalar");nl=this.buffer.length}}if(!this.blockScalarKeep){do{let i=nl-1;let ch2=this.buffer[i];if(ch2==="\r")ch2=this.buffer[--i];const lastChar=i;while(ch2===" "||ch2==="	")ch2=this.buffer[--i];if(ch2==="\n"&&i>=this.pos&&i+1+indent>lastChar)nl=i;else break}while(true)}yield SCALAR2;yield*this.pushToIndex(nl+1,true);return yield*this.parseLineStart()}*parsePlainScalar(){const inFlow=this.flowLevel>0;let end=this.pos-1;let i=this.pos-1;let ch;while(ch=this.buffer[++i]){if(ch===":"){const next=this.buffer[i+1];if(isEmpty(next)||inFlow&&next===",")break;end=i}else if(isEmpty(ch)){let next=this.buffer[i+1];if(ch==="\r"){if(next==="\n"){i+=1;ch="\n";next=this.buffer[i+1]}else end=i}if(next==="#"||inFlow&&invalidFlowScalarChars.includes(next))break;if(ch==="\n"){const cs=this.continueScalar(i+1);if(cs===-1)break;i=Math.max(i,cs-2)}}else{if(inFlow&&invalidFlowScalarChars.includes(ch))break;end=i}}if(!ch&&!this.atEnd)return this.setNext("plain-scalar");yield SCALAR2;yield*this.pushToIndex(end+1,true);return inFlow?"flow":"doc"}*pushCount(n){if(n>0){yield this.buffer.substr(this.pos,n);this.pos+=n;return n}return 0}*pushToIndex(i,allowEmpty){const s=this.buffer.slice(this.pos,i);if(s){yield s;this.pos+=s.length;return s.length}else if(allowEmpty)yield"";return 0}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*this.pushTag())+(yield*this.pushSpaces(true))+(yield*this.pushIndicators());case"&":return(yield*this.pushUntil(isNotAnchorChar))+(yield*this.pushSpaces(true))+(yield*this.pushIndicators());case"-":case"?":case":":{const inFlow=this.flowLevel>0;const ch1=this.charAt(1);if(isEmpty(ch1)||inFlow&&invalidFlowScalarChars.includes(ch1)){if(!inFlow)this.indentNext=this.indentValue+1;else if(this.flowKey)this.flowKey=false;return(yield*this.pushCount(1))+(yield*this.pushSpaces(true))+(yield*this.pushIndicators())}}}return 0}*pushTag(){if(this.charAt(1)==="<"){let i=this.pos+2;let ch=this.buffer[i];while(!isEmpty(ch)&&ch!==">")ch=this.buffer[++i];return yield*this.pushToIndex(ch===">"?i+1:i,false)}else{let i=this.pos+1;let ch=this.buffer[i];while(ch){if(tagChars.includes(ch))ch=this.buffer[++i];else if(ch==="%"&&hexDigits.includes(this.buffer[i+1])&&hexDigits.includes(this.buffer[i+2])){ch=this.buffer[i+=3]}else break}return yield*this.pushToIndex(i,false)}}*pushNewline(){const ch=this.buffer[this.pos];if(ch==="\n")return yield*this.pushCount(1);else if(ch==="\r"&&this.charAt(1)==="\n")return yield*this.pushCount(2);else return 0}*pushSpaces(allowTabs){let i=this.pos-1;let ch;do{ch=this.buffer[++i]}while(ch===" "||allowTabs&&ch==="	");const n=i-this.pos;if(n>0){yield this.buffer.substr(this.pos,n);this.pos=i}return n}*pushUntil(test){let i=this.pos;let ch=this.buffer[i];while(!test(ch))ch=this.buffer[++i];return yield*this.pushToIndex(i,false)}};var LineCounter=class{constructor(){this.lineStarts=[];this.addNewLine=offset=>this.lineStarts.push(offset);this.linePos=offset=>{let low=0;let high=this.lineStarts.length;while(low<high){const mid=low+high>>1;if(this.lineStarts[mid]<offset)low=mid+1;else high=mid}if(this.lineStarts[low]===offset)return{line:low+1,col:1};if(low===0)return{line:0,col:offset};const start=this.lineStarts[low-1];return{line:low,col:offset-start+1}}}};function includesToken(list,type){for(let i=0;i<list.length;++i)if(list[i].type===type)return true;return false}function findNonEmptyIndex(list){for(let i=0;i<list.length;++i){switch(list[i].type){case"space":case"comment":case"newline":break;default:return i}}return-1}function isFlowToken(token){switch(token?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return true;default:return false}}function getPrevProps(parent){switch(parent.type){case"document":return parent.start;case"block-map":{const it=parent.items[parent.items.length-1];return it.sep??it.start}case"block-seq":return parent.items[parent.items.length-1].start;default:return[]}}function getFirstKeyStartProps(prev){if(prev.length===0)return[];let i=prev.length;loop:while(--i>=0){switch(prev[i].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break loop}}while(prev[++i]?.type==="space"){}return prev.splice(i,prev.length)}function fixFlowSeqItems(fc){if(fc.start.type==="flow-seq-start"){for(const it of fc.items){if(it.sep&&!it.value&&!includesToken(it.start,"explicit-key-ind")&&!includesToken(it.sep,"map-value-ind")){if(it.key)it.value=it.key;delete it.key;if(isFlowToken(it.value)){if(it.value.end)Array.prototype.push.apply(it.value.end,it.sep);else it.value.end=it.sep}else Array.prototype.push.apply(it.start,it.sep);delete it.sep}}}}var Parser=class{constructor(onNewLine){this.atNewLine=true;this.atScalar=false;this.indent=0;this.offset=0;this.onKeyLine=false;this.stack=[];this.source="";this.type="";this.lexer=new Lexer;this.onNewLine=onNewLine}*parse(source,incomplete=false){if(this.onNewLine&&this.offset===0)this.onNewLine(0);for(const lexeme of this.lexer.lex(source,incomplete))yield*this.next(lexeme);if(!incomplete)yield*this.end()}*next(source){this.source=source;if(this.atScalar){this.atScalar=false;yield*this.step();this.offset+=source.length;return}const type=tokenType(source);if(!type){const message=`Not a YAML token: ${source}`;yield*this.pop({type:"error",offset:this.offset,message,source});this.offset+=source.length}else if(type==="scalar"){this.atNewLine=false;this.atScalar=true;this.type="scalar"}else{this.type=type;yield*this.step();switch(type){case"newline":this.atNewLine=true;this.indent=0;if(this.onNewLine)this.onNewLine(this.offset+source.length);break;case"space":if(this.atNewLine&&source[0]===" ")this.indent+=source.length;break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":if(this.atNewLine)this.indent+=source.length;break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=false}this.offset+=source.length}}*end(){while(this.stack.length>0)yield*this.pop()}get sourceToken(){const st={type:this.type,offset:this.offset,indent:this.indent,source:this.source};return st}*step(){const top=this.peek(1);if(this.type==="doc-end"&&(!top||top.type!=="doc-end")){while(this.stack.length>0)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!top)return yield*this.stream();switch(top.type){case"document":return yield*this.document(top);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(top);case"block-scalar":return yield*this.blockScalar(top);case"block-map":return yield*this.blockMap(top);case"block-seq":return yield*this.blockSequence(top);case"flow-collection":return yield*this.flowCollection(top);case"doc-end":return yield*this.documentEnd(top)}yield*this.pop()}peek(n){return this.stack[this.stack.length-n]}*pop(error){const token=error??this.stack.pop();if(!token){const message="Tried to pop an empty stack";yield{type:"error",offset:this.offset,source:"",message}}else if(this.stack.length===0){yield token}else{const top=this.peek(1);if(token.type==="block-scalar"){token.indent="indent"in top?top.indent:0}else if(token.type==="flow-collection"&&top.type==="document"){token.indent=0}if(token.type==="flow-collection")fixFlowSeqItems(token);switch(top.type){case"document":top.value=token;break;case"block-scalar":top.props.push(token);break;case"block-map":{const it=top.items[top.items.length-1];if(it.value){top.items.push({start:[],key:token,sep:[]});this.onKeyLine=true;return}else if(it.sep){it.value=token}else{Object.assign(it,{key:token,sep:[]});this.onKeyLine=!includesToken(it.start,"explicit-key-ind");return}break}case"block-seq":{const it=top.items[top.items.length-1];if(it.value)top.items.push({start:[],value:token});else it.value=token;break}case"flow-collection":{const it=top.items[top.items.length-1];if(!it||it.value)top.items.push({start:[],key:token,sep:[]});else if(it.sep)it.value=token;else Object.assign(it,{key:token,sep:[]});return}default:yield*this.pop();yield*this.pop(token)}if((top.type==="document"||top.type==="block-map"||top.type==="block-seq")&&(token.type==="block-map"||token.type==="block-seq")){const last=token.items[token.items.length-1];if(last&&!last.sep&&!last.value&&last.start.length>0&&findNonEmptyIndex(last.start)===-1&&(token.indent===0||last.start.every(st=>st.type!=="comment"||st.indent<token.indent))){if(top.type==="document")top.end=last.start;else top.items.push({start:last.start});token.items.splice(-1,1)}}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{const doc={type:"document",offset:this.offset,start:[]};if(this.type==="doc-start")doc.start.push(this.sourceToken);this.stack.push(doc);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(doc){if(doc.value)return yield*this.lineEnd(doc);switch(this.type){case"doc-start":{if(findNonEmptyIndex(doc.start)!==-1){yield*this.pop();yield*this.step()}else doc.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":doc.start.push(this.sourceToken);return}const bv=this.startBlockValue(doc);if(bv)this.stack.push(bv);else{yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}}*scalar(scalar){if(this.type==="map-value-ind"){const prev=getPrevProps(this.peek(2));const start=getFirstKeyStartProps(prev);let sep;if(scalar.end){sep=scalar.end;sep.push(this.sourceToken);delete scalar.end}else sep=[this.sourceToken];const map2={type:"block-map",offset:scalar.offset,indent:scalar.indent,items:[{start,key:scalar,sep}]};this.onKeyLine=true;this.stack[this.stack.length-1]=map2}else yield*this.lineEnd(scalar)}*blockScalar(scalar){switch(this.type){case"space":case"comment":case"newline":scalar.props.push(this.sourceToken);return;case"scalar":scalar.source=this.source;this.atNewLine=true;this.indent=0;if(this.onNewLine){let nl=this.source.indexOf("\n")+1;while(nl!==0){this.onNewLine(this.offset+nl);nl=this.source.indexOf("\n",nl)+1}}yield*this.pop();break;default:yield*this.pop();yield*this.step()}}*blockMap(map2){const it=map2.items[map2.items.length-1];switch(this.type){case"newline":this.onKeyLine=false;if(it.value){const end="end"in it.value?it.value.end:void 0;const last=Array.isArray(end)?end[end.length-1]:void 0;if(last?.type==="comment")end?.push(this.sourceToken);else map2.items.push({start:[this.sourceToken]})}else if(it.sep){it.sep.push(this.sourceToken)}else{it.start.push(this.sourceToken)}return;case"space":case"comment":if(it.value){map2.items.push({start:[this.sourceToken]})}else if(it.sep){it.sep.push(this.sourceToken)}else{if(this.atIndentedComment(it.start,map2.indent)){const prev=map2.items[map2.items.length-2];const end=prev?.value?.end;if(Array.isArray(end)){Array.prototype.push.apply(end,it.start);end.push(this.sourceToken);map2.items.pop();return}}it.start.push(this.sourceToken)}return}if(this.indent>=map2.indent){const atNextItem=!this.onKeyLine&&this.indent===map2.indent&&it.sep;let start=[];if(atNextItem&&it.sep&&!it.value){const nl=[];for(let i=0;i<it.sep.length;++i){const st=it.sep[i];switch(st.type){case"newline":nl.push(i);break;case"space":break;case"comment":if(st.indent>map2.indent)nl.length=0;break;default:nl.length=0}}if(nl.length>=2)start=it.sep.splice(nl[1])}switch(this.type){case"anchor":case"tag":if(atNextItem||it.value){start.push(this.sourceToken);map2.items.push({start});this.onKeyLine=true}else if(it.sep){it.sep.push(this.sourceToken)}else{it.start.push(this.sourceToken)}return;case"explicit-key-ind":if(!it.sep&&!includesToken(it.start,"explicit-key-ind")){it.start.push(this.sourceToken)}else if(atNextItem||it.value){start.push(this.sourceToken);map2.items.push({start})}else{this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]})}this.onKeyLine=true;return;case"map-value-ind":if(includesToken(it.start,"explicit-key-ind")){if(!it.sep){if(includesToken(it.start,"newline")){Object.assign(it,{key:null,sep:[this.sourceToken]})}else{const start2=getFirstKeyStartProps(it.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key:null,sep:[this.sourceToken]}]})}}else if(it.value){map2.items.push({start:[],key:null,sep:[this.sourceToken]})}else if(includesToken(it.sep,"map-value-ind")){this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]})}else if(isFlowToken(it.key)&&!includesToken(it.sep,"newline")){const start2=getFirstKeyStartProps(it.start);const key=it.key;const sep=it.sep;sep.push(this.sourceToken);delete it.key,delete it.sep;this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key,sep}]})}else if(start.length>0){it.sep=it.sep.concat(start,this.sourceToken)}else{it.sep.push(this.sourceToken)}}else{if(!it.sep){Object.assign(it,{key:null,sep:[this.sourceToken]})}else if(it.value||atNextItem){map2.items.push({start,key:null,sep:[this.sourceToken]})}else if(includesToken(it.sep,"map-value-ind")){this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]})}else{it.sep.push(this.sourceToken)}}this.onKeyLine=true;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const fs=this.flowScalar(this.type);if(atNextItem||it.value){map2.items.push({start,key:fs,sep:[]});this.onKeyLine=true}else if(it.sep){this.stack.push(fs)}else{Object.assign(it,{key:fs,sep:[]});this.onKeyLine=true}return}default:{const bv=this.startBlockValue(map2);if(bv){if(atNextItem&&bv.type!=="block-seq"&&includesToken(it.start,"explicit-key-ind")){map2.items.push({start})}this.stack.push(bv);return}}}}yield*this.pop();yield*this.step()}*blockSequence(seq2){const it=seq2.items[seq2.items.length-1];switch(this.type){case"newline":if(it.value){const end="end"in it.value?it.value.end:void 0;const last=Array.isArray(end)?end[end.length-1]:void 0;if(last?.type==="comment")end?.push(this.sourceToken);else seq2.items.push({start:[this.sourceToken]})}else it.start.push(this.sourceToken);return;case"space":case"comment":if(it.value)seq2.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(it.start,seq2.indent)){const prev=seq2.items[seq2.items.length-2];const end=prev?.value?.end;if(Array.isArray(end)){Array.prototype.push.apply(end,it.start);end.push(this.sourceToken);seq2.items.pop();return}}it.start.push(this.sourceToken)}return;case"anchor":case"tag":if(it.value||this.indent<=seq2.indent)break;it.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==seq2.indent)break;if(it.value||includesToken(it.start,"seq-item-ind"))seq2.items.push({start:[this.sourceToken]});else it.start.push(this.sourceToken);return}if(this.indent>seq2.indent){const bv=this.startBlockValue(seq2);if(bv){this.stack.push(bv);return}}yield*this.pop();yield*this.step()}*flowCollection(fc){const it=fc.items[fc.items.length-1];if(this.type==="flow-error-end"){let top;do{yield*this.pop();top=this.peek(1)}while(top&&top.type==="flow-collection")}else if(fc.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":if(!it||it.sep)fc.items.push({start:[this.sourceToken]});else it.start.push(this.sourceToken);return;case"map-value-ind":if(!it||it.value)fc.items.push({start:[],key:null,sep:[this.sourceToken]});else if(it.sep)it.sep.push(this.sourceToken);else Object.assign(it,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":if(!it||it.value)fc.items.push({start:[this.sourceToken]});else if(it.sep)it.sep.push(this.sourceToken);else it.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const fs=this.flowScalar(this.type);if(!it||it.value)fc.items.push({start:[],key:fs,sep:[]});else if(it.sep)this.stack.push(fs);else Object.assign(it,{key:fs,sep:[]});return}case"flow-map-end":case"flow-seq-end":fc.end.push(this.sourceToken);return}const bv=this.startBlockValue(fc);if(bv)this.stack.push(bv);else{yield*this.pop();yield*this.step()}}else{const parent=this.peek(2);if(parent.type==="block-map"&&(this.type==="map-value-ind"&&parent.indent===fc.indent||this.type==="newline"&&!parent.items[parent.items.length-1].sep)){yield*this.pop();yield*this.step()}else if(this.type==="map-value-ind"&&parent.type!=="flow-collection"){const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);fixFlowSeqItems(fc);const sep=fc.end.splice(1,fc.end.length);sep.push(this.sourceToken);const map2={type:"block-map",offset:fc.offset,indent:fc.indent,items:[{start,key:fc,sep}]};this.onKeyLine=true;this.stack[this.stack.length-1]=map2}else{yield*this.lineEnd(fc)}}}flowScalar(type){if(this.onNewLine){let nl=this.source.indexOf("\n")+1;while(nl!==0){this.onNewLine(this.offset+nl);nl=this.source.indexOf("\n",nl)+1}}return{type,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(parent){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=true;const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);start.push(this.sourceToken);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start}]}}case"map-value-ind":{this.onKeyLine=true;const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(start,indent){if(this.type!=="comment")return false;if(this.indent<=indent)return false;return start.every(st=>st.type==="newline"||st.type==="space")}*documentEnd(docEnd){if(this.type!=="doc-mode"){if(docEnd.end)docEnd.end.push(this.sourceToken);else docEnd.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(token){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop();yield*this.step();break;case"newline":this.onKeyLine=false;case"space":case"comment":default:if(token.end)token.end.push(this.sourceToken);else token.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}};function parseOptions(options){const prettyErrors=options.prettyErrors!==false;const lineCounter=options.lineCounter||prettyErrors&&new LineCounter||null;return{lineCounter,prettyErrors}}function parseDocument(source,options={}){const{lineCounter,prettyErrors}=parseOptions(options);const parser=new Parser(lineCounter?.addNewLine);const composer=new Composer(options);let doc=null;for(const _doc of composer.compose(parser.parse(source),true,source.length)){if(!doc)doc=_doc;else if(doc.options.logLevel!=="silent"){doc.errors.push(new YAMLParseError(_doc.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}}if(prettyErrors&&lineCounter){doc.errors.forEach(prettifyError(source,lineCounter));doc.warnings.forEach(prettifyError(source,lineCounter))}return doc}function parse(src,reviver,options){let _reviver=void 0;if(typeof reviver==="function"){_reviver=reviver}else if(options===void 0&&reviver&&typeof reviver==="object"){options=reviver}const doc=parseDocument(src,options);if(!doc)return null;doc.warnings.forEach(warning=>warn(doc.options.logLevel,warning));if(doc.errors.length>0){if(doc.options.logLevel!=="silent")throw doc.errors[0];else doc.errors=[]}return doc.toJS(Object.assign({reviver:_reviver},options))}function stringify3(value,replacer,options){let _replacer=null;if(typeof replacer==="function"||Array.isArray(replacer)){_replacer=replacer}else if(options===void 0&&replacer){options=replacer}if(typeof options==="string")options=options.length;if(typeof options==="number"){const indent=Math.round(options);options=indent<1?void 0:indent>8?{indent:8}:{indent}}if(value===void 0){const{keepUndefined}=options??replacer??{};if(!keepUndefined)return void 0}return new Document(value,_replacer,options).toString(options)}globalThis.YAML={parse,stringify:stringify3};
}()
